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 接口

 

posted @ 2022-07-10 23:11  小白冲冲  阅读(39)  评论(0编辑  收藏  举报