Spring JDBC
Spring JDBC
Spring框架对JDBC的简单封装
提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
1. 导入jar包
2. 创建JDBCTemplate对象。依赖于数据源DataSource:`JdbcTemplate template = new JdbcTemplate(ds);`
3. 调用JdbcTemplate的方法来完成CRUD的操作
update():执行DML语句。完成增删改语句
queryForMap():查询结果将结果集封装在map集合
queryForList():查询结果将结果集封装在list集合
query():查询结果将结果封装为JavaBean
queryForObject():查询结果,将结果封装为对象
简单的进行介绍,进行一个小练习:进行更新表中的数据
public class jdbcTemplate {
public static void main(String[] args) {
// 1、导入jar包
// 2、JDBCTemplate对象
JdbcTemplate template = new JdbcTemplate( JdbcUtils.getDataSource() );
// 3、调用方法
String sql = "update account set name=? where id=?";
int count = template.update( sql, "李四",2 ); // 直接对sql语句的?进行赋值。
System.out.println(count);
}
}
运行代码前和运行代码后的数据查询,发现id为2的lisi已经更换成李四。
注意:此时它会自动归还连接和释放资源
练习
修改1号数据的salary 为1000
- 使用Junit单元测试,让方法独立运行
@Test
- 获取JDBCTemplate对象
private JdbcTemplate template = new JdbcTemplate( JdbcUtils.getDataSource() );
- 定义sql
String sql = "update emp set salary= 10000 where id =?";
- 执行sql
int count = template.update( sql, 1001 ); System.out.println(count);
@Test
public void test1(){
System.out.println("修改方法开始执行!");
// 2 定义sql
String sql = "update emp set salary= 10000 where id =?";
// 3 执行sql
int count = template.update( sql, 1001 );
System.out.println(count);
}
添加一条记录
@Test
public void test2(){
System.out.println("添加方法开始执行!");
String sql= "insert into emp(id,ename,dept_id) values(?,?,?)";
int count = template.update( sql, 1015, "郭靖", 10 );
System.out.println(count);
}
删除刚才添加的记录
@Test
public void test3(){
System.out.println("删除方法开始执行!");
String sql= "delete from emp where id= ?";
int count = template.update( sql, 1015);
System.out.println(count);
}
查询id为1的记录,将其封装为Map集合
/**
* 4 查询id为1001的记录,将其封装为Map集合
* 注意:这个方法查询的结果集长度只能为1,将列名作为key,将值作为value将这条记录封装为Map集合
*/
@Test
public void test4(){
System.out.println("查询方法开始执行!");
String sql= "select * from emp where id =?";
Map<String, Object> map = template.queryForMap( sql, 1001 );
System.out.println(map);
// {id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
}
查询所有记录,将其封装为list
/**
* 5 查询所有记录,将其封装为list
* 注意:将每一条记录封装为map集合,再将map集合装载到list集合中
*/
@Test
public void test5(){
System.out.println("查询方法开始执行!");
String sql= "select * from emp";
List<Map<String, Object>> list = template.queryForList( sql );
for (Map<String, Object> stringObjectMap : list) {
System.out.println(stringObjectMap);
}
}
查询所有记录,将其封装为Emp对象的list集合
/**
* 6 查询所有记录,将其封装为Emp对象的list集合
* 注意:将每一条记录封装为map集合,再将map集合装载到list集合中
*/
@Test
public void test6(){
System.out.println("查询2方法开始执行!");
String sql= "select * from emp";
/* 自己实现RowMapper对象,RowMapper实际上是一个接口,可以自己实现,也可以用默认的实现方式,
* 自己实现用的泛型是自己所需要的Emp,此处我们用匿名内部类的方式来实现。
*/
List<Emp> list = template.query( sql, new RowMapper<Emp>() {
/**
* 每调用一次对象就会封装一次emp对象返回给list集合
*/
@Override
public Emp mapRow(ResultSet rs, int i) throws SQLException {
Emp emp = new Emp();
int id = rs.getInt("id");
String ename = rs.getString( "ename" );
int job_id = rs.getInt( "job_id" );
int mgr = rs.getInt( "mgr" );
Date joindate = rs.getDate( "joindate" );
double salary = rs.getDouble( "salary" );
double bonus = rs.getDouble( "bonus" );
int dept_id = rs.getInt( "dept_id" );
emp.setId(id);
emp.setEname(ename);
emp.setJob_id(job_id);
emp.setMagr(mgr);
emp.setJoindate(joindate );
emp.setSalary( salary );
emp.setBonus( bonus );
emp.setDepe_id( dept_id );
return emp;
}
} );
for (Emp emp : list) {
System.out.println(emp);
}
}
以上使用的是自定义RowMapper对象,效率并没有太大的提高,那么我们可以使用以下默认的实现方式:
@Test
public void test61(){
System.out.println("查询2方法开始执行!");
String sql= "select * from emp";
List<Emp> list = template.query( sql, new BeanPropertyRowMapper<Emp>( Emp.class)); // 用默认的实现方式
for (Emp emp : list) {
System.out.println(emp);
}
}
查询总的记录数
/**
* 7 查询总的记录数
* 一般用于聚合函数的查询
*/
@Test
public void test7() {
System.out.println( "查询2方法开始执行!" );
String sql = "select count(id) from emp";
Long total = template.queryForObject( sql, Long.class ); // 一般执行聚合函数的
System.out.println(total);
}
}