来了来了,又是偷懒摸鱼的一天!!!
初学没有接触到MyBatis时,用来避免大量重复书写DAO(Data Access Object)操作,将重复操作提取出来的BaseDao。
package dao;
import java.io.File;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class BaseDAO<T> {
Connection conn;
PreparedStatement ps;
ResultSet rs;
public void updata(String sql, Object[] params) {/*params 参数*/
try {
//获得链接对象
conn = JdbcUtils.getConn();
//获得声明
ps = conn.prepareStatement(sql);
//设置参数
for (int i = 0; i < params.length; i++) {/*数组从0开始*/
ps.setObject(i + 1, params[i]);/* ?从1开始 */
}
//执行sql语句
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.closeAll(null, ps, conn);
}
}
public List<T> select(String sql, Object[] params, Class c) {
List<T> list = new ArrayList<>();
try {
//获得链接对象
conn = JdbcUtils.getConn();
//获得statement
ps = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
//执行
rs = ps.executeQuery();
Field[] fields=c.getDeclaredFields();/*声明所有字段*/
while (rs.next()){
Object obj=c.newInstance();
for(Field field:fields) {
String fieldName = field.getName();
field.setAccessible(true);
field.set(obj,rs.getObject(fieldName));
}
list.add((T) obj);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}finally {
//关闭链接
JdbcUtils.closeAll(rs, ps, conn);
}
return list;
}
}
一个员工dao
package dao;
import entity.Emp;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
public class EmpDao {
BaseDAO<Emp> baseDAO=new BaseDAO<>();
/**
* 员工新增。
* @param emp
*/
public void sava(Emp emp){
//声明sql语句
String sql="insert into emp value(?,?,?,?,?,?,?,?)";
Object[] params={emp.getEmpno(),emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno()};
baseDAO.updata(sql, params);
}
/**
* 修改
* @param emp
*/
public void update(Emp emp){
String sql="update emp set ename=? job=? mgr=? hiredate=? sal=? comm=? deptno=? where empno=?";
Object[] params={emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno(),emp.getEmpno()};
baseDAO.updata(sql, params);
}
/**
* 更改员工部门
* @param emp
*/
public void changeDept(Emp emp){
String sql="update emp set deptno=? where empno=?";
Object[] params={emp.getDeptno(),emp.getEmpno()};
baseDAO.updata(sql, params);
}
/**
* 员工涨工资。
* @param emp
*/
public void changeSal(Emp emp){
String sql="update emp set sal=? where empno=?";
Object[] params={emp.getSal(),emp.getEmpno()};
baseDAO.updata(sql, params);
}
/**
* id查看详情
* @param emp
*/
public void findById(Emp emp){
String sql = "select * from student where empno=? ";
Object[] params={emp.getSal(),emp.getEmpno()};
baseDAO.updata(sql, params);
}
/**
* 员工换上级。
* @param emp
*/
public void changeMgr(Emp emp){
String sql="update emp set mgr=? where empno=?";
Object[] params={emp.getMgr(),emp.getEmpno()};
baseDAO.updata(sql, params);
}
/**
* 删除一个员工
* @param emp
*/
public void delEmp(Emp emp){
String sql="delete from emp where empno=?";
Object[] params={emp.getEmpno()};
baseDAO.updata(sql, params);
}
/**
* 批量删除员工(复选框)
* @param emps
*/
public void delEmps(Emp[] emps){
for (int i = 0; i < emps.length; i++) {
String sql="delete from emp where empno=?";
Object[] params={emps[i].getEmpno()};
baseDAO.updata(sql, params);
}
}
/**
* 按工资区间查找员工信息(可以填一个、也可以都填)。
* @param less
* @param more
* @return
*/
public List<Emp> findBySal(Integer less,Integer more){
String sql="SELECT * FROM emp where "+less+"<sal and sal<"+more+"";
Object[] params={};
List<Emp> empList=baseDAO.select(sql, params, Emp.class);
return empList;
}
public List<Emp> findBySal(Integer less){
return findBySal(less, 20000);
}
public List<Emp> findSal(Integer less){
String sql="select * from emp where sal >=? ";
Object[] params={};
List<Emp> empList=baseDAO.select(sql, params, Emp.class);
return empList;
}
/**
* 查看所有
* @return
*/
public List<Emp> findAll(){
String sql = "select * from emp";
Object[] params = {};
List<Emp> empList = baseDAO.select(sql, params, Emp.class);
return empList;
}
//测试
public static void main(String[] args) {
EmpDao empDao=new EmpDao();
// empDao.changeDept();
List<Emp> deptList = empDao.findBySal(2000);
for(Emp emp:deptList) {
System.out.println(emp.getEname());
}
}
}
相比较之前实体dao少了许多,当然在用MyBatis后,md真香,写的更少。对于还没有学到框架的小伙伴,这不失为一种便利方法,多动脑,能省事则省,能少写就少写,但是偷懒是为了多学!!!!!
最后简单介绍一下使用泛型:
泛型用于类的定义中,在实例化时,指定T的具体类型就可以使用。在定义泛型时,不传入泛型类型的实参的话,在泛型类中使用的泛型方法或者成员变量定义的类型可以为任何类型。