Java – JDBC – Spring JDBC
简介
Spring JDBC是Spring 框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC开发
导入包
Spring JDBC 需要导入 5个包,分别如下
spring-tx-6.0.3
commons-logging-1.2
spring-jdbc-6.0.3
spring-beans-6.0.3
spring-core-6.0.3
创建 JDBCTemplate 对象
JDBCTemplate 对象用于执行sql语句的对象,使用完不需要释放资源,在底层JDBCTemplate 已经帮我们处理好了
JDBCTemplate 需要提供数据源DataSource对象,关于 数据源DataSource对象 可以参考数据库连接池文章,使用C3P0或Druid进行数据源创建。
// 创建一个数据源对象,使用Druid
DataSoruce ds = DruidDataSourceFactory.createDataSource(pro);
// 传入数据源,获得Spring JDBC数据库操作对象
JdbcTemplate template = new JdbcTemplate(ds);
// 执行sql语句
String sql = "update xx set xx=? where xx=?";
template.update(sql,prop1,prop2);
JdbcTemplate 对象支持动态sql语句绑定,所以,update() 方法中
第一个参数代表要执行的sql语句
第二个参数代表sql语句中第一个占位符 ? 的数据
第三个参数代表sql语句中第二个占位符 ? 的数据
如些类推……
JdbcTemplate 不需要手动关闭数据源和数据库连接。
CURD操作常用方法
int update() : 执行DML语句。增、删、改语句,返回影响行数
Map<T,T> queryForMap() : 查询结果将结果集封装为map集合,把一行记录里的字段名和数据以 (字段名=数据)的形式返回,queryForMap() 只能使用在只有一行结果的查询上
List<Map<T,T>> queryForList() : 查询结果将结果集封装为List集合,返回一个由多个 Map 组成的List集合,每个Map为一行数据
List<T> query() : 查询结果,将结果封装为JavaBean对象,返回一个自定义的带JavaBean的类实例的集合。
T queryForObject() : 查询结果,将结果封装为对象,提供一个规定的类,查询得到后以这个类的类型输出
queryForMap()
queryForMap() 方法是把查询到的数据,以Key=Value的形式返回,Key为字段名,Value 为数据,queryForMap() 只能使用在查询结果只有一行数据的情况下,如果查询出来的数据是0或大于1时,会报出异常。
Properties pro = new Properties();
pro.load(JDBCTemplateDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
// 使用Druid创建数据源
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
// 把数据源传给 SpringJDBC Template
JdbcTemplate template = new JdbcTemplate(dataSource);
// 创建SQL 语句
String sql = "select * from user where id = ?";
// 传入sql语句,并把第一个 ? 占位符的值设为1
Map<String, Object> result = template.queryForMap(sql, 1);
System.out.println(result);
queryForList()
queryForList() 方法是把查询到的数据,以Key=Value的形式包装成Map集合,Key为字段名,Value 为数据,一行数据将被包装成一个Map对象,多条数据包装成多个Map对象,并把这些Map对象,存放到List集合中并返回。
Properties pro = new Properties();
pro.load(JDBCTemplateDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
// 使用Druid创建数据源
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
// 把数据源传给 SpringJDBC Template
JdbcTemplate template = new JdbcTemplate(dataSource);
// 创建SQL 语句
String sql = "select * from user where id = ?";
// 传入sql语句,并把第一个 ? 占位符的值设为1
List<Map<String, Object>> mapsResult = template.queryForList(sql, 1);
for (Map<String, Object> result : mapsResult) {
System.out.println(result);
}
query()
query() 方法是把查询到的数据,以匿名内部类的方式进行遍历,接口名为 RowMapper<T> ()
一行数据遍历一次,多行数据遍历多次,每一次的遍历会提供一个 ResultSet 结果集,用户可以通过创建自定义对象,并把这些查询结果赋给自定义对象实例中,并存到List 集合中
Properties pro = new Properties();
pro.load(JDBCTemplateDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
// 使用Druid创建数据源
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
// 把数据源传给 SpringJDBC Template
JdbcTemplate template = new JdbcTemplate(dataSource);
// 创建SQL 语句
String sql = "select * from user where id = ?";
// 传入sql语句,并把第一个 ? 占位符的值设为1
template.query(sql, new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
// 每执行一次,就会传入一行数据的 ResultSet 对象
return null;
}
});
// 支持Labmda ,使用 Labmda 表达式
template.query(sql,(rs,rowNum) -> null);
Spring JDBC 中,为了简化遍历带来的各种数据赋值的问题,提供了 BeanPropertyRowMapper<T>(Class c) 方法,对于查询结果的字段名和 JavaBean 中的成员变量相符合的JavaBean类,可以全自动赋值。
Properties pro = new Properties();
pro.load(JDBCTemplateDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
// 使用Druid创建数据源
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
// 把数据源传给 SpringJDBC Template
JdbcTemplate template = new JdbcTemplate(dataSource);
// 创建SQL 语句
String sql = "select * from user where id = ?";
// 传入sql语句,并把第一个 ? 占位符的值设为1
/*
* 对于使用 new RowMapper 而言,我们依然还是需要遍历每一个字段数据,并手动把数据
* 赋给对象,这样的操作也是非常麻烦的,所以 JDBCTemplate 提供了
* BeanPropertyRowMapper 类,如果 JavaBean 类的 get set 方法与查询数据的字段名
* 一致,比如
* id => setId
* username => setUsername
* 这样对应的字段时,可以使用 BeanPropertyRowMapper 类自动赋值
* 注意:BeanPropertyRowMapper 在遇到字段数据为 null 时,是不支持赋给基础数据类型的
* 因为基础数据类型没有 null
* null => setAge(int age) >> 会报异常
* 所以建议在使用 JavaBean 类进行包装查询数据表中的数据时,应该使用基础数据类型的包装类
* */
template.query(sql, new BeanPropertyRowMapper<Student>(Student.class));
queryForObject()
queryForObject() 方法是把查询到的数,通过接收类的类型,并把查询到的数据,以这个类型进行包装转换,并输出指定类型的数据。
Properties pro = new Properties();
pro.load(JDBCTemplateDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
// 使用Druid创建数据源
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
// 把数据源传给 SpringJDBC Template
JdbcTemplate template = new JdbcTemplate(dataSource);
// 创建SQL 语句
String sql = "select count(id) from user";
// 传入sql语句,并把第一个 ? 占位符的值设为1
// 通过查询出来数据后,并自定义数据为某一类型
Long aLong = template.queryForObject(sql, Long.class);
System.out.println(aLong);
共有 0 条评论