• Spring之JDBC的连接与注解的使用


    JDBC连接

    1、配置连接池时,需要为连接数据库的连接设置四要素,可以直接写死,也可以使用properties文件引入

    2、在引入前要注意:

      首先应该引入命名空间context

        配置maven依赖

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>

      配置连接池

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--配置德鲁伊-->
        <bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource"
         init-method="init" destroy-method="close">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql:///mybatis"/>
            <property name="username" value="root"/>
            <property name="password" value="1234"/>
        </bean>
    </beans>

      使用占位符及引入配置文件后

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--引入属性配置文件,location:从什么位置加载属性配置文件
           默认情况下是从classes路径开始寻找
        -->
        <context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>
    
        <!--配置德鲁伊-->
        <bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource"
         init-method="init" destroy-method="close">
            <property name="driverClassName" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </bean>
    </beans>

      db.properties内容如下

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql:///mybatis
    username=root
    password=1234

    综合案例

    1、代码结构

      2、代码内容

    @Setter@Getter@AllArgsConstructor@NoArgsConstructor@ToString
    public class User {
        private String id;
        private String username;
        private String password;
        private String date;
        private String salary;
    }
    User
    @Controller
    public class UserController {
        @Autowired
        private IUserService userService;
    
        public void service(){
            String username="rose";
            String password="123";
            String id =null;
            String date="2018-10-10";
            String salary ="2000";
            User user = new User(id,username,password,date,salary);
            userService.save(user);
        }
    }
    UserController
    @Repository
    public class UserDaoImpl implements IUserDao {
        @Autowired
        private DataSource dataSource;
        public void save(User user) {
            try {
                Connection connection = dataSource.getConnection();
                String sql = "insert into user values(null,?,?,?,?)";
                PreparedStatement ps = connection.prepareStatement(sql);
                ps.setString(1,user.getUsername());
                ps.setString(2,user.getPassword());
                ps.setString(3,user.getDate());
                ps.setString(4,user.getSalary());
                ps.execute();
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    UserDaoImpl
    public interface IUserDao {
        void save(User user);
    }
    UserDao
    @Service
    public class UserServiceImpl implements IUserService {
        @Autowired
        private IUserDao userDao;
    
        public void save(User user) {
            userDao.save(user);
        }
    }
    UserService
    public interface IUserService {
        void save(User user);
    }
    IUserService
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class App {
    
        @Autowired
        private ApplicationContext context;
        @Test
        public void test(){
            UserController userController = context.getBean(UserController.class);
            userController.service();
        }
    }
    App测试类
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--引入属性配置文件,location:从什么位置加载属性配置文件
           默认情况下是从classes路径开始寻找
        -->
        <context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>
    
        <!--配置德鲁伊-->
        <bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource"
         init-method="init" destroy-method="close">
            <property name="driverClassName" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </bean>
    
        <bean id="userController" class="com.test.test_anli.controller.UserController">
            <property name="userService" ref="userService"/>
        </bean>
        <bean id="userService" class="com.test.test_anli.service.impl.UserServiceImpl">
            <property name="userDao" ref="userDao"/>
        </bean>
        <bean id="userDao" class="com.test.test_anli.dao.impl.UserDaoImpl">
            <property name="dataSource" ref="dateSource"/>
        </bean>
    </beans>
    applicationContext.xml

      这些代码已经使用了注解模式,可以删掉注解,将@autowired改为@setter,使用xml文件,使用注解模式时注意配置文件中应该

    配置注解解析器<context:component-scan base-package="com.test.test_anli"/>

    DI注解

    1、在Spring中使用注解来完成DI操作,我们称之为注解自动装配,存在两种用法.。

      一:使用Spring框架自身提供的注解:@Autowired

      二:使用JavaEE规范提供的注解:@Resource 功能完全一样

    2、Autowired和Qualifier标签:

      1.通过@Autowired标签可以让Spring自动的把对象需要的属性从Spring容器中找出来,并注入(设置)给该属性。

      2.第三方程序:Spring3.0之前,需要手动配置@Autowired注解解析程序; <context:annotation-config />

        在Spring3.0开始,Spring就会自动的加入针对@Autowired标签的解析程序。

      3.@Autowired标签贴在字段或者setter方法上。

      4.@Autowired可以同时为一个属性注入多个对象。

       public void setXxx(OtherBean1 other1,OtherBean2 other2) {}

      5.使用@Autowired标签可以注入Spring内置的重要对象,比如BeanFactory,ApplicationContext。              

       @RunWith(SpringJUnit4ClassRunner.class)

       @ContextConfiguration public class SpringTest { @Autowired private ApplicationContext ctx; }

      6.默认情况下@Autowired标签必须要能找到对应的对象,否则报错。不过,可使用required=false来避免该问题:

       @Autowired(required=false)

      7.@Autowired找bean的方式:

       (1)首先按照依赖对象的类型找,如果没有找到,默认会报错;如果找到一个匹配的对象,直接注入;

       (2)如果在Spring上下文中找到多个匹配(2个或者2个以上)的类型,再按照名字去找,如果没有匹配则报错;

       (3)可以通过使用@Qualifier("otherBean")标签来规定依赖对象按照bean的id+类型去找;

     3、@Resource标签:

      1、@Resource标签是JavaEE规范的标签;

      2、@Resource标签也可以作用于字段或者setter方法;

      3、也可以使用@Resource标签注入一些spring内置的重要对象,比如BeanFactory.ApplicationContext;

      4、@Resource必须要求有匹配的对象;

      5、Spring容器自动加载了@Resource的注解解析器

      6、@Resource标签找bean的方式:

       (1)首先按照名字去找,如果找到,就使用setter或者字段注入;

       (2)如果按照名字找不到,再按照类型去找,但如果找到多个类型匹配类型,报错;

       (3)可以直接使用name属性指定bean的名称;但是,如果指定的name,就只能按照name去找,如果找不到,就不会再按照类型去找;

    4、Resource和Autowired的区别

      相同点:

      1.都是贴在类中的属性上,表示从容器中找到需要的属性并自动给属性注入值。

      2.都可以贴在setter方法上

      3.都可以注入容器对象

      4.都使用<context:annotation-config/>的解析器

      不同点:

      1.@Autowired可以同时为两个属性注入值,@Resource一次只能为一个属性注入值

      2.@Resource要求容器中必须有匹配的对象;

        @Autowired默认要求容器中必须有匹配对象,但是可以通过"required=false"修改其默认设置。

      3.@Autowired首先首先通过类型寻找匹配对象,当有多个相同类型时再按照名字找;

       @Resource注解首先按照名字寻找匹配对象,没有找到时在按照类型来找。

    5、@Autowired和@setter方法的区别

      @setter注解:lombok包中的注解,只是为属性添加一个setter方法。

      @Autowired注解:spring框架的注解,表示将容器中的对象自动的注入被贴的属性中。

    IoC注解

    使用标签简化IoC:
    
    1.使用标签来完成IoC,就必须有IoC注解的解析器 
        使用context:component-scan来扫描spring需要管理的bean
        base-package就告诉spring,去哪些包及其子包里去扫描bean,如果有多个包需要被扫描;只需要用逗号隔开多个包即可
        <context:component-scan base-package="xxx.xxx.xxx" />
    
    2.标注Bean的注解:@Component
      默认情况,直接使用类的名字(首字母小写作为bean的名字)
      如果要修改bean的名称;直接使用value属性来重新定义bean的名称
      @Component("otherbean")
      public class OtherBean {}
    
    3.使用@Component的限制:
     对于没有源代码的类(框架内部的预定义类),只能用XML配置;比如DataSource就只能使用XML方式来做IOC.
    
    4.bean组件版型标签
      bean组件版型:
      @Service用于标注业务层组件、
      @Controller用于标注控制层组件(如struts中的action)、
      @Repository用于标注数据访问组件,即DAO组件。
      @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
    
    5.指定bean的作用域:@Scope("prototype")
    
    6.初始化和销毁方法
      @PostConstruct
      public void init() {
      相当于<bean init-method="init" />
    
      @PreDestroy
      public void destory() {
      相当于<bean destroy-method="destory" />
    
    7.选用xml还是注解:
      1)Annotation:使用方便,XML文件很小,但是,依赖关系又重新回到了代码当中;
      2)XML:使用稍微复杂,但是,代码很干净,代码不会很任何框架产生关系;XML安全;
      两种方式都必须掌握;

    javaConfig对配置类加注解

      @configuration:表示当前类是一个配置类

      @Bean:容器中创建出一个对象

      @PropertySource:寻找属性配置文件

      @ImportResource:寻找xml配置文件

      @import注解:引入另位外一个配置文件

      @ComponentScan:扫描组件

    @Configuration
    @PropertySource("classpath:db.properties")
    public class Config {
    
        @Value("${jdbc.driverClassName}")
        private String driverClassname;
        @Value("${jdbc.url}")
        private String url;
        @Value("${jdbc.username}")
        private String username;
        @Value("${jdbc.password}")
        private String password;
    
        @Bean
        public DataSource dataSource(){
            DruidDataSource data = new DruidDataSource();
            data.setDriverClassName(driverClassname);
            data.setUrl(url);
            data.setUsername(username);
            data.setPassword(password);
            return data;
        }
    }
  • 相关阅读:
    开发了那么多项目,你能自己手写个健壮的链表出来吗?【华为云技术分享】
    高性能Web动画和渲染原理系列(3)——transform和opacity为什么高性能【华为云技术分享】
    pringBoot-MongoDB 索引冲突分析及解决【华为云技术分享】
    成为高手前必懂的TCP干货【华为云技术分享】
    Python爬虫从入门到精通——基本库re的使用:正则表达式【华为云技术分享】
    【我的物联网成长记2】设备如何进行选型?【华为云技术分享】
    多云架构落地设计和实施方案【华为云技术分享】
    dom的节点操作
    节点访问关系
    封装class类--分割类名后
  • 原文地址:https://www.cnblogs.com/xfdhh/p/11483164.html
Copyright © 2020-2023  润新知