5.数据库访问

本文是读《Spring Boot2精髓-从构件小系统到架构分布式大系统》的读书笔记。

本章介绍 Spring JDBC Template 和 BeetlSQL 两种数据库访问方式, JDBC Template 是 Spring自带的,在 JDBC 的基础上做了 一定封装,而 BeetlSQL 是作者开发的这里不做介绍。都是以 SQL 为核心 。
SQL 为中心或者以对象为中心,两种访问方式没有绝对的好坏, 一般来说,以 SQL 为
核心的数据库访问更为灵活,更能适应大型的互联网和企业应用,学习门槛较低 。 以对象方式访问数据库更适合较为简单的系统或者工具类系统,学习门槛刚开始较低,但因为 ORM(ObjectRelational Mapping)持久化上下文等概念过于复杂,导致后期深入学习较为困难 。

5.1 配置数据源

本章将使用号称最快的数据库连接池 HikariCP 来说明 JDBC Template 和 BeetlSQL,集成
HikariCP 到 Spring Boot,首先在 porn 中加入如下依赖:

<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId>
</dependency>

本例使用了问ySQL ,你也可以使用任何其他驱动来完成本章的例子 , 使用 MySQL需要在 porn 中配置 MySQL 驱 动 依赖 。

		<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>6.0.5</version></dependency>

配置好上述依赖包和配置文件后,需要写一个 Java Config 来创建一个数据源,代码如下:

package com.bee.sample.ch5.conf;import javax.sql.DataSource;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import com.zaxxer.hikari.HikariDataSource;@Configuration
public class DataSourceConfig {@Bean(name = "dataSource")public DataSource datasource(Environment env) {HikariDataSource ds = new HikariDataSource();ds.setJdbcUrl(env.getProperty("spring.datasource.url"));ds.setUsername(env.getProperty("spring.datasource.username"));ds.setPassword(env.getProperty("spring.datasource.password"));ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));return ds;}
}

以上代码创建了 一个叫 dataSource 的数据源,我们使用 HikariDataSource 。

CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(45) COLLATE utf8_bin DEFAULT NULL COMMENT '名称',`department_id` int(11) DEFAULT NULL,`create_time` date DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;CREATE TABLE `department` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(45) COLLATE utf8_bin DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;INSERT INTO `user` VALUES (1, 'helo', 1, '2017-4-21 11:52:41');
INSERT INTO `department` VALUES ('1', '研发部门');

5.2 Spring JDBC Template

Spring 提供了 JdbcTemplate 对数据库访问技术 JDBC 做了 一定封装 ,包括管理数据库连接,简单查询结果映射成 Java 对象,复杂的结果集通过实现 RowMapper 接口来映射到 Java 对象 。
在 Spring Boot 中 ,只要配置好数据源 DataSource , 就能自动使用 JdbcTemplate .

查询
一个简单的返回总数的查询:

int rowCount = this.jdbcTemplate.queryForObject (” select count (*) from user” ,Integer.class) ;

一个带参数绑定的查询:

String rowCount = this . jdbcTemplate.queryForOb] ect (” select count(*) from user where department id=?, Integer . class ,l);

如果期望返回 POJO 实例, JdbcTemplate 需要一个 RowMapper , 将查询结果集 ResultSet 映射成一个对象:
通常 RowMapp巳r 可以被其他查询复用,因此最好的办法是在 DAO 中创建一个内部类,然后在 user 的查询中使用此类:

public class UserDao{
static class UserRowMapper implements RowMapper<User> {public User mapRow(ResultSet rs, int rowNum) throws SQLException {User user = new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));user.setDepartmentId(rs.getInt("department_id"));return user;}}
}	

JdbcTemplate 查询如果期望返回的是列表 ,则 需要使用 query 方法 :

	public List<User> getUserByDepartmentId(Long departmenetId) {String sql = "select * from user where department_id=? ";List<User> user = jdbcTempalte.query(sql, new UserRowMapper(), 1);return user;}

修改
JdbcTempalte 提供 update 方法来实现 SQL 的修改语旬,包括新增、修改、删除、执行存储过程等。

String sql =”update user set name=? and departmet_id=? where id = ?;
jdbcTempalte.update(sql,user.getName(),user.getDepartmentid(),user.getid()) ;

如果是数据库插入,操作同上面的 update,对于 MySQL、 SQL Server等数据库,含有自增序列 , 则需要提供一个 KeyHolder 来放置返回的序列 :

	public Integer insertUser(final User user) {final String sql = "insert into user (name, departmet_id ) values (?,?)";KeyHolder keyHolder = new GeneratedKeyHolder();jdbcTempalte.update(new PreparedStatementCreator() {public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {//指出自增主键的列名PreparedStatement ps = connection.prepareStatement(sql, new String[] { "id" });ps.setString(1, user.getName());ps.setInt(2, user.getDepartmentId());return ps;}}, keyHolder);return keyHolder.getKey().intValue();}

JdbcTemplate
N amedParameterJdbcTemplate 继承了 JdbcTemplate , 不同于 JdbcTemplate , 对 SQL 中的参数只支持传统的“?”占位符。NamedParameterJdbcTemplate 允许 SQL 中使用参数的名字作为占位符
Spring Boot 己经自动配置了 NamedParameterJdbcTemplate,可以自动注入使用 :

@Autowired
NamedParameterJdbcTemplate namedParameterJdbcTemplate ;
	public Integer totalUserInDepartment2(Long departmentId) {String sql = "select count(1) from user where department_id=:deptId";MapSqlParameterSource namedParameters = new MapSqlParameterSource();namedParameters.addValue("deptId", departmentId);Integer count = namedParameterJdbcTemplate.queryForObject(sql, namedParameters,  Integer.class) ;return count;}

MapSqlParameterSource 是一个类似 Map 风格的类,包含 Key-Value, Key 就是 SQL 中的参数名字,在 SQL 语句中,不再使用“?”,而是使用了“:”开头的参数名字 ,如“:deptld ”。

BeetlSQL介绍

这里不作说明
针对 Spring JDBC Template存在 的一些问题,可以引申学习一下Mybatis框架。
JPA具有内置多种DAO操作功能的优点
MyBatis具有SQL集中管理的优点
JdbcTemplate 和 mybatis 的对比
谈jdbcTemplate与mybatis
这两篇博文可以看一下


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部