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类对象作为参数了