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