JDBC作为Java访问数据库的API规范,统一了各种数据库的访问方式。但是,直接在Java程序中使用JDBC还是非常复杂和繁琐的。所以Spring对JDBC进行了更深层次的封装,而JdbcTemplate就是Spring提供的一个操作数据库的便捷工具。它主要是实现了数据库连接的管理,我们可以借助JdbcTemplate来执行所有数据库操作,例如插入、更新、删除和从数据库中检索数据,并且有效避免直接使用JDBC带来的烦琐编码。
Spring Boot作为Spring的集大成者,自然会将JdbcTemplate集成进去。Spring Boot针对JDBC的使用提供了对应的Starter包:spring-boot-starter-jdbc,它其实就是在Spring JDBC上做了进一步的封装,方便在 Spring Boot 项目中更好地使用JDBC。
1.JdbcTemplate的特点
速度快,相对于ORM框架,JDBC的方式是最快的。 配置简单,Spring封装的,除了数据库连接之外,几乎没有额外的配置。 使用方便,就像DBUtils工具类,只需注入JdbcTemplate对象即可。
2.JdbcTemplate的几种类型的方法 JdbcTemplate虽然简单,功能却非常强大。它提供了非常丰富、实用的方法,归纳起来主要有以下几种类型的方法:
总的来说,新增、删除与修改三种类型的操作主要使用update和batchUpdate方法来完成。query和queryForObject方法中主要用来完成查询功能。execute方法可以用来执行任意的SQL、call方法来调用存储过程。
Spring Boot集成JDBC很简单,需要引入依赖并做基础配置即可。接下来,我们就以一个具体的例子来学习如何利用Spring的JdbcTemplate进行数据库操作。
第一步,添加依赖配置
首先,项目pom.xml 配置文件中增加 JDBC等相关依赖:
pom<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
上面的示例,在pom.xml文件中引入spring-boot-starterjdbc依赖。同时,项目中使用 MySQL作为数据库,因此项目中需要引入MySQL驱动包。spring-boot-starter-jdbc则直接依赖于HikariCP和spring-jdbc。
HikariCP是Spring Boot 2.0默认使用的数据库连接池,也是传说中最快的数据库连接池。 spring-jdbc是Spring封装对JDBC操作的工具包。 第二步,创建数据库及表结构
首先创建jdbctest测试数据库,然后再创建student表。包括id、name、sex、age等字段,对应的SQL脚本如下:
DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `name` varchar(32) DEFAULT NULL COMMENT '姓名', `sex` int DEFAULT NULL, `age` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
第三步,配置数据源
在application.properties配置MYSQL数据库连接相关配置。具体配置如下:
spring.datasource.url=jdbc:mysql://localhost:3306/jdbctest?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
上面的示例,数据库连接配置非常简单,包括数据库连接地址、数据库用户名、密码以及数据驱动,无需其他额外配置。在Spring Boot 2.0中,com.mysql.jdbc.Driver已经过期,推荐使用com.mysql.cj.jdbc.Driver。
第四步,使用JdbcTemplate
上面已经就把JdbcTemplate整合到Spring Boot项目中,并创建好数据。接下来创建一个单元测试类JdbcTests,验证JdbcTemplate操作数据库。示例代码如下:
java@RunWith(SpringRunner.class)
@SpringBootTest
class JdbcTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void querytest() throws SQLException {
List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from student ");
System.out.println(list.size());
Assert.assertNotNull(list);
Assert.assertEquals(1,list.size());
}
}
上面是简单使用JdbcTemplate的测试示例,Spring的JdbcTemplate是自动配置的。使用@Autowired将JdbcTemplate注入到需要的bean中即可直接调用。
运行Run Test或在方法上右键|Run ‘querytest’,运行测试方法。
单元测试方法queryTest运行成功,并输出相应的结果。说明JdbcTemplate已经连接上数据库,并成功执行了数据查询操作。
以上就把JdbcTemplate整合到Spring Boot 项目中了。
第一步,创建实体类
根据之前创建的Student表结构,创建对应的实体类Student。具体代码如下:
java@Data
public class Student {
private Long id;
private String name;
private int sex;
private int age;
}
需要注意,实体类的数据类型要和数据库字段一一对应。
第二步,封装Repository实现增删改查
首先,创建StudentRepository接口并定义常用的增删改查的接口方法,示例代码如下:
public interface StudentRepository {
java int save(Student student);
int update(Student student);
int delete(long id);
Student findById(long id);
}
上面的示例,在StudentRepository中定义了save、update、delete、findAll和findById等常用方法。
然后,创建StudentRepositoryImpl类,继承StudentRepository接口,实现接口中的增删改查等方法,示例代码如下:
java@Repository
public class StudentRepositoryImpl implements StudentRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
}
上面的示例,在StudentRepositoryImpl类上使用 @Repository 注解用于标注数据访问组件JdbcTemplate,同时在类中注入 JdbcTemplate实例。接下来逐个实现对应的增删查改方法。
(1)新增
在StudentRepositoryImpl类中实现StudentRepository接口中的save()方法。示例代码如下:
java@Override
public int save(Student student) {
return jdbcTemplate.update("INSERT INTO Student(name, sex, age) values(?, ?, ?)",
student.getName(),student.getSex(),student.getAge());
}
在JdbcTemplate中,除了查询有几个API之外,新增、删除与修改统一都使用update来操作,传入SQL即可。update方法的返回值就是SQL执行受影响的行数。
(2)修改
更新和新增类似,在StudentRepositoryImpl类中实现StudentRepository接口的update()方法。示例代码如下:
java@Override
public int update(Student student) {
return jdbcTemplate.update("UPDATE Student SET name = ? , password = ? , age = ? WHERE id=?", student.getName(),student.getSex(),student.getAge(),student.getId());
}
(3)删除
通过用户id删除用户信息,在StudentRepositoryImpl类中实现StudentRepository接口的update()方法。示例代码如下:
java@Override
public int delete(long id) {
return jdbcTemplate.update("DELETE FROM Student where id = ? ",id);
}
看到这里大家可能会有疑问:怎么新增、修改、删除,都调用update方法,这跟其他的框架不一样?严格来说,新增、修改、删除都属于数据写入,通过update执行对应的SQL语句,实现对数据库中数据的变更。
(4)查询
根据用户id查询用户信息,同样在StudentRepositoryImpl类中实现StudentRepository接口的findById ()方法。示例代码如下:
java@Override
public Student findById(long id) {
return jdbcTemplate.queryForObject("SELECT * FROM Student WHERE id=?", new Object[] { id }, new BeanPropertyRowMapper<Student>(Student.class));
}
上面的示例,JdbcTemplate执行查询相关的语句使用query方法及queryForXXX方法。 查询对象使用queryForObject 方法。 JdbcTemplate支持将查询结果转换为实体对象,使用new BeanPropertyRowMapper(Student.class)对返回的数据进行封装,它通过名称匹配的方式,自动将数据列映射到指定类的实体类中。
在执行查询操作时,需要有一个RowMapper将查询出来的列和实体类中的属性一一对应起来:
如果列名和属性名都是相同的,那么可以直接使用BeanPropertyRowMapper。 如果列名和属性名不同,就需要开发者自己实现 RowMapper 接口,将数据列与实体类属性字段映射。 第三步,调用测试
接下来对封装好的StudentRepository进行测试,测试StudentRepository中的各个方法是否正确。创建StudentRepositoryTests类,将studentRepository注入到测试类中。
java@SpringBootTest
class StudentRepositoryImplTest {
@Autowired
private StudentRepository studentRepository;
@Test
void save() {
Student student =new Student("weiz",1,30);
studentRepository.save(student);
}
@Test
void update() {
Student student =new Student("weiz",1,18);
student.setId(1L);
studentRepository.update(student);
}
@Test
void delete() {
studentRepository.delete(1L);
}
@Test
void findById() {
Student student = studentRepository.findById(1L);
System.out.println("student == " + student.toString());
}
}
如上面的测试示例,我们依次执行测试方法,执行成功后会在数据库查看数据是否符合预期。测试执行正常,则表明StudentRepository中方法正确。
本文作者:Weee
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!