1. 程式人生 > 其它 >spring基礎04-JDBC-Template

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);
    }