Spring-SpringIoC-JdbcTemplate

Spring-SpringIoC-JdbcTemplate

在JDBC的学习中,我们学会了Druid连接池的使用,并且会用软编码和硬编码的形式来实现

笔记中的 JDBC -> JDBC连接池

硬编码

硬编码形式的Druid连接池也是通过new DruidDataSource()的方式来实例化对象的

我们同样可以交给Spring接管Druid连接池的实例化

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="url" value="jdbc:mysql://127.0.0.1/studb"/>
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="username" value="root"/>
    <property name="password" value="Zhuwenxue2002"/>
</bean>

这样就完成了对连接池四大件的配置

JdbcTemplate功能也需要实例化使用,并且在实例化之后需要设置连接池作为参数,那么我们同样可以由Spring接管

JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource); // 参数为Druid连接池
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

软编码

软编码就是将jdbc四大件写在配置文件中,由程序来读取

jdbc.url=jdbc:mysql://localhost:3306/studb
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=Zhuwenxue2002
<context:property-placeholder location="classpath:jdbc.properties"/>

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="url" value="${jdbc.url}"/>
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

使用context:property-placeholder标签,读取properties配置文件,使用${}的方式直接获取值


jdbc-template

jdbcTemplate是Spring提供的对jdbc的简化操作,类似于我们自己编写的BaseDao,其中也有增删改的方法

  • update
  • queryForObject
  • query
public void testJdbcTemplate() {
    // 创建IoC容器
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-01.xml");
    // 从容器中获取JdbcTemplate组件
    JdbcTemplate jdbcTemplate = context.getBean(JdbcTemplate.class);

    // 插入一条数据
    String sql = "insert into students (id,name,gender,age,class) values(default,?,?,?,?);";
    int rows = jdbcTemplate.update(sql, "xiaobai", "男", 20, "高中一班");
    System.out.println(rows);

    // 查找数据
    sql = "select id,name,gender,age,class classes from students;";
    List<Student> students = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Student.class));
    for (Student student : students) {
        System.out.println(student);
    }
}

与我们手写的BaseDao不同,jdbcTemplate的查询映射过程使用了RowMapper接口

RowMapper 列名和属性名的映射器接口,需要自己写实现类,可以通过lambda表达式写一个内部类实现接口重写方法

BeanPropertyRowMapper为RowMapper的实现类,通过列名反射属性名,然后映射

这个实现类的使用,就很像BaseDao中直接传入.class类对象作为参数了