Java DAO模式 数据层实现类

本博客根据《李兴华--java8编程开发入门》视频整理而来。

1. 数据层需要被业务层调用,数据层需要进行数据库的执行(PreparedStatement)。

2. 在开发中,一个业务层操作需要执行多个数据层的调用,所以数据库的打开与关闭操作,应该由业务层控制。

3. 整个设计过程中,数据层中不用关注数据库如何打开关闭;但要想能够正常操作数据层,必须要保证存在有Connection对象。

4. 所有的数据层实现类要求保存在dao.impl子包下。


范例:EmpDAOImpl子类

子类中唯一需要注意的地方就是构造方法一定要接收一个Connection对象!

package com.fs.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import com.fs.dao.IEmpDAO;
import com.fs.vo.Emp;


public class EmpDAOImpl implements IEmpDAO {
	private Connection conn; // 需要利用Connection对象进行数据库操作
	private PreparedStatement pstmt; // 数据库语句的执行
	/**
	 * 如果要想使用数据层进行原子性的功能操作实现,必须提供有Connection接口对象<br>
	 * 另外,由于开发之中业务层要调用数据层,所以数据库的打开与关闭交由业务层处理
	 * @param conn 表示数据库连接对象
	 */
	public EmpDAOImpl(Connection conn) { // Connection对象从哪来?
		this.conn = conn;
	}
	@Override
	public boolean doCreate(Emp vo) throws Exception {
		String sql = "insert into emp(empno,ename,job,hiredate,sal,comm) values (?,?,?,?,?,?)";
		this.pstmt = this.conn.prepareStatement(sql); // PreparedStatement 作为执行sql语句的对象,其中后面括号中的(sql)是要执行的sql语句;
		this.pstmt.setInt(1, vo.getEmpno());
		this.pstmt.setString(2, vo.getEname());
		this.pstmt.setString(3, vo.getJob());
		this.pstmt.setDate(4, new java.sql.Date(vo.getHiredate().getTime()));
		this.pstmt.setDouble(5, vo.getSal());
		this.pstmt.setDouble(6, vo.getComm());
		return this.pstmt.executeUpdate() > 0;
	}

	@Override
	public boolean doUpdate(Emp vo) throws Exception {
		String sql = "update emp set empno=?,ename=?,job=?,hiredate=?,sal=?,comm=? where empno=?";
		this.pstmt = this.conn.prepareStatement(sql);
		this.pstmt.setString(1, vo.getEname());
		this.pstmt.setString(2, vo.getJob());
		this.pstmt.setDate(3, new java.sql.Date(vo.getHiredate().getTime()));
		this.pstmt.setDouble(4, vo.getSal());
		this.pstmt.setDouble(5, vo.getComm());
		this.pstmt.setInt(6, vo.getEmpno());
		return this.pstmt.executeUpdate() > 0;
	}

	@Override
	public boolean doRemoveBatch(Set<Integer> ids) throws Exception {
		// 删除的sql语句:delete from 表名称 where empno in (ssm,sss,sss)
		if (ids == null || ids.size() == 0) { // 没有要删除的数据
			return false;
		}

		// 需要拼凑sql语句(因为id是由集合传进来的)所以使用StringBuffer
		StringBuffer sql = new StringBuffer();
		sql.append("delete from emp where empno in (");
		Iterator<Integer> iter = ids.iterator();
		while (iter.hasNext()) {
			sql.append(iter.next()).append(",");
		}
		// 由于最后一个数据的“,”多余,所以删除最后一个“,”
		sql.delete(sql.length() - 1, sql.length()).append(")");// 删除逗号,补上最后的括号

		this.pstmt = this.conn.prepareStatement(sql.toString()); // 该方法只接受String类型
		return this.pstmt.executeUpdate() == ids.size();
	}

	@Override
	public Emp findById(Integer id) throws Exception {
		Emp vo = null;// 新建emp对象

		String sql = "select empno,ename,job,jiredate,sal,comm from emp where empno = ?";
		this.pstmt = this.conn.prepareStatement(sql);
		this.pstmt.setInt(1, id);

		ResultSet rs = this.pstmt.executeQuery(); // executeQuery():在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的
													// ResultSet 对象。
		if (rs.next()) {
			vo = new Emp();
			vo.setEmpno(rs.getInt(1));
			vo.setEname(rs.getString(2));
			vo.setJob(rs.getString(3));
			vo.setHiredate(rs.getDate(4));
			vo.setSal(rs.getDouble(5));
			vo.setComm(rs.getDouble(6));
		}

		return vo; // 返回emp对象
	}

