本博客根据《李兴华--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。成功啦~