Spring 针对数据库开发提供了 JdbcTemplate 类,该类封装了 JDBC,支持对数据库的所有操作。
在 Spring 中,JDBC 的相关信息在配置文件中完成,其配置文件如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http:/www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--数据库驱动-->
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!--连接数据库的url-->
<property name= "url" value="jdbc:mysql://localhost/xx" />
<!--连接数据库的用户名-->
<property name="username" value="root" />
<!--连接数据库的密码-->
<property name="password" value="root" />
</bean>
<!--配置JDBC模板-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--默认必须使用数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置注入类-->
<bean id="xxx" class="xxx">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
...
</beans>
注:本节使用 MySQL 数据库,如果您使用的是其它数据库,需要对内容进行相应的修改。
上述代码中定义了 3 个 Bean,分别是 dataSource、jdbcTemplate 和需要注入类的 Bean。其中 dataSource 对应的是 DriverManagerDataSource 类,用于对数据源进行配置;jdbcTemplate 对应 JdbcTemplate 类,该类中定义了 JdbcTemplate 的相关配置(注入数据源即可使用)。
在 dataSource 中,定义了 4 个连接数据库的属性,如下表所示。
属性名 | 说明 |
---|---|
driverClassName | 所使用的驱动名称,对应驱动 JAR 包中的 Driver 类 |
url | 数据源所在地址 |
username | 访问数据库的用户名 |
password | 访问数据库的密码 |
在定义 JdbcTemplate 时,需要将 dataSource 注入到 JdbcTemplate 中。而在其他的类中要使用 JdbcTemplate,也需要将 JdbcTemplate 注入到使用类中(通常注入 dao 类中)。
在 JdbcTemplate 类中,提供了大量的查询和更新数据库的方法,如 query()、update() 等,如下表所示。
方法 | 说明 |
---|---|
public int update(String sql) | 用于执行新增、修改、删除等语句 args 表示需要传入到 query 中的参数 |
public int update(String sql,Object... args) | |
public void execute(String sql) | 可以执行任意 SQL,一般用于执行 DDL 语句 action 表示执行完 SQL 语句后,要调用的函数 |
public T execute(String sql, PreparedStatementCallback action) | |
public T query(String sql, ResultSetExtractor rse) | 用于执行查询语句 以 ResultSetExtractor 作为参数的 query 方法返回值为 Object,使用查询结果需要对其进行强制转型 以 RowMapper 作为参数的 query 方法返回值为 List |
public List query(String sql, RowMapper rse) |
示例
下面通过实例演示使用 JdbcTemplate 类操作数据库,步骤如下:
- 创建 Spring 项目,并在 src 目录下创建 com.spring_learn 包。
- 在 com.spring_learn 包下创建 Student(实体类)、StudentService(接口)、StudentServiceImpl(实现类)、JdbcConfiguration(配置类)等。
- 使用单元测试运行 Spring 项目。
Student(实体类)代码如下
public class Student {
int id;
String name;
int age;
// 省略set、get和toString
}
StudentService(接口)和StudentServiceImpl(实现类),为了方便,此处直接把JdbcTemplate注入到了Servers。
//接口
public interface StudentService {
List<Student> getStudents();
}
//实现
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private JdbcTemplate springJdbcTemplate;
@Override
public List<Student> getStudents() {
List<Student> lists = springJdbcTemplate.query("select * from student", new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
Student student = new Student();
student.setId(resultSet.getInt("id"));
student.setAge(resultSet.getInt("age"));
student.setName(resultSet.getString("name"));
return student;
}
});
return lists;
}
}
JdbcConfiguration(配置类)
@Configuration
public class JdbcConfiguration {
@Bean
public DriverManagerDataSource getDriverManagerDataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/springtemplate?useSSL=false");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean("springJdbcTemplate")
public JdbcTemplate getJdbcTemplate(){
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(getDriverManagerDataSource());
return jdbcTemplate;
}
}
单元测试类代码如下
@RunWith(SpringRunner.class)
@SpringBootTest
public class StudentServiceImplTest {
@Autowired
StudentService studentService;
@Test
public void getStudents() {
System.out.println(studentService.getStudents());
}
}
运行结果如下。
关于JDBC深入还可以参考以下文章