SpringBoot 學習筆記_整合持久層(一)——JdbcTemplate
聲明:
本次學習參考 《SpringBoot + Vue 開發實戰》 · 王松(著) 一書。
本文的目的是記錄我學習的過程和遇到的一些問題以及解決辦法,其內容主要來源於原書。
如有侵權,請聯繫我刪除
SpringBoot 整合持久層開發
整合 JdbcTemplate
JdbcTemplate
是Spring
提供的一套 JDBC 模板框架,利用 AOP 技術來解決直接使用 JDBC 時大量重複代碼的問題。
SpringBoot
對 JdbcTemplate
的使用提供了自動化配置類 JdbcTemplateAutoConfiguration
@Configuration
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })
@ConditionalOnSingleCandidate(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcTemplateAutoConfiguration {
@Configuarion
static class JdbcTemplateConfiguration {
...
@Bean
@Primary
@ConditionalOnMissingBean(JdbcOperations.class)
public JdbcTemplate jdbcTemplate(){
...
}
}
}
從上源碼可以看出,當 classpath 下存在 DataSource 和 JdbcTemplate 並且 DataSource 只有一個實例時,自動配置纔會生效
若開發者沒有提供 JdbcOperations,則 SpringBoot 會自動向容器中注入一個 JdbcTemplate。
-
創建數據庫和表
create database `chapter05` default character set utf8; use `chapter05`; create table book( `id` int(11) not null auto_increment, `name` varchar(128) default null, `author` varchar(64) default null, primary key(`id`) ) engine=Innodb default charset=utf8; insert into `book`(`id`, `name`, `author`) values (1, '三國演義', '羅貫中'), (2, '水滸傳', '施耐庵'), (3, '紅樓夢', '曹雪芹'), (4, '西遊記', '吳承恩');
-
創建 SpringBoot 項目,添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.9</version> </dependency>
-
數據庫配置(
application.properties
)
報錯: The server time zone value ‘�й���ʱ��’ is unrecognized or represents more than one time zonespring.datasource.type=com.alibaba.druid.pool.DruidDataSource #spring.datasource.url=jdbc:mysql:///chapter05 spring.datasource.url=jdbc:mysql://localhost:3306/chapter05?serverTimezone=GMT spring.datasource.username=root spring.datasource.password=root
原因:mySql 8 版本的時區與系統時區差異造成,需要手動指定時區,或者降低 mySql 版本至 5
解決: 需要在連接字符串後加上 ?serverTimezone=GMT
-
創建實體類
public class Books { private Integer id; private String name; private String author; /** Getter & Setter */ }
-
創建數據庫訪問層
@Repository public class BooksDao { @Autowired JdbcTemplate jdbcTemplate; public int addBook(Books book){ String sql = "INSERT INTO book(name, author) VALUES(?,?)"; return jdbcTemplate.update(sql, book.getName(), book.getAuthor()); } public int updateBook(Books book){ String sql = "UPDATE book SET name=?, author=? WHERE id=?"; return jdbcTemplate.update(sql, book.getName(), book.getAuthor(), book.getId()); } public int deleteBookById(Integer id){ String sql = "DELETE FROM book WHERE id=?"; return jdbcTemplate.update(sql, id); } public Books getBookById(Integer id){ String sql = "SELECT * FROM book WHERE id=?"; return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Books.class), id); } public List<Books> getAllBooks(){ String sql = "SELECT * FROM book"; return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Books.class)); } }
- 創建 BookDao,注入 JdbcTemplate。由於添加了 spring-jdbc 相關依賴,JdbcTemplate 會被自動註冊到 Spring 容器,因此這裏可以直接注入 JdbcTemplate 使用
- JdbcTemplate 中,主要分三種操作:增刪改(update、batchUpdate)、查詢(query、queryForObject)、執行其他SQL或存儲過程等(execute)
- 查詢操作時,需要一個 RowMapper 將查詢出來的列和實體類的屬性一一對應。如果列名和屬性都是相同的,那麼可以直接使用 BeanPropertyRowMapper,如果列名和屬性名不同,就需要開發者自己實現 RowMapper 接口,將列和實體類屬性對應。
-
創建 Service 和 Controller
@Service public class BooksService { @Autowired BooksDao booksDao; public int addBook(Books book){ return booksDao.addBook(book); } public int updateBook(Books book){ return booksDao.updateBook(book); } public int deleteBook(Integer id){ return booksDao.deleteBookById(id); } public Books getBookById(Integer id){ return booksDao.getBookById(id); } public List<Books> getAllBooks(){ return booksDao.getAllBooks(); } }
@RestController public class BooksController { @Autowired BooksService booksService; @GetMapping("/bookOps") public void bookOps() { Books b1 = new Books(); b1.setId(6); b1.setName("朝花夕拾"); b1.setAuthor("魯迅"); int i = booksService.addBook(b1); System.out.println("add Book " + i + "條 >>> " + b1.getName()); Books b2 = new Books(); b2.setId(5); b2.setName("SpringBoot 開發實戰"); b2.setAuthor("王松"); int j = booksService.updateBook(b2); System.out.println("update Book" + j + "條 >>> " + b2.getName()); Books b3 = booksService.getBookById(5); System.out.println("getBookById >>> " + b3.getName()); int k = booksService.deleteBook(5); System.out.println("deleteBook" + k + "條 >>> id = " + "5"); List<Books> allBooks = booksService.getAllBooks(); System.out.println("getAllBooks >>> " + allBooks); } }
-
啓動項目,測試