Spring----02----依赖注入&&CRUD

1. spring依赖注入

依赖注入简单说就是对对象属性赋值,注入方式主要支持两种:

  • 构造方法注入
  • 调用set方法赋值

    1.1 构造方法注入

    java:声明各种构造方法
public class User {

    private Integer id;
    private String name;
    private Car car;

    public User(Integer id, String name, Car car) {
        System.out.println("public User(Integer id, String name, Car car)!");
        this.id = id;
        this.name = name;
        this.car = car;
    }

    public User() {
        System.out.println("public User()!");
    }

    public User(Integer id) {
        System.out.println("public User(Integer id)!");
        this.id = id;
    }

    public User(String name) {
        System.out.println("public User(String name)");
        this.name = name;
    }

    public User(Integer id, String name) {
        System.out.println("public User(Integer id, String name)!");
        this.id = id;
        this.name = name;
    }

    public User(String name,Integer id) {
        System.out.println("public User(String name,Integer id)!");
        this.id = id;
        this.name = name;
    }

    public User(String name,Long id) {
        System.out.println("public User(String name,Long id)!");
        this.id = id.intValue();
        this.name = name;
    }
}

xml:调用不同的构造方法,完成赋值

<!-- 调用空参构造方法创建User对象 -->
    <bean name="user1" class="com.leo.domain.User"></bean>

    <!-- 调用构造方法public User(Integer id)注入属性值 -->
    <bean name="user2" class="com.leo.domain.User">
        <!-- constructor-arg:使用该标签描述构造方法参数
                name:指定构造方法参数名
                value:将属性值传入参数
         -->
        <constructor-arg name="id" value="1"/>

    </bean>
    <!-- 调用构造方法public User(String name)注入属性值 -->
    <bean name="user3" class="com.leo.domain.User">
        <constructor-arg name="name" value="tom"/>
    </bean>

    <!-- public User(Integer id, String name) -->
    <bean name="user4" class="com.leo.domain.User">
        <!--
            index:指定参数在参数列表中的索引
         -->
        <constructor-arg name="id" value="2" index="0"/>
        <constructor-arg name="name" value="jerry"/>
    </bean>

    <!-- public User(String name,Integer id) -->
    <bean name="user5" class="com.leo.domain.User">
        <!--
           type:指定参数的具体java类型
        -->
        <constructor-arg name="id" value="2" type="java.lang.Integer"/>
        <constructor-arg name="name" value="jerry" index="0"/>
    </bean>

    <!--public User(String name,Long id)-->
    <bean name="user6" class="com.leo.domain.User">
        <constructor-arg name="id" value="2" type="java.lang.Long"/>
        <constructor-arg name="name" value="jerry" index="0"/>
    </bean>

    <bean name="user7" class="com.leo.domain.User">
        <constructor-arg name="id" value="2" />
        <constructor-arg name="name" value="leo" index="1"/>
        <constructor-arg name="car" ref="car" />
    </bean>

    <bean name="car" class="com.leo.domain.Car">
        <property name="name" value="劳斯莱斯.幻影"/>
        <property name="color" value="黑色"/>
    </bean>

1.2 Set方法注入

xml:

<!-- 调用空参构造方法创建User对象 -->
    <bean name="user1" class="com.leo.domain.User">
        <!-- property:属性赋值,调用set方法为属性赋值
                name:填写属性名
                value:填写属性值
         -->
        <property name="id" value="4"/>
        <property name="name" value="rose"/>
        <property name="car" ref="car1"/>
    </bean>

    <bean name="car1" class="com.leo.domain.Car">
        <property name="name" value="布加迪威航"/>
        <property name="color" value="粉色"/>
    </bean>

    <bean name="car2" class="com.leo.domain.Car">
        <property name="name" value="五菱红光"/>
        <property name="color" value="银白色"/>
    </bean>

1.3 集合&&数组类型属性注入

