JdbcTemplate(概念和准备)

1:什么是JdbcTemplate什么是JDBC

2:(1)引入相关jar包
image.png
(2):在spring配置文件中配置数据库的连接池

  1. <!-- 直接通过druidjar配置数据库链接 -->
  2. <bean id="dataSource"
  3. class="com.alibaba.druid.pool.DruidDataSource">
  4. <!-- 直接配置 *********************************************************** -->
  5. <property name="driverClassName"
  6. value="com.mysql.jdbc.Driver"></property>
  7. <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
  8. <property name="username" value="root"></property>
  9. <property name="password" value="root"></property>
  10. </bean>

(3):配置jdbctemplate对象,注入datasource

  1. <!-- 创建JdbcTemplate对象 -->
  2. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  3. <!-- 用set注入dataSource数据源 -->
  4. <property name="dataSource" ref="dataSource"></property>
  5. </bean>

image.png
(4):创建service类,创建dao类,在dao注入jdbctemplate对象
配置文件

  1. <!-- 开启组件扫描 -->
  2. <context:component-scan base-package="com.junjay.spring5"></context:component-scan>

创建对象

  1. package com.junjay.spring5.service;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Service;
  4. import com.junjay.spring5.dao.BookDao;
  5. @Service
  6. public class BookService {
  7. // 注入dao接口
  8. @Autowired
  9. private BookDao bookDao;
  10. }
  1. package com.junjay.spring5.dao;
  2. public interface BookDao {
  3. }
  1. package com.junjay.spring5.dao;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.jdbc.core.JdbcTemplate;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public class BookDaoImpl implements BookDao {
  7. // 注入jdbctemplate
  8. @Autowired
  9. private JdbcTemplate jdbcTemplate;
  10. }

JdbcTemplate(操作数据库)

1:添加插入数据库

1:对应数据库表创建实体类
image.png

  1. package com.junjay.spring5.entity;
  2. public class Book {
  3. private String userId;
  4. private String username;
  5. private String state;
  6. public String getUserId() {
  7. return userId;
  8. }
  9. public void setUserId(String userId) {
  10. this.userId = userId;
  11. }
  12. public String getUsername() {
  13. return username;
  14. }
  15. public void setUsername(String username) {
  16. this.username = username;
  17. }
  18. public String getState() {
  19. return state;
  20. }
  21. public void setState(String state) {
  22. this.state = state;
  23. }
  24. }

2:编写service 和 dao
(1):在dao进行数据库添加操作

  1. @Service
  2. public class BookService {
  3. // 注入dao接口
  4. @Autowired
  5. private BookDao bookDao;
  6. public void addBook(Book book) {
  7. bookDao.addBook(book);
  8. }
  9. }
  1. public interface BookDao {
  2. void addBook(Book book);
  3. }

(2):调用jdbctemplate对象里面的update方法实现添加
image.png
有俩个参数:t1-sql语句,t2-可变参数,设置sql语句

  1. @Override
  2. public void addBook(Book book) {
  3. // 创建插入sql语句
  4. String sql=" INSERT INTO test.book (USER_ID, USERNAME, STATE) VALUES (?,?,?) ";
  5. // 调用实现方法
  6. Object [] obj = {book.getUserId(),book.getUsername(),book.getState()};
  7. int i = jdbcTemplate.update(sql, obj);
  8. //int i = jdbcTemplate.update(sql, book.getUserId(),book.getUsername(),book.getState());
  9. // 返回值i为影响执行了几行
  10. System.out.println(i);
  11. }

测试

  1. @Test
  2. public void testJdabBook() {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
  4. BookService bookService = context.getBean("bookService",BookService.class);
  5. Book book = new Book("1","java-JdbcTemplate","1");
  6. bookService.addBook(book);
  7. }

image.png
查看数据库是否插入改数据
image.png

2:修改、删除数据库内容

