spring5之JdbcTemplate操作数据库
spring5学习目标:
spring5学习笔记
学习视频链接地址:https://www.bilibili.com/video/BV1Vf4y127N5p=26&spm_id_from=pageDriver
JdbcTemplate概念和准备:
1、什么是 JdbcTemplate
(1)Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
2、准备工作
(1)引入相关 jar 包
(2)编写db.properties文件
db.driverClassName=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql:///user_db?serverTimezone=GMT%2B8
db.username=root
db.password=8888
initialSize=5
maxActive=10
maxWait=3000
(3)在 spring 配置文件中加载db.properties文件,配置数据库连接池 (并开启注解扫描)
<!--开启注解扫描-->
<context:component-scan base-package="com.itheima.*"></context:component-scan>
<!--加载外部配置文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
<property name="driverClassName" value="${db.driverClassName}" />
</bean>
(4)配置 JdbcTemplate 对象,注入 DataSource
<!-- JdbcTemplate 对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入 dataSource -->
<property name="dataSource" ref="dataSource"></property>
</bean>
(5)设计数据库表并创建数据库实体类
实体类:
public class Books {
private int userid;
private String username;
private String ustatus;
public void setUserid(int userid) {
this.userid = userid;
}
public void setUsername(String username) {
this.username = username;
}
public void setUstatus(String ustatus) {
this.ustatus = ustatus;
}
public int getUserid() {
return userid;
}
public String getUsername() {
return username;
}
public String getUstatus() {
return ustatus;
}
@Override
public String toString() {
return "Book{" +
"userid=" + userid +
", username='" + username + '\'' +
", ustatus='" + ustatus + '\'' +
'}';
}
}
(6)创建service类和dao类,实现service层调用dao层操作数据库
service层:
@Service
public class BookService {
//注入BookDao属性
@Autowired
private BookDao bookDao;
public void add(Books books){
bookDao.addbook(books);
}
}
dao层:
public interface BookDao {
public void addbook(Books books);
}
在BookDaoImpl 实现类中编写具体的逻辑代码操作数据库
调用 JdbcTemplate 对象里面 update 方法实现添加操作
update(String sql,Object… args)
⚫ 有两个参数
⚫ 第一个参数:sql 语句
⚫ 第二个参数:可变参数,设置 sql 语句值
@Component
public class BookDaoImpl implements BookDao {
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
//往数据库添加一条数据的具体实现
public void addbook(Books books){
//1、创建sql语句
String sql = "insert into t_book values(?,?,?)";
//2、调用方法实现
//int update = jdbcTemplate.update(sql, books.getUserid(),books.getUsername(), books.getUstatus());
//同理可以将获取到的数据放到数组中,便于维护
Object[] args = {books.getUserid(), books.getUsername(), books.getUstatus()};
int update = jdbcTemplate.update(sql, args);
System.out.println(update);
}
}
(7)编写测试类
@Test
public void addbook(){
//1、加载spring配置文件
ApplicationContext Context = new ClassPathXmlApplicationContext("jdbc.xml");
//2、获取配置文件对象
BookService bookService = Context.getBean("bookService", BookService.class);
Books books = new Books();
books.setUserid(2);
books.setUsername("小白");
books.setUstatus("小黑");
bookService.add(books);
}
测试结果:成功添加一条数据
JdbcTemplate修改和删除:
1、编写service
//修改
public void update(Books books){
bookDao.updatebook(books);
}
//删除
public void delete(Books books){
bookDao.deletebook(books);
}
2、编写dao层
(1)添加修改和删除的方法到dao接口中
void updatebook(Books books);
void deletebook(Books books);
(2)在接口实现类中编写具体操作数据库的逻辑代码
//修改
@Override
public void updatebook(Books books) {
//1、创建sql语句
String sql = "update t_book set username=?,ustatus=? where userid=?";
//2、调用方法实现
Object[] args = {books.getUsername(), books.getUstatus(),books.getUserid()};
int update = jdbcTemplate.update(sql, args);
System.out.println(update);
}
//删除
@Override
public void deletebook(Books books) {
//1、创建sql语句
String sql = "delete from t_book where userid = ?";
//2、调用方法实现
Object[] args = {books.getUserid()};
int update = jdbcTemplate.update(sql, args);
System.out.println(update);
}
3、测试
@Test
public void updatebook(){
//1、加载spring配置文件
ApplicationContext Context = new ClassPathXmlApplicationContext("jdbc.xml");
//2、获取配置文件对象
BookService bookService = Context.getBean("bookService", BookService.class);
Books books = new Books();
books.setUserid(3);
books.setUsername("小红");
books.setUstatus("小明");
bookService.update(books);
}
@Test
public void deletebook(){
//1、加载spring配置文件
ApplicationContext Context = new ClassPathXmlApplicationContext("jdbc.xml");
//2、获取配置文件对象
BookService bookService = Context.getBean("bookService", BookService.class);
Books books = new Books();
books.setUserid(3);
bookService.delete(books);
}
JdbcTemplate查询
1、查询表里面有多少条记录,返回记录的条数
(1)使用 JdbcTemplate的方法查询并返回数据库记录的条数
(2) queryForObject(String sql,Class requiredType)
⚫ 有两个参数
⚫ 第一个参数:sql 语句
⚫ 第二个参数:返回类型 Class
swrvice层:
//查询数据库表记录条数
public int count(){
return bookDao.countbook();
}
dao接口:
int countbook();
dao实现类:
@Override
public int countbook() {
//1、创建sql语句
String sql = "select count(*) from t_book";
//2、调用方法实现
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
return count;
}
测试:
@Override
public int countbook() {
//1、创建sql语句
String sql = "select count(*) from t_book";
//2、调用方法实现
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
return count;
}
2、JdbcTemplate 实现查询返回对象
(1)queryForObject(String sql,RowMapper rowMapper, Object… args)
⚫ 有三个参数
⚫ 第一个参数:sql 语句
⚫ 第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成 数据封装
⚫ 第三个参数:sql 语句值
service层:
//根据id查询对象
public Books findone(String id){
return bookDao.findonebook(id);
}
dao接口:
Books findonebook(String id);
dao实现类:
@Override
public Books findonebook(String id) {
//1、创建sql语句
String sql = "select * from t_book where userid = ?";
//2、调用方法实现
Books books = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Books>(Books.class), id);
return books;
}
测试:
@Test
public void findonebook(){
//1、加载spring配置文件
ApplicationContext Context = new ClassPathXmlApplicationContext("jdbc.xml");
//2、获取配置文件对象
BookService bookService = Context.getBean("bookService", BookService.class);
Books findone = bookService.findone("1");
System.out.println(findone);
}
3、调用 JdbcTemplate 方法实现查询返回集合
(1)query(String sql,RowMapper rowMapper, Object… args)
⚫ 有三个参数
⚫ 第一个参数:sql 语句
⚫ 第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成 数据封装
⚫ 第三个参数:sql 语句
service层:
//查询数据库list集合
public List<Books> findall(){
return bookDao.findallbook();
}
dao接口:
List<Books> findallbook();
dao实现类:
@Override
public List<Books> findallbook() {
//1、创建sql语句
String sql = "select * from t_book";
//2、调用方法实现
List<Books> booksList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Books>(Books.class));
return booksList;
}
测试:
@Test
public void findallbook(){
//1、加载spring配置文件
ApplicationContext Context = new ClassPathXmlApplicationContext("jdbc.xml");
//2、获取配置文件对象
BookService bookService = Context.getBean("bookService", BookService.class);
List<Books> findall = bookService.findall();
System.out.println(findall);
}
JdbcTemplate批量操作
1、JdbcTemplate 实现批量添加操作
batchUpdate(String sql,List<Object[]> batchArgs)
⚫ 有两个参数
⚫ 第一个参数:sql 语句
⚫ 第二个参数:List 集合,添加多条记录数据
service层:
//批量添加
public void batchAdd(List<Object[]> batchArgs){
bookDao.batchAddbook(batchArgs);
}
dao接口:
void batchAddbook(List<Object[]> batchArgs);
dao实现类:
@Override
public void batchAddbook(List<Object[]> batchArgs) {
String sql = "insert into t_book values(?,?,?)";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
测试:
@Test
public void batchAddbook(){
//1、加载spring配置文件
ApplicationContext Context = new ClassPathXmlApplicationContext("jdbc.xml");
//2、获取配置文件对象
BookService bookService = Context.getBean("bookService", BookService.class);
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"3","a","aa"};
Object[] o2 = {"4","b","bb"};
Object[] o3 = {"5","c","cc"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
bookService.batchAdd(batchArgs);
2、JdbcTemplate 实现批量修改操作
service层:
//批量修改
public void batchUpdate(List<Object[]> batchArgs){
bookDao.batchUpdatebook(batchArgs);
}
dao接口:
void batchUpdatebook(List<Object[]> batchArgs);
dao实现类:
@Override
public void batchUpdatebook(List<Object[]> batchArgs) {
String sql = "update t_book set username=?,ustatus=? where userid=?";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
测试:
@Test
public void batchUpdatebook() {
//1、加载spring配置文件
ApplicationContext Context = new ClassPathXmlApplicationContext("jdbc.xml");
//2、获取配置文件对象
BookService bookService = Context.getBean("bookService", BookService.class);
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"java0909", "a3", "3"};
Object[] o2 = {"c++1010", "b4", "4"};
Object[] o3 = {"MySQL1111", "c5", "5"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3); // 调用方法实现批量修改
bookService.batchUpdate(batchArgs);
}
3、同理使用JdbcTemplate 实现批量删除操作