Spring提供的简化JDBC使用的Template:2

延续上篇,进行较为复杂的查询和包装操作:

将查询的结果封装到一个map(键值对)对象中:queryForMap方法。将字段名作为key,将值作为value

注意:查询结果只能是1行,0或者1行以上都不行

private JdbcTemplate template;

@Before
public void beforeTest(){
template = new JdbcTemplate(Druid_Utils.getDataSource());
}

@Test
public void test1(){
String sql = "select * from emp where id = ?";
Map<String,Object> map = template.queryForMap(sql,1001);
//注意这里map的值的类型,键是String没啥问题,关键在值:为了兼容一切类型,采用object类
System.out.println(map);
}

将查询到的一批结果封装到一个成员为map的list容器中:queryForList

 

@Test
public void test2(){
String sql = "select * from emp where id = ? or id = ?";
List<Map<String,Object>> list = template.queryForList(sql,1001,1002);
//map的值类型依旧是兼容object类型
for(Map<String,Object> map : list){
System.out.println(map);
}
}

 

将查询到的结果都封装到一个个成员为 用户自定义类型 的list容器中:query、RowMappper、BeanPropertyRowMapper

 

@Test
public void test3(){
String sql = "select * from emp";
List<emp> list = template.query(sql,new RowMapper<>(){
//query的第二个参数RowMapper是一个接口,这里采用匿名内部类的方式进行实现。
//实现的方式就是:传入结果集,返回一个用户自定义类型的对象
//而其中,该对象的初始化和赋值需要由用户自己书写完成,相当繁琐
@Override
public emp mapRow(ResultSet resultSet, int i) throws SQLException {
emp emp = new emp();
Integer id = resultSet.getInt("id");
String ename = resultSet.getString("ename");
Integer job_id = resultSet.getInt("job_id");
Integer mgr = resultSet.getInt("mgr");
Date joinDate = resultSet.getDate("joindate");
Double salary = resultSet.getDouble("salary");
Double bonus = resultSet.getDouble("bonus");
Integer dept_id = resultSet.getInt("dept_id");

emp.setId(id);
emp.setEname(ename);
emp.setJob_id(job_id);
emp.setMgr(mgr);
emp.setDate(joinDate);
emp.setSalary(salary);
emp.setBonus(bonus);
emp.setDept_id(dept_id);
return emp;
}
});
// List<emp> list = template.query(sql,new BeanPropertyRowMapper<emp>(emp.class));
//这里的BeanPropertyRowMapper已经在内部实现了RowMapper,更加简便
for(emp e : list){
System.out.println(e);
}
}

 

实际上,有更加简便的方式:

 

@Test
public void test3(){
String sql = "select * from emp";
List<emp> list = template.query(sql,new BeanPropertyRowMapper<emp>(emp.class));
//第一个参数是sql语句,第二个参数BeanPropertyRowMapper是一个接口,需要进行实现,这里是匿名内部类。参数就是用户自定义的类型,他会自动将获取结果的值和类型中名称相同的变量一一对应,因此类型要提前设计好
//这里的BeanPropertyRowMapper已经在内部实现了RowMapper,更加简便
for(emp e : list){
System.out.println(e);
}
}

 

queryForObject将查询结果转换为指定类型的数据,一般用于聚合函数如表的长度等数据的查询

第二个参数是目标指定的转换后的类型

 

@Test
public void test4(){
String sql = "select count(id) from emp";
Long total = template.queryForObject(sql,Long.class);
System.out.println(total);
}

 

这里是进行了表的总行数的查询

 

posted @ 2021-12-27 11:34  biingpo  阅读(35)  评论(0)    收藏  举报