Spring框架之JDBC
概述
在Spring JDBC模块中,所有的类可以被分到四个单独的包:
-
core
即核心包,它包含了JDBC的核心功能。此包内有很多重要的类,包括:JdbcTemplate类、SimpleJdbcInsert类,SimpleJdbcCall类,以及NamedParameterJdbcTemplate类。 -
datasource
即数据源包,访问数据源的实用工具类。它有多种数据源的实现,可以在JavaEE容器外部测试JDBC代码。 -
object
即对象包,以面向对象的方式访问数据库。它允许执行查询并返回结果作为业务对象。它可以在数据表的列和业务对象的属性之间映射查询结果。 -
support
即支持包,是core包和object包的支持类。例如提供了异常转换功能的SQLException类。
添加依赖
要想使用spring的依赖和Spring JDBC依赖
<!-- spring IOC最小依赖,maven可以自动将其他依赖添加进来 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- spring JDBC的依赖库 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
配置数据源
首先要有关于数据库连接的属性配置文件
jdbc.url=jdbc:mysql://localhost:3306/books
jdbc.driver=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=root
jdbc.characterEncoding=utf8
实体类
@Setter
@Getter// 生成getter、setter的注解(需要Lombok插件)
public class BookType {
private Integer id;// 图书类型id
private String tname;// 图书类型
}
XML配置
<!-- 配置数据源 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<property name="connectionProperties">
<props>
<prop key="charsetEncoding">${jdbc.characterEncoding}</prop>
</props>
</property>
</bean>
Annotation配置
/**
* @program: spring
*
* @description: 用注解的方式配置数据源
*
* @author: Bennett
*
* @create: 2019-06-20 15:11
*
* @version: 1.0
**/
@PropertySource("classpath:jdbc.properties")
@Component
public class MyDataSource extends DriverManagerDataSource {
public MyDataSource(@Value("${jdbc.driver}") String driver, @Value("${jdbc.url}") String url, @Value("${jdbc.user}")
String username, @Value("${jdbc.password}") String password, @Value("${jdbc.characterEncoding}") String characterEncoding){
super.setDriverClassName(driver);
super.setUrl(url);
super.setUsername(username);
super.setPassword(password);
Properties properties = new Properties();
properties.setProperty("characterEncoding",characterEncoding);
super.setConnectionProperties(properties);
}
}
JdbcTemplate
JdbcTemplate其实就是一个操作数据库的工具类,它提供了一系列的关于操作数据库的方法,比如常用的增删改查等。它的使用方式和apache提供的Dbutils工具库相似,只是类名不同而已。下面给出示例
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// 查询方法
jdbcTemplate.query("select * from booktype",new BeanPropertyRowMapper<BookType>(BookType.class));
// 增加、删除、修改方法()
jdbcTemplate.update("insert into booktype (tname) values (?)",bookType.getTname());
/**
*此处只给出了增加的方法,删除、修改只需要换了SQL语句即可
*jdbcTemplate只是封装了PrepareStatement的方法,用的还是占位符配合参数的方式
**/
JdbcTemplate提供的方法:
- execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
- update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
- query方法及queryForXXX方法:用于执行查询相关语句;
- call方法:用于执行存储过程、函数相关语句。
JdbcTemplate的查询方法
查询单个数据
一般使用queryForObject(String sql, Object[] args, Class<T> requiredType)方法
String sql = "select tname from booktype where id = ?";
String tName = JdbcTemplate().queryForObject(sql, new Object[] { bookType.getId() }, String.class);
查询多行数据
使用query方法,但要传入一个BeanPropertyRowMapper对象参数。这种事自动映射的方式,但是要求你的实体类的属性名和你建的表的字段名一一对应(不对应就需要将你的查询结果的列名起别名为你的实体类的属性名)
// 如果双方名字不对应,则String sql = "select tname as tName from booktype"
List<BookType> bookTypeList = jdbcTemplate.query("select * from booktype",new BeanPropertyRowMapper<BookType>(BookType.class));
// query方法中的第三个参数如果SQL语句没有条件判断就不需要了
NamedParameterJdbcTemplate
在经典的 JDBC 用法中, SQL 参数是用占位符 ?
表示,并且受到位置的限制。定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定。
在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter)。
什么是具名参数
具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代
具名参数只在 NamedParameterJdbcTemplate 中得到支持。NamedParameterJdbcTemplate可以使用全部jdbcTemplate方法。
具名参数使用示例
获取新增的主键:
NamedParameterJdbcTemplate还新增了KeyHolder类,使用它我们可以获得主键,类似Mybatis中的useGeneratedKeys。
@Test
public void testNamedParameter(){
NamedParameterJdbcTemplate npjt = new NamedParameterJdbcTemplate(dataSource);
String sql = "insert into booktype (id,tname) values (:id,:tname)";
BookType bt = new BookType();
bt.setId(66);
bt.setTname("test");
SqlParameterSource sqlParameterSource=new BeanPropertySqlParameterSource(bt);
npjt.update(sql,sqlParameterSource);
//KeyHolder keyHolder = new GeneratedKeyHolder();
//npjt.update(sql, sqlParameterSource, keyHolder);
// 插入成功后,返回该条信息的主键id
//int resultId = keyHolder.getKey().intValue();
//System.out.println(resultId);
}
Spring Jdbc还提供了很多种类,比如调用存储过程或者存储函数的SimpleJdbcCall等,这里就不再赘述了。Spring JDBC提供的类也依旧只是适合查单张表使用,涉及联表查询就还是需要Hibernate、Mybatis等数据库框架才能处理的更加完美。