	@Override
	public List<Emp> findAll() throws Exception {
		List<Emp> all = new ArrayList<Emp>();

		String sql = "select empno,ename,job,jiredate,sal,comm from emp";
		this.pstmt = this.conn.prepareStatement(sql);

		ResultSet rs = this.pstmt.executeQuery();
		while (rs.next()) {
			Emp vo = new Emp();
			vo.setEmpno(rs.getInt(1));
			vo.setEname(rs.getString(2));
			vo.setJob(rs.getString(3));
			vo.setHiredate(rs.getDate(4));
			vo.setSal(rs.getDouble(5));
			vo.setComm(rs.getDouble(6));
			all.add(vo);
		}

		return all;
	}

	@Override
	public List<Emp> findAllSplit(Integer currentPage, Integer lineSize, String column, String keyWord)
			throws Exception {
		List<Emp> all = new ArrayList<Emp>();

		String sql = "select * from emp where " + column + " like ? limit ?,? ";
		this.pstmt = this.conn.prepareStatement(sql);
		this.pstmt.setString(1, "%" + keyWord + "%");
		this.pstmt.setInt(2, (currentPage - 1) * lineSize);
		this.pstmt.setInt(3, lineSize);

		ResultSet rs = this.pstmt.executeQuery();
		while (rs.next()) {
			Emp vo = new Emp();
			vo.setEmpno(rs.getInt(1));
			vo.setEname(rs.getString(2));
			vo.setJob(rs.getString(3));
			vo.setHiredate(rs.getDate(4));
			vo.setSal(rs.getDouble(5));
			vo.setComm(rs.getDouble(6));
			all.add(vo);
		}

		return all;
	}

	@Override
	public Integer getAllCount(String column, String keyWord) throws Exception {
		String sql = "select count(empno) from emp where " + column + " like ? ";
		this.pstmt = this.conn.prepareStatement(sql);
		this.pstmt.setString(1, "%" + keyWord + "%");

		ResultSet rs = this.pstmt.executeQuery();
		if (rs.next()) {
			return rs.getInt(1);
		}
		return null;
	}
}

mysql分页+模糊查询语法:

String sql = "select * from emp where " + column + " like ? limit ?,? ";
		this.pstmt = this.conn.prepareStatement(sql);
		this.pstmt.setString(1, "%" + keyWord + "%");
		this.pstmt.setInt(2, (currentPage - 1) * lineSize);
		this.pstmt.setInt(3, lineSize);

视频教学中老师使用的是oracel数据库,担心其与mysql数据库语法上有所区别,所以写了一个小例子测试了doCreate()方法。导入java.sql.Connection而不是com.mysql.jdbc.Connection的原因。

package com.fs.dbc;

import java.sql.ResultSet;
import java.sql.Statement;

import java.sql.Connection;
import java.sql.PreparedStatement;

public class Test {
	public static void main(String[] args) throws Exception {
		DatabaseConnection dbc = new DatabaseConnection();
		Connection conn = (Connection) dbc.getConnection();
		if (conn != null) {
			System.out.println("success");
			if (doCreate(5, conn)) {
				Statement statement = dbc.getConnection().createStatement();
				String sql = "select * from smalltest"; // 要执行的SQL语句
				ResultSet rs = statement.executeQuery(sql);// ResultSet类,用来存放获取的结果集
				int id = 0; //
				while (rs.next()) {
					id = rs.getInt("id");// 获取id这列数据
					System.out.println(id);// 输出
				}
			}
		} else {
			System.out.println("f");
		}
	}

	public static boolean doCreate(Integer id, Connection conn) throws Exception {
		String sql = "insert into smalltest(id) values (?)"; // 要执行的SQL语句
		PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql);
		pstmt.setInt(1, id);
		return pstmt.executeUpdate() > 0;
	}
}

输出:success 1 2 5。成功啦~


猜你喜欢

转载自blog.csdn.net/qq_36834445/article/details/80054712
今日推荐