JdbcTemplate介绍
Spring配置JdbcTemplate
1、配置数据库连接池
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="jdbc:mysql:///user_db" />
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
</bean>
2、配置 JdbcTemplate 对象,注入 DataSource
<!-- JdbcTemplate 对象 -->
<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入 dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
3、开启注解扫描
<context:component-scan base-package="com.study.spring5"></context:component-scan>
4、service注入dao,dao注入JdbcTemplate
@Service
public class BookService {
//注入dao
@Autowired
private BookDao bookDao;
}
@Repository
public class BookDaoImpl implements BookDao{
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
}
操作数据库
增
//创建sql语句
String sql = "insert into t_book values(?,?,?)";
Object[] args = {book.getUserid(), book.getUsername(), book.getUstatus()};
int rows = jdbcTemplate.update(sql, args);
删
String sql = "delete from t_book where userid = ?";
int rows = jdbcTemplate.update(sql, userid);
改
String sql = "update t_book set username = ?,ustatus = ? where userid = ?";
Object[] args = {book.getUsername(), book.getUstatus(), book.getUserid()};
int rows = jdbcTemplate.update(sql, args);
查
查询结果:单个记录
queryForObject(String sql,Class<T>)
- 第一个参数:sql 语句
- 第二个参数:返回类型 Class
String sql = "select count(*) from t_book";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
查询结果:对象
queryForObject (String sql, RowMapper<T>rowMapper, rowMapper)
- 第一个参数:sql 语句
- 第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装
- 第三个参数:sql 语句值
String sql = "select * from t_book where userid = ?";
Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
查询结果:集合
String sql = "select * from t_book";
List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
JdbcTemplate概念
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
使用JdbcTemplate的准备工作
(1)引入相关 jar 包
(2)在 spring 配置文件配置数据库连接池
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="jdbc:mysql:///user_db" />
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
</bean>
(3)配置 JdbcTemplate 对象,注入 DataSource
<!-- JdbcTemplate 对象 -->
<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入 dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
(4)开启注解扫描
<!--开启注解扫描-->
<context:component-scan base-package="com.study.spring5"></context:component-scan>
(5)创建 service 类,创建 dao 类,在 dao 注入 jdbcTemplate 对象
BookDaoImpl
@Repository
public class BookDaoImpl implements BookDao{
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
}
BookService
@Service
public class BookService {
//注入dao
@Autowired
private BookDao bookDao;
}
操作数据库(增)
1、对应数据库创建实体类
提供对应的 get 和 set 方法
2、编写 service 和 dao
BookService
@Service
public class UserService {
//注入dao
@Autowired
private BookDao bookDao;
//添加方法
public void add(Book book) {
bookDao.add(book);
}
}
BookDaolmpl
@Repository
public class BookDaoImpl implements BookDao {
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
//添加的方法,在接口中规范方法,由实现类来完成具体功能
@Override
public void add(Book book) {
//创建sql语句
String sql = "insert into t_book values(?,?,?)";
//调用方法实现
Object[] args = {book.getUserid(), book.getUsername(), book.getUstatus()};
int rows = jdbcTemplate.update(sql, args);
System.out.println(rows);
}
}
3 测试
@Test
public void testJdbcTemplate() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService", UserService.class);
Book book = new Book();
book.setUserid(100);
book.setUsername("Java");
book.setUstatus("perfect");
userService.add(book);
}
操作数据库 (修改和删除)
修改
@Override
public void update(Book book) {
String sql = "update t_book set username = ?,ustatus = ? where userid = ?";
Object[] args = {book.getUsername(), book.getUstatus(), book.getUserid()};
int rows = jdbcTemplate.update(sql, args);
System.out.println("更新受影响的行数: " + rows);
}
删除
@Override
public void delete(Integer userid) {
String sql = "delete from t_book where userid = ?";
int rows = jdbcTemplate.update(sql, userid);
System.out.println("删除受影响的行数: " + rows);
}
操作数据库 (查询)
查询返回某个值
UserService
//查询表中记录数
public int findCount() {
return bookDao.selectCount();
}
queryForObject(String sql,Class<T>)
第一个参数:sql 语句
第二个参数:返回类型 Class
//查询表中记录数
@Override
public int selectCount() {
String sql = "select count(*) from t_book";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
return count;
}
测试
int count = userService.findCount();
System.out.println("查询表中记录数: " + count);
查询返回对象
1、第一个参数:sql 语句
2、第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装
3、第三个参数:sql 语句值
@Override
public Book findBookInfo(Integer id) {
String sql = "select * from t_book where userid = ?";
Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
return book;
}
查询返回集合
@Override
public List<Book> findAllBook() {
String sql = "select * from t_book";
List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
return bookList;
}
操作数据库 (批量添加)
//批量添加
@Override
public void batchAddBook(List<Object[]> batchArgs) {
//创建sql语句
String sql = "insert into t_book values(?,?,?)";
int[] rows = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println("受影响的行数: " + Arrays.toString(rows));
}
测试
//批量添加
List<Object[]> list = new ArrayList<>();
Object[] o1 = {"3", "tjava","a"};
Object[] o2 = {"4","c++","b"};
Object[] o3 = {"5","MySQL","c"};
list.add(o1);
list.add(o2);
list.add(o3);
userService.batchAdd(list);
操作数据库 (批量修改和删除)
修改
@Override
public void batchUpdateBook(List<Object[]> batchArgs) {
//创建sql
String sql = "update t_book set username = ?,ustatus = ? where userid = ?";
int[] rows = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println("受影响的行数: " + Arrays.toString(rows));
}
测试
List<Object[]> list = new ArrayList<>();
//数组的顺序要和 sql 的 中的 ? 匹配
Object[] o1 = {"java0000","a6","3"};
Object[] o2 = {"c++1111","b7","4"};
Object[] o3 = {"MySQL0101","c8","5"};
list.add(o1);
list.add(o2);
list.add(o3);
userService.batchUpdate(list);
删除
@Override
public void batchDeleteBook(List<Object[]> batchArgs) {
String sql = "delete from t_book where userid = ?";
int[] rows = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println("受影响的行数: " + Arrays.toString(rows));
}
测试
List<Object[]> list = new ArrayList<>();
Object[] o1 = {"3"};
Object[] o2 = {"4"};
Object[] o3 = {"5"};
list.add(o1);
list.add(o2);
list.add(o3);
userService.batchDelete(list);