JdbcTemplate RowMapper lambda表达式使用

JdbcTemplate RowMapper lambda表达式使用

  1. 教程由来:
    由于准备写一个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;
	}
}
  1. 但是我又想到不能每次用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;
	}
}

  1. 如有疑问联系QQ761945125
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值