1:修改
(1):在service和dao中添加修改方法

  1. @Service
  2. public class BookService {
  3. // 注入dao接口
  4. @Autowired
  5. private BookDao bookDao;
  6. public void addBook(Book book) {
  7. bookDao.addBook(book);
  8. }
  9. public void updateBook(Book book) {
  10. bookDao.updateBook(book);
  11. }
  12. }
  1. public interface BookDao {
  2. void addBook(Book book);
  3. void updateBook(Book book);
  4. }
  1. package com.junjay.spring5.dao;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.jdbc.core.JdbcTemplate;
  4. import org.springframework.stereotype.Repository;
  5. import com.junjay.spring5.entity.Book;
  6. @Repository
  7. public class BookDaoImpl implements BookDao {
  8. // 注入jdbctemplate
  9. @Autowired
  10. private JdbcTemplate jdbcTemplate;
  11. @Override
  12. public void addBook(Book book) {
  13. // 创建插入sql语句
  14. String sql = " INSERT INTO test.book (USER_ID, USERNAME, STATE) VALUES (?,?,?) ";
  15. // 调用实现方法
  16. Object[] obj = { book.getUserId(), book.getUsername(), book.getState() };
  17. int i = jdbcTemplate.update(sql, obj);
  18. // int i = jdbcTemplate.update(sql,
  19. // book.getUserId(),book.getUsername(),book.getState());
  20. // 返回值i为影响执行了几行
  21. System.out.println("影响行数:" + i);
  22. }
  23. @Override
  24. public void updateBook(Book book) {
  25. // 创建插入sql语句
  26. String sql = " UPDATE test.book SET USERNAME=?, STATE=? WHERE (USER_ID=?) ";
  27. // 调用实现方法,根据id修改内容
  28. Object[] obj = { book.getUsername(), book.getState(), book.getUserId() };
  29. int i = jdbcTemplate.update(sql, obj);
  30. // int i = jdbcTemplate.update(sql,
  31. // book.getUserId(),book.getUsername(),book.getState());
  32. // 返回值i为影响执行了几行
  33. System.out.println("影响行数:" + i);
  34. }
  35. }

测试:

  1. @Test
  2. public void testJdabUpdateBook() {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
  4. BookService bookService = context.getBean("bookService",BookService.class);
  5. Book book = new Book("1","java-update","2");
  6. bookService.updateBook(book);
  7. }
  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1712076/1639920317692-c9426bba-6830-429d-80f4-38e342a0615f.png#clientId=u8b53bac6-b921-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=364&id=uabb99c86&margin=%5Bobject%20Object%5D&name=image.png&originHeight=364&originWidth=911&originalType=binary&ratio=1&rotation=0&showTitle=false&size=42122&status=done&style=none&taskId=u9cb593be-18e8-4b50-85b9-ec20987bdde&title=&width=911)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1712076/1639920324872-1785435f-9cdd-456b-abc6-7a3262253657.png#clientId=u8b53bac6-b921-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=122&id=u524cc0d4&margin=%5Bobject%20Object%5D&name=image.png&originHeight=122&originWidth=359&originalType=binary&ratio=1&rotation=0&showTitle=false&size=7697&status=done&style=none&taskId=u8a90a9e7-0d03-42a5-91ad-036440125f9&title=&width=359)<br />2:删除
  1. public class BookService {
  2. // 注入dao接口
  3. @Autowired
  4. private BookDao bookDao;
  5. public void addBook(Book book) {
  6. bookDao.addBook(book);
  7. }
  8. public void updateBook(Book book) {
  9. bookDao.updateBook(book);
  10. }
  11. public void delBook(String id) {
  12. bookDao.delBook(id);
  13. }
  14. }
  1. public interface BookDao {
  2. void addBook(Book book);
  3. void updateBook(Book book);
  4. void delBook(String id);
  5. }
  1. @Override
  2. public void delBook(String id) {
  3. // 创建插入sql语句
  4. String sql = " DELETE FROM test.book WHERE (USER_ID=?) ";
  5. // 调用实现方法
  6. Object[] obj = { id };
  7. int i = jdbcTemplate.update(sql, obj);
  8. // int i = jdbcTemplate.update(sql,
  9. // book.getUserId(),book.getUsername(),book.getState());
  10. // 返回值i为影响执行了几行
  11. System.out.println("影响行数:" + i);
  12. }

