5.1 整合 JdbcTemplate
JdbcTemplate 是Spring 提供的一套JDBC模板框架,利用AOP 技术来解决直接使用JDBC 时大量重复代码的问题。JdbcTemplat巳虽然没有MyBatis 那么灵活,但是比直接使用JDBC 要方便很多。Spring Boot 中对JdbcTemplate 的使用提供了自动化配置类JdbcTemplateAutoConfiguration。
创建数据库和表
CREATE DATABASE 'chapter05' DEFAULT CHARACTER SET utf8 ; USE 'chapterO5'; CREATE TABLE 'book'( 'id' int(11) NOT NULL AUTO INCREMENT, 'name' varchar(l28) DEFAULT NULL, 'author' varchar(64) DEFAULT NULL, PRIMARY KEY('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into 'book'('id', 'name', 'author')
values (1 ,'三国演义','罗贯中'),
(2,'水浒传','施耐庵');
添加依赖:
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-jdbc</artifactid> </dependency>
还有数据库的依赖,根据数据库的不同而改变
在application.properties 中配置数据库,根据数据库的不同配置方法也不同。
创建Book 实体类,代码如下:
public class Book { private Integer id; private String name; private String author; // 省略getter/setter }
创建BookDao (数据库访问层) ,代码如下:
@Repository public class BookDao { @Autowired JdbcTemplate jdbcTemplate;
public int addBook(Book book) { return jdbcTemplate.update("INSERT INTO book(name, author) VALUES (?, ?)", book.getName(), book.getAuthor()); // 这两个是放在问号位置的参数
} public int updateBook(Book book) { return jdbcTemplate.update("UPDATE book SET name=?,author=? WHERE id=?”, book.getName(), book.getAuthor(), book.getid());
} public int deleteBookById(Integer id) { return jdbcTemplate.update("DELETE FROM book WHERE id=?”, id); }
public Book getBookByid(Integer id) { return jdbcTemplate.queryForObject("select * from book where id=?”, new BeanPropertyRowMapper<>(Book.class), id) ; }
public List<Book> getAllBooks () { return jdbcTemplate.query("select * from book”, new BeanPropertyRowMapper<>(Book.class));
}
}
在JdbcTemplate 中,增删改三种类型的操作主要使用update 和batchUpdate 方法来完成。
query和queryForObject 方法主要用来完成查询功能。
- 【query方法】返回结果是list,且list中元素必须是自定义bean
- 【queryForObje】查询出一条记录并封装到一个对象中。如果查询的记录为0条或者大于1条,对不起抛出异常
- 【queryForList】这个方法返回一个list,这个方法比较特殊,可以返回List<String>,还可以返回list<Map<String,Objec>>
- 【queryForMap】查询一行数据封装到Map中。如果查询多行记录抛出异常
还有execute 方法可以用来执行任意的SQL。
在执行查询操作时,需要有一个RowMapper 将查询出来的列和实体类中的属性一一对应起来。如果列名和属性名都是相同的,那么可以直接使用BeanPropertyRowMapper;如果列名和属性名不同,就需要开发者自己实现RowMapper 接口。