使用JdbcTemplate操作数据库
成功在Spring Boot项目中集成JdbcTemplate后,如何使用JdbcTemplate数据库连接模板操作数据库呢?接下来以示例演示JdbcTemplate实现学生信息的增、删、改、查等操作,让我们在实践中边学边用,更好地理解和吸收。
实现学生数据管理功能
步骤01 创建实体类。
根据之前创建的Student表结构创建对应的实体类Student,具体代码如下:
public class Student {
private Long id;
private String name;
private int sex;
private int age;
public Student() {
}
public Student(String name , int sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
//省略get、set方法
}
需要注意的是,实体类的数据类型要和数据库字段一一对应。
步骤02 定义Repository接口。
首先,创建StudentRepository接口并定义常用的增、删、改、查接口方法,示例代码如下:
public interface StudentRepository {
int save(Student student);
int update(Student student);
int delete(Long id);
Student findById(Long id);
}
在上面的示例中,在StudentRepository中定义了save()、update()、delete()和findById()方法。
然后,创建StudentRepositoryImpl类,继承StudentRepository接口,实现接口中的增、删、改、查等方法,示例代码如下:
@Repository
public class StudentRepositoryImpl implements StudentRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
}
在上面的示例中,在StudentRepositoryImpl类上使用@Repository注解用于标注数据访问组件JdbcTemplate,同时在类中注入JdbcTemplate实例。
步骤03 实现增、删、改、查功能。
接下来逐个实现对应的增、删、改、查方法。
1)新增:在StudentRepositoryImpl类中实现StudentRepository接口中的save()方法。示例代码如下:
@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)删除:通过用户id删除用户信息,在StudentRepositoryImpl类中实现StudentRepository接口的update( )方法。示例代码如下:
@Override
public int delete(Long id) {
return jdbcTemplate.update("DELETE FROM Student where id = ? ", id);
}
看到这里读者可能会有疑问:怎么新增、删除、修改都调用update()方法,这与其他的框架不一样?严格来说,新增、删除、修改都属于数据写入,通过update()执行对应的SQL语句即可实现对数据库中数据的变更。
3)修改:修改和新增类似,在StudentRepositoryImpl类中实现StudentRepository接口的update()方法。示例代码如下:
@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());
}
4)查询:根据用户id查询用户信息,同样在StudentRepositoryImpl类中实现StudentRepository接口的findById()方法。示例代码如下:
@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接口,将数据列与实体类属性字段映射。
步骤04 验证测试。
接下来对封装好的StudentRepository进行测试,测试StudentRepository中的各个方法是否正确。创建StudentRepositoryTests类,将studentRepository注入测试类中。
@SpringBootTest
class StudentRepositoryImplTest {
@Autowired
private StudentRepository studentRepository;
@Test
void save() {
Student student = new Student("example", 1, 30);
studentRepository.save(student);
}
@Test
void update() {
Student student = new Student("example", 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中的方法执行成功,也可以查看数据库中的数据是否符合预期。