SpringBoot 學習筆記_整合持久層(一)——JdbcTemplate

SpringBoot 學習筆記_整合持久層(一)——JdbcTemplate

聲明:

本次學習參考 《SpringBoot + Vue 開發實戰》 · 王松(著) 一書。

本文的目的是記錄我學習的過程和遇到的一些問題以及解決辦法,其內容主要來源於原書。

如有侵權,請聯繫我刪除

SpringBoot 整合持久層開發

整合 JdbcTemplate

JdbcTemplateSpring 提供的一套 JDBC 模板框架,利用 AOP 技術來解決直接使用 JDBC 時大量重複代碼的問題。

SpringBootJdbcTemplate 的使用提供了自動化配置類 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)

    spring.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
    
    報錯: The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time zone

    原因: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);
        }
    }
    
  • 啓動項目,測試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章