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);
        }
    }
    
  • 启动项目,测试

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