Spring JDBC是Spring提供的一个简单轻量的基于JDBC的持久层框架,与MyBatis类似,Spring JDBC也是一个半自动化的持久层框架,需要我们手动编写SQL,手动进行对象属性映射。
这里我们通过一个简单的程序来初步了解Spring JDBC的使用。
一、引入所需要的依赖
此处使用Maven管理依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
二、配置数据源
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/TEST"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
三、创建Repository,即通常我们所说的DAO
@Repository
public class StudyRepository {
private JdbcTemplate jdbcTemplate;
//使用匿名内部类创建数据映射实例
private RowMapper<Map<String, Object>> studentMapper = new RowMapper<Map<String, Object>>(){
@Override
public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
//组装数据对象,此处使用Map来装载数据
Map<String, Object> row = new HashMap<>();
row.put("name", rs.getString(1));
row.put("age", rs.getInt(2));
return row;
}
};
//使用数据源来初始化jdbcTemplate,jdbcTemplate是Spring JDBC中用于操作数据的实例
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
//使用Spring事务管理来进行事务控制,实际应用中应在Service层函数中控制
@Transactional
public void create(String name, Integer age) {
String SQL = "INSERT INTO TB_STUDENT (NAME, AGE) VALUES (?, ?)";
jdbcTemplate.update(SQL, name, age);
}
@Transactional
public List<Map<String,Object>> list() {
String SQL = "SELECT T.NAME, T.AGE FROM TB_STUDENT T ORDER BY T.NAME";
return jdbcTemplate.query(SQL, studentMapper);
}
@Transactional
public void udpate(Object[] args) {
String SQL = "UPDATE TB_STUDENT T SET T.NAME = ?,T.AGE = ? WHERE T.NAME = ?";
//参数可以使用Object数组进行传递,各参数需要按照使用次序放置
jdbcTemplate.update(SQL, args);
}
@Transactional
public void delete(String name) {
String SQL = "DELETE FROM TB_STUDENT T WHERE T.NAME = ?";
jdbcTemplate.update(SQL, name);
}
@Transactional
public Map<String, Object> query(String name) {
try {
String SQL = "SELECT T.NAME, T.AGE FROM TB_STUDENT T WHERE T.NAME = ?";
return jdbcTemplate.queryForObject(SQL, new Object[] { name }, studentMapper);
} catch (EmptyResultDataAccessException e) {
//当查询结果为空时,Spring JDBC会抛出异常
return null;
}
}
}
四、调用Repository
@Controller
@RequestMapping("/study")
public class StudyController {
//装载StudyRepository实例,实际应用中应在Service实例中装载使用
@Autowired
private StudyRepository studyRepository;
@RequestMapping("/create/{name}/{age}")
public void create(@PathVariable(value="name") String name, @PathVariable(value="age") Integer age) {
studyRepository.create(name, age);
}
@RequestMapping("/list")
public List<Map<String,Object>> list() {
return studyRepository.list();
}
@RequestMapping("/udpate/{name}/{age}/{preName}")
public void udpate(@PathVariable(value="name") String name, @PathVariable(value="age") Integer age
,@PathVariable(value="preName") String preName) {
studyRepository.udpate(new Object[] {name,age,preName});
}
@RequestMapping("/delete/{name}")
public void delete(@PathVariable(value="name") String name) {
studyRepository.delete(name);
}
@RequestMapping("/query/{name}")
public Map<String, Object> query(@PathVariable(value="name") String name) {
return studyRepository.query(name);
}
}
总结
优点:
- Spring JDBC足够简洁轻量,搭建快速,对于简单的小程序是不错的选择;
- 自行编写SQL,足够灵活;
- Spring JDBC和Spring整合得很好,使用方便,在Spring Boot中也默认集成;
不足:
相比于ORM框架,Spring JDBC仍然需要我们编写大量的SQL,虽然灵活但是开发效率不高,但Spring JDBC本身也不是按ORM而设计;
Spring JDBC未提供缓存功能,如果需要使用缓存,则需要自行配置;