xml:

 <bean name="cb" class="com.leo.domain.CollectionBean">
        <!-- 如果只需要注入一个元素,可以使用value或ref属性直接为list赋值 -->
        <property name="list" >
            <!-- 指定list中的三个元素
                    calue是值类型
                    ref是对象类型
             -->
            <list>
                <value>tom</value>
                <value>jerry</value>
                <ref bean="car"></ref>
            </list>
        </property>

        <property name="set">
            <!-- 指定set中的三个元素
                    calue是值类型
                    ref是对象类型
             -->
            <set>
                <value>jack</value>
                <value>rose</value>
                <ref bean="car"></ref>
            </set>

        </property>

        <property name="array">
            <!-- 指定array中的三个元素
                    calue是值类型
                    ref是对象类型
             -->
            <array>
                <value>tom</value>
                <value>jerry</value>
                <value>jack</value>
                <value>rose</value>
                <ref bean="car"></ref>
            </array>
        </property>

        <property name="map">
            <map>
                <!-- 一个entry属性表示一个键值对
                        key:字符串类型健
                        key-ref:对象类型键
                        value:字符串类型值
                        value-ref:对象类型值
                -->
                <entry key="name" value="tom"/>
                <entry key="car" value-ref="car"/>
                <entry key-ref="car" value="tom"/>
                <entry key-ref="car" value-ref="car"/>
            </map>
        </property>

        <property name="properties">
            <props>
                <!-- 一个prop元素代表Properties中的一个键值对 
                        键值一定是字符串类型
                        key:填写键
                        prop标签体:填写值
                -->
                <prop key="driverClass">com.mysql.jdbc.Driver</prop>
                <prop key="userName">root</prop>
                <prop key="password">hanjuechen</prop>
            </props>

        </property>

    </bean>
    <bean name="car" class="com.leo.domain.Car">
        <property name="name" value="布加迪威航"/>
        <property name="color" value="粉色"/>
    </bean>

2. 配置文件模块化

     大型项目中,spring的xml配置文件中可能要配置非常多的对象,都写在一个配置文件中不易于管理,因此我们需要将配置分散到很多配置文件(模块化)中。
     在一个“主”配置文件中引入其他模块的配置文件:

    <!-- import:引入a.xml与b.xml中的配置(模块化)
            resource:引入配置文件的路径
     -->
    <import resource="a.xml"></import>
    <import resource="b.xml"></import>

3. 书写一个案例,完成对数据库的CURD

     要求:例子中所涉及到的对象都交给spring容器来管理

3.1 创建实体类

public class User {

    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3.2 创建库&表

在这里插入图片描述

3.3 导入依赖

父工程:

 <dependencies>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

子工程:

<dependencies>

        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
        <!-- dbutils -->
        <dependency>
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
            <version>1.7</version>
        </dependency>
        <!-- c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.5</version>
        </dependency>

    </dependencies>

3.4 分析依赖关系:

在这里插入图片描述

3.5 连接池配置:

        <!-- Spring容器管理连接池 -->
        <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC"/>
            <property name="driverClass" value="com.mysql.jdbc.Driver"/>
            <property name="user" value="root"/>
            <property name="password" value="hanjuechen"/>
        </bean>

3.6 QuerryRunner对象配置

<bean name="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
            <constructor-arg name="ds" ref="dataSource"/>
        </bean>

3.7 配置并书写Dao对象

Dao接口:

public interface UserDao {
    void save(User user);
}

Dao实现类:

public class UserDaoImpl implements UserDao{
    private QueryRunner queryRunner;

    public void save(User user) {
        //1 书写sql
        String sql = "isert into t_user values(?,?)";
        //2 执行sql
        try {
            queryRunner.update(sql, user.getName());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //创建set方法,用于set方法注入
    public void setQueryRunner(QueryRunner queryRunner) {
        this.queryRunner = queryRunner;
    }
}

xml配置:

<!-- UserDao对象 -->
        <bean name="userDao" class="com.leo.dao.UserDaoImpl">
            <property name="queryRunner" ref="queryRunner"/>
        </bean>

3.8 书写UserService对象

接口:

public interface UserService {
    //注册用户(保存)
    void regist(User user);
}

实现类:

public class UserServiceImpl implements UserService{
    private UserDao userDao;

    public void regist(User user) {
        userDao.save(user);
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

}

xml配置:

<!-- UserDervice对象 -->
        <bean name="userService" class="com.leo.service.UserServiceImpl">
            <property name="userDao" ref="userDao"></property>
        </bean>

3.9 测试

 @Test
    public void testSave(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) ac.getBean("userService");
        User u = new User();
        u.setId(1);
        u.setName("tom");
        userService.regist(u);

    }