测试:image.png
image.png

3:查询返回某个值,查询返回对象,查询返回List

(1):查询表中有多少条记录,返回某个值
image.png

  1. @Service
  2. public class BookService {
  3. // 注入dao接口
  4. @Autowired
  5. private BookDao bookDao;
  6. public void addBook(Book book) {
  7. bookDao.addBook(book);
  8. }
  9. public void updateBook(Book book) {
  10. bookDao.updateBook(book);
  11. }
  12. public void delBook(String id) {
  13. bookDao.delBook(id);
  14. }
  15. public int findCount() {
  16. return bookDao.findCount();
  17. }
  18. }
  1. @Repository
  2. public class BookDaoImpl implements BookDao {
  3. // 注入jdbctemplate
  4. @Autowired
  5. private JdbcTemplate jdbcTemplate;
  6. @Override
  7. public void addBook(Book book) {
  8. // 创建插入sql语句
  9. String sql = " INSERT INTO test.book (USER_ID, USERNAME, STATE) VALUES (?,?,?) ";
  10. // 调用实现方法
  11. Object[] obj = { book.getUserId(), book.getUsername(), book.getState() };
  12. int i = jdbcTemplate.update(sql, obj);
  13. // int i = jdbcTemplate.update(sql,
  14. // book.getUserId(),book.getUsername(),book.getState());
  15. // 返回值i为影响执行了几行
  16. System.out.println("影响行数:" + i);
  17. }
  18. @Override
  19. public void updateBook(Book book) {
  20. // 修改
  21. String sql = " UPDATE test.book SET USERNAME=?, STATE=? WHERE (USER_ID=?) ";
  22. // 调用实现方法
  23. Object[] obj = { book.getUsername(), book.getState(), book.getUserId() };
  24. int i = jdbcTemplate.update(sql, obj);
  25. // int i = jdbcTemplate.update(sql,
  26. // book.getUserId(),book.getUsername(),book.getState());
  27. // 返回值i为影响执行了几行
  28. System.out.println("影响行数:" + i);
  29. }
  30. @Override
  31. public void delBook(String id) {
  32. // 删除
  33. String sql = " DELETE FROM test.book WHERE (USER_ID=?) ";
  34. // 调用实现方法
  35. Object[] obj = { id };
  36. int i = jdbcTemplate.update(sql, obj);
  37. // int i = jdbcTemplate.update(sql,
  38. // book.getUserId(),book.getUsername(),book.getState());
  39. // 返回值i为影响执行了几行
  40. System.out.println("影响行数:" + i);
  41. }
  42. @Override
  43. public int findCount() {
  44. // 查询数据库表中有多少条数据
  45. String sql = " SELECT COUNT(1) FROM book ";
  46. // 调用实现方法
  47. int i = jdbcTemplate.queryForObject(sql, int.class);
  48. // 返回值i为 表中有几条数据
  49. System.out.println("book有:" + i + "条数据");
  50. return i;
  51. }
  52. }

测试:image.png

4:查询返回对象

(1):场景:查询图书详情内容,详情内容就是单个对象
image.png
image.png
BeanPropertyRowMapper 笔记
在使用 Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper(Book.class), id); 时候需要给book对象添加无参构造

  1. // BookService
  2. public Book findOne(String id) {
  3. return bookDao.findOne(id);
  4. }
  1. //BookDaoImpl
  2. @Override
  3. public Book findOne(String id) {
  4. String sql = " SELECT * FROM book where USERID = ? ";
  5. // 三个参数
  6. // 1:sql语句,
  7. // 2:rowmapper 是接口,返回不同类型数据,使用这个接口实现类完成对数据进行封装
  8. // 查询条件值
  9. Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
  10. return book;
  11. }

