JdbcTemplate RowMapper lambda表达式使用
- 教程由来:
由于准备写一个json工具包,但是需要有数据测试,就使用了JdbcTemplate的query来查询数据,本来使用BeanPropertyRowMapper作为封装参数,如下:
public List<Emp> findAll(){
List<Emp> query = jdbcTemplate.query("select * from emp e inner join dept d on e.deptno=d.deptno",new BeanPropertyRowMapper<Emp>(Emp.class));
return query;
}
但是有个致命问题就是多表查询时,所关联的表数据不可以得到封装。
想到用RowMapper作为封装参数,但是写实现类或者匿名内部类代码结构过于混乱,偶然发现RowMapper封装属性的接口是个函数接口,里面有个mapRow方法,我就想到了可以用用lambda表达式啊,代码简单明了,所以大致代码如下:
/**
*
* @ClassName: EmpDao
* @Description:TODO JdbcTemplate RowMapper lambda表达式使用
* @author: dqw
* @date: 2019年1月18日 上午12:19:11
*/
@Repository
public class EmpDao {
@Resource
private JdbcTemplate jdbcTemplate;
/**
*
* @Title: findAll
* @Description: TODO 查询所有员工
* @param: @return
* @return: List<Emp>
* @throws
*/
public List<Emp> findAll(){
/*
* 采用lambda表达式
*/
RowMapper<Emp> rm=(ResultSet rs, int i)->{
Emp emp=new Emp();
emp.setComm(rs.getBigDecimal("comm"));
emp.setEmpno(rs.getShort("empno"));
emp.setEname(rs.getString("ename"));
Dept dept=new Dept();
dept.setDname(rs.getString("dname"));
emp.setDept(dept);
return emp;
};
List<Emp> query = jdbcTemplate.query("select * from emp e inner join dept d on e.deptno=d.deptno",rm);
return query;
}
}
- 但是我又想到不能每次用RowMapper接口,都要封装那么多参数,再返回个emp,紧接着升级代码,加入方法引用,减少后面重复代码,升级完整版如下:
package com.dqw.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import com.dqw.domain.Dept;
import com.dqw.domain.Emp;
/**
*
* @ClassName: EmpDao
* @Description:TODO JdbcTemplate RowMapper lambda表达式使用
* @author: dqw
* @date: 2019年1月18日 上午12:19:11
*/
@Repository
public class EmpDao {
@Resource
private JdbcTemplate jdbcTemplate;
/**
*
* @Title: findAll
* @Description: TODO 查询所有员工
* @param: @return
* @return: List<Emp>
* @throws
*/
public List<Emp> findAll(){
/*
* 采用lambda表达式加方法引用
*/
RowMapper<Emp> rm=Po::getEmp;
List<Emp> query = jdbcTemplate.query("select * from emp e inner join dept d on e.deptno=d.deptno",rm);
return query;
}
}
/**
*
* @ClassName: Po
* @Description:TODO查询emp时,共用的方法引用类
* @author: dqw
* @date: 2019年1月18日 上午12:17:33
*/
final class Po{
public static Emp getEmp(ResultSet rs, int i) throws SQLException {
Emp emp=new Emp();
emp.setComm(rs.getBigDecimal("comm"));
emp.setEmpno(rs.getShort("empno"));
emp.setEname(rs.getString("ename"));
Dept dept=new Dept();
dept.setDname(rs.getString("dname"));
emp.setDept(dept);
return emp;
}
}
- 如有疑问联系QQ761945125