6. JdbcTemplate (Jdbc模板)
6.1 概述
Ⅰ、什么是JdbcTemplate
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
Ⅱ、所需依赖的引入
Ⅲ、Spring配置文件中,Druid数据库连接池的配置
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="${prop.url}" />
<property name="username" value="${prop.username}" />
<property name="password" value="${prop.password}" />
<property name="driverClassName" value="${prop.driverClass}" />
</bean>
<!-- context:property-placeholder 用来引入properties文件
${} EL表达式,可以直接获取properties文件中的内容
prop.key 关键是为了防止命名冲突,其他使用完全相同
-->
prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql:///user_db
prop.username=root
prop.password=root
Ⅳ、配置JdbcTemplate对象,并且注入dataSource
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 需要注入dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
也可以使用构造器方式初始化dataSource
-->
Ⅴ、创建Service类与Dao类,在Dao中注入JdbcTemplate
@Service
public class BookService {
//注入 dao
@Autowired
private BookDao bookDao;
}
@Repository
public class BookDaoImpl implements BookDao {
//注入 JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
}
6.2 CRUD的实现
Ⅰ、添加——insert
// 添加的方法
@Override
public void add(Book book) {
//创建sql语句
String sql = "insert into t_book values(?,?,?)";
int update = jdbcTemplate.update(sql, book.getUserId(), book.getUsername(), book.getUstatus());
System.out.println(update); //影响行数
}
/*
具体实现:使用JdbcTemplate中的update
第一个参数:sql语句
后面参数:PreparedStatement占位符填充的参数
返回:影响行数
*/
Ⅱ、删除——delete
@Override
public void deleteBookById(String id) {
String sql = "delete from t_book where user_id=?";
jdbcTemplate.update(sql,id);
}
/*
同样使用update方法,根据参数的不同传入的可变参数数量也不同
*/
Ⅲ、修改——update
@Override
public void update(Book book) {
String sql = "update t_book set username=?,ustatus=? where user_id=?";
jdbcTemplate.update(sql,book.getUsername(),book.getUstatus(),book.getUserId());
}
Ⅳ、查询——select
单个值的查询
@Override
public int selectCount() {
String sql = "select count(*) from t_book";
return jdbcTemplate.queryForObject(sql,Integer.class);
}
/*
单个值的查询,比如查询总记录数
使用方法:queryForObject
第一个参数:sql语句
第二个参数:返回的类型
*/
单个对象的查询
@Override
public Book findOne(String id) {
String sql = "select user_id userId,username,ustatus from t_book where user_id=?";
return jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<Book>(Book.class),id);
}
/*
单个对象的查询
应用场景:在前端页面点击查看某个商品的详情页面,需要通过id查询商品的详细信息返回前端展示使用
使用方法:queryForObject
第一个参数:sql语句
第二个参数:RowMapping接口的实现类对象,使用BeanPropertyRowMapper<Book>(Book.class)
第三个参数:参数
*/
对象集合的查询
@Override
public List<Book> findAll() {
String sql = "select user_id userId,username,ustatus from t_book";
return jdbcTemplate.query(sql,new BeanPropertyRowMapper<Book>(Book.class));
}
/*
对象集合的查询
应用场景:分页查询
使用方法:query
第一个参数:sql语句
第二个参数:RowMapping接口的实现类对象,使用BeanPropertyRowMapper<Book>(Book.class)
第三个参数:参数
*/
6.3 批量CRUD的实现(Batch)
Ⅰ、批量添加
@Override
public void addBatch(List<Object[]> batchArgs) {
String sql = "insert into t_book values(?,?,?)";
jdbcTemplate.batchUpdate(sql,batchArgs);
}
/*
使用场景:大批量数据的插入
使用方法:batchUpdate
第一个参数:sql语句
第二个参数:List集合中包含Object对象数组,为参数
执行流程:从List中逐个取出数组参数,通过ps对象的setObject将参数注入到其中,调用ps.addBatch()方法,将sql语句添加到缓冲池中,可以设置缓冲池中累计的sql语句的个数。比如设置计数器,进行取模,每当为整数值时,将调用ps.execute()方法,一次性执行所有的缓冲池中的sql语句,但是需要注意的是缓冲池并不会自动清空,需要调用clear()语句。
*/
Ⅱ、批量删除
@Override
public void deleteBatch(List<Object[]> batchArgs) {
String sql = "delete from t_book where user_id=?";
jdbcTemplate.batchUpdate(sql,batchArgs);
}
Ⅲ、批量修改
@Override
public void updateBatch(List<Object[]> batchArgs) {
String sql = "update t_book set username=?,ustatus=? where user_id=?";
jdbcTemplate.batchUpdate(sql,batchArgs);
}