spring基础04-JDBC-Template
4 jdbc-Template (以操作book表为例)
4.1 概念和基础准备
4.1.1 什么是jdbcTemplate
- spring框架对jdbc进行了封装,使用 jdbctemplate很容易实现增删改查的操作
4.1.2 准备工作
-
引入相关的jar包
-
<artifactId>mysql-connector-java</artifactId> <artifactId>druid</artifactId> <artifactId>spring-jdbc</artifactId> <artifactId>spring-tx</artifactId> <artifactId>spring-orm</artifactId>
-
-
在spring 配置文件中配置数据库的连接池
-
详见2.3.10 外部属性文件
-
<!-- 使用外部属性文件--> <context:property-placeholder location="jdbc.properties"/> <bean id="druid" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${prop.driverClassName}"></property> <property name="url" value="${prop.url}"></property> <property name="username" value="${prop.username}"></property> <property name="password" value="com.mysql.jdbc.Driver"></property> </bean>
-
4.1.3 hello jdbcTemplate
-
配置jdbcTempplate对象,注入DataSource
-
<!--创建jdbcTemplate对象 JdbcTemplate这个类有个有参构造,需要提供数据源DataSource--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!--注入DataSource 但是有参构造里面调用了set方法,所以实际是用set方法--> <property name="dataSource" ref="druid"></property> </bean>
-
-
创建service类,创建dao接口和实现类,在dao注入jdbcTempplate对象
-
步骤:创建三个类,开启扫描,使用注解创建俩类对象,service类注入dao对象,dao实现类注入模板对象
-
配置文件:
-
<context:component-scan base-package="com.zhang"></context:component-scan>
-
service类
-
@Service//创建对象的注解之一 public class BookService { //注入dao @Autowired//根据属性类型自动装配 private BookDao bookDao; }
-
dao实现类BookImpl
-
@Repository////创建对象的注解之一 public class BookDaoImpl implements BookDao{ //注入jdbcTemplate @Autowired private JdbcTemplate jdbcTemplate; }
-
4.2 jdbcTemplate操作数据库
-
先说一下怎么写
-
多个具体的pojo/entry类,每个类对应着数据库的一个表,类属性对应字段
-
每个类对应一个dao实现类,所有dao可以抽象出来一个dao接口
- 在dao的实现类里面写具体的add,del操作
- dao实现类里面注入一个jdbctemplate对象,这个对象的类封装好了各种djbc操作,可以一键操作
- jdbc模板对象用xml注解创建就行,里面指定druid的datasource
-
每个类对应一个service层的类,service类,目的就是为了把数据层Dao和业务层Service分离,不让业务层直接操作数据库
- service类里面注入一个dao实现类的对象,调用这个对象的add方法等
-
-
jdbcTemplate中操作数据库的方法就一个update,增删改全是他,因为参数就是一个sql语言,具体干啥sql说的算
4.2.1 添加操作
-
对应数据库的表创建一个实体类
-
public class User { private String userId; private String username; private String ustatus; //getset }
-
编写service和dao
-
在dao中做add操作
- 调用jdbctemplate对象里面的update方法实现添加操作
- 俩参数:
- sql语句
- 可变参数:设置sql语句值,sql语句里面写?的值
-
@Repository//创建对象的注解之一 public class BookDaoImpl implements BookDao{ //注入jdbcTemplate @Autowired//根据属性类型自动装配 private JdbcTemplate jdbcTemplate; //add方法实现 @Override public void add(Book book) { //床架sql语句 String sql="insert into t_book values(?,?,?)"; //update方法实现数据库的curd int update= jdbcTemplate.update(sql,book.getBookId(),book.getBookName(),book.getBookstatus()); System.out.println(update); } }
-
bookservice类:
-
@Service//四种创建对象的注解之一 public class BookService { //注入dao @Autowired private BookDao bookDao; //add方法 public void addBook(Book book) { bookDao.add(book); } }
-
测试类
-
@Test public void test1(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-base.xml"); BookService bookService = context.getBean("bookService", BookService.class); bookService.addBook(new Book(1,"废铁是怎样练成的","还在")); }
-
4.2.2修改 and 删除
-
在service里面在创建俩方法,一个修改ipdate,一个删除delete,方法里面调用dao的方法
-
@Service//四种创建对象的注解之一 public class BookService { //注入dao @Autowired private BookDao bookDao; public void addBook(Book book) {bookDao.add(book);} //add方法 public void update(Book book){bookDao.updateBook(book);}//修改方法 public void delete(int id){ bookDao.deleteBook(id);}//删除方法 }
-
dao实现类BookDaoImpl
-
@Repository//创建对象的注解之一 public class BookDaoImpl implements BookDao{ @Autowired//根据属性类型自动装配 private JdbcTemplate jdbcTemplate; @Override public void add(Book book) {...}//add方法实现上面有 @Override public void updateBook(Book book) { //修改表属性 String sql="update t_book set book_name=?,book_status=? where book_id=?"; int update = jdbcTemplate.update(sql, book.getBookName(), book.getBookstatus(), book.getBookId()); } @Override public void deleteBook(int id) { //删除 String sql=" delete from t_book where book_id=?"; int update = jdbcTemplate.update(sql,id); } }
-
测试类
-
@Test public void test2(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-base.xml"); BookService bookService = context.getBean("bookService", BookService.class); bookService.update(new Book(3,"修改了书名","卖没了")); bookService.delete(2); }
4.2.3 查询返回(单个值)
a.使用方法 queryForObject()
查询单个值,使用的是jdbctemplate对象的queryForObject( )方法,源码参数:
- Parameters:
- sql - the SQL query to execute 待执行的sql语句
- requiredType - the type that the result object is expected to match sql返回值的结果类型
- Returns:
- the result object of the required type, or null in case of SQL NULL 返回值:object或者null
b.具体实现
-
service代码略
-
bookDaoImpl实现类代码:
-
//查询记录数 @Override public int selectCount() { String sql="select count(*) from t_book"; //queryForObject:参数1 sql语句,参数2 Class<T> sql语句返回的值的类型 return jdbcTemplate.queryForObject(sql,Integer.class); }
-
测试类:
-
@Test public void test2(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-base.xml"); BookService bookService = context.getBean("bookService", BookService.class); // bookService.update(new Book(3,"修改了书名","卖没了")); //bookService.delete(2); System.out.println(bookService.findCount()); }
4.2.4 查询返回对象
场景:查询图书详情
a.使用方法 queryForObject()
- 三个参数
- String sql :sql语句
- RowMapper
rowMapper: 这是个接口,返回不用类型数据,使用这个接口的实现类完成数据封装 - 实现类new BeanPropertyRowMapper
(Book.class)
- 实现类new BeanPropertyRowMapper
- Object[] :sql语句值
b.具体实现
-
service类的方法:
-
//查询一条记录 public Book getOneBookInfo(int id){ return bookDao.findBookInfo(id); }
-
bookDaoImpl实现类
-
@Override public Book findBookInfo(int id) { String sql="select * from t_book where book_id=?"; return jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<Book>(Book.class),id); }
-
测试类
-
@Test public void test3(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-base.xml"); BookService bookService = context.getBean("bookService",BookService.class); //bookService.addBook(new Book(2,"ICU抢救手册","上架")); Book book = bookService.getOneBookInfo(2); // System.out.println(book ); }
4.2.5 查询返回集合
返回的是多条记录
a.使用方法 query()
-
三个参数
-
String sql :sql语句
-
RowMapper
rowMapper: 这是个接口,返回不用类型数据,使用这个接口的实现类完成数据封装 - 实现类new BeanPropertyRowMapper
(Book.class)
- 实现类new BeanPropertyRowMapper
-
Object[] :sql语句值
-
-
返回值
- Returns: the result List, containing mapped object
b.具体实现
-
service类
-
//查询所有上架记录 book_status="上架" public List<Book> getStatusBook(String stauts){ return bookDao.finOnSaleBook(stauts); }
-
daoimpl类
-
@Override public List<Book> finOnSaleBook(String stauts) { String sql="select * from t_book where book_status=?"; return jdbcTemplate.query(sql,new BeanPropertyRowMapper<Book>(Book.class),stauts); }
-
测试类
-
@Test public void test5() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-base.xml"); BookService bookService = context.getBean("bookService", BookService.class); List<Book> bookList = bookService.getStatusBook("上架"); for (Book b : bookList) { System.out.println(b); } }
list结果里面有属性为null,0 的,应该是book类的属性值和数据库表的没对应上,毕竟他是用BeanPropertyRowMapper这个类自动转换的
4.2.6 批量添加操作
a. 添加多条记录batchUpdate方法
jdbcTemplate.batchUpdate(String sql,List<Object[ ]> batchArgs)
- 参数:
- sql语句
- List集合,待添加的数据集合
底层实现,就是for循环遍历List集合,对每个元素做sql语句的操作。。。蠢得冒泡
b. 具体实现
-
BookService类
-
//批量添加】 public void batchAdd(List<Object[]> batchArgs){ bookDao.batchAdd(batchArgs); }
-
Dao实现类
-
//批量添加 @Override public void batchAdd(List<Object[]> batchArgs) { String sql="insert into t_book values(?,?,?)"; int[] ints=jdbcTemplate.batchUpdate(sql,batchArgs); }
-
测试
-
@Test public void test6() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-base.xml"); BookService bookService = context.getBean("bookService", BookService.class); ArrayList<Object[]> books = new ArrayList<>(); books.add(new Object[]{4, "java入门到放弃", "上架"}); books.add(new Object[]{5,"下岗职工再就业","上架"}); bookService.batchAdd(books); }
4.2.7 批量修改
注意修改时sql语句中每个?和 参数batchArgs中元素的对应关系
-
测试类
-
@Test public void test7() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-base.xml"); BookService bookService = context.getBean("bookService", BookService.class); ArrayList<Object[]> books = new ArrayList<>(); books.add(new Object[]{"无货",4}); books.add(new Object[]{"下架",5}); bookService.batchUpdate(books); }
-
Dao实现类
-
//批量修改 @Override public void batchUpdate(List<Object[]> batchArgs) { String sql="update t_book set book_status=? where book_id=?"; jdbcTemplate.batchUpdate(sql,batchArgs); }
@Test
public void test7() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-base.xml");
BookService bookService = context.getBean("bookService", BookService.class);
ArrayList<Object[]> books = new ArrayList<>();
books.add(new Object[]{"java入门到放弃", "无货",4});
books.add(new Object[]{"下岗职工再就业","下架",5});
bookService.batchAdd(books);
}
4.2.7批量删除
真是懒得写了
-
测试类
-
@Test public void test7() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean-base.xml"); BookService bookService = context.getBean("bookService", BookService.class); ArrayList<Object[]> books = new ArrayList<>(); books.add(new Object[]{4}); bookService.batchDelete(books); }
本文来自博客园,作者:荧惑微光,转载请注明原文链接:https://www.cnblogs.com/yinghuoweiguang/p/16095912.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现