测试image.png

5:查询返回List对象

image.png

  1. //BookService
  2. public List<Book> findAll() {
  3. return bookDao.findAll();
  4. }
  1. // BookDaoImpl
  2. @Override
  3. public List<Book> findAll() {
  4. String sql = " SELECT * FROM book ";
  5. // 三个参数
  6. // 1:sql语句,
  7. // 2:rowmapper 是接口,返回不同类型数据,使用这个接口实现类完成对数据进行封装
  8. // 查询条件值
  9. List<Book> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Book.class));
  10. return query;
  11. }

测试image.png

JDBCTemplate(批量操作)

1:实现批量添加数据操作

image.png

  1. BookService
  2. public void bathAdd(List<Object[]> bathargs) {
  3. bookDao.bathAdd(bathargs);
  4. }
  1. BookDaoImpl
  2. @Override
  3. public void bathAdd(List<Object[]> bathargs) {
  4. String sql = " INSERT INTO test.book (USERID, USERNAME, STATE) VALUES (?,?,?) ";
  5. int[] is = jdbcTemplate.batchUpdate(sql,bathargs);
  6. System.out.println(Arrays.toString(is));
  7. }
  1. @Test
  2. public void testJdabBathAdd() {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
  4. BookService bookService = context.getBean("bookService",BookService.class);
  5. List<Object[]> bathargs =new ArrayList<>();
  6. Object[] a1 = {"13","张三","3"};
  7. Object[] a2 = {"14","李四","4"};
  8. Object[] a3 = {"15","王五","5"};
  9. bathargs.add(a1);
  10. bathargs.add(a2);
  11. bathargs.add(a3);
  12. bookService.bathAdd(bathargs);
  13. }

测试:
image.png

2:批量修改数据操作

  1. BookService
  2. public void bathUpdate(List<Object[]> bathargs) {
  3. bookDao.bathUpdate(bathargs);
  4. }
  1. BookDaoImpl
  2. @Override
  3. public void bathUpdate(List<Object[]> bathargs) {
  4. String sql = " UPDATE test.book SET USERNAME=?, STATE=? WHERE (USERID=?) ";
  5. // 与多条添加方法是调用同一个
  6. int[] is = jdbcTemplate.batchUpdate(sql,bathargs);
  7. System.out.println("修改条目:"+Arrays.toString(is));
  8. }
  1. @Test
  2. public void testJdabBathUpdate() {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
  4. BookService bookService = context.getBean("bookService",BookService.class);
  5. List<Object[]> bathargs =new ArrayList<>();
  6. Object[] a1 = {"张三1","5","13"};
  7. Object[] a2 = {"李四2","5","14"};
  8. Object[] a3 = {"王五3","6","15"};
  9. bathargs.add(a1);
  10. bathargs.add(a2);
  11. bathargs.add(a3);
  12. bookService.bathUpdate(bathargs);
  13. }

image.png

3:批量删除数据

  1. BookService
  2. public void bathDel(List<Object[]> bathargs) {
  3. bookDao.bathDel(bathargs);
  4. }
  1. BookDaoImpl
  2. @Override
  3. public void bathDel(List<Object[]> bathargs) {
  4. String sql = " DELETE FROM test.book WHERE (USERID=?) ";
  5. int[] is = jdbcTemplate.batchUpdate(sql,bathargs);
  6. System.out.println("删除条目:"+Arrays.toString(is));
  7. }
  1. @Test
  2. public void testJdabBathDel() {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
  4. BookService bookService = context.getBean("bookService",BookService.class);
  5. List<Object[]> bathargs =new ArrayList<>();
  6. Object[] a1 = {"13"};
  7. Object[] a2 = {"14"};
  8. bathargs.add(a1);
  9. bathargs.add(a2);
  10. bookService.bathDel(bathargs);
  11. }

image.png
GitHub:https://github.com/My-Jun/spring5_demo4/tree/master