spring基础04-JDBC-Template

4 jdbc-Template (以操作book表为例)

4.1 概念和基础准备

4.1.1 什么是jdbcTemplate

  • spring框架对jdbc进行了封装,使用 jdbctemplate很容易实现增删改查的操作

4.1.2 准备工作

  1. 引入相关的jar包

    • <artifactId>mysql-connector-java</artifactId>
      <artifactId>druid</artifactId>
      <artifactId>spring-jdbc</artifactId>
      <artifactId>spring-tx</artifactId>
      <artifactId>spring-orm</artifactId>
      
  2. 在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

  1. 配置jdbcTempplate对象,注入DataSource

    • <!--创建jdbcTemplate对象
          JdbcTemplate这个类有个有参构造,需要提供数据源DataSource-->
      <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
          <!--注入DataSource
              但是有参构造里面调用了set方法,所以实际是用set方法-->
          <property name="dataSource" ref="druid"></property>
      </bean>
      
  2. 创建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)
    • 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)
    • 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);
    }
    

posted @   荧惑微光  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示