本案例的详细要求如下:
1.如果职位(job)为“ANALYST”的员工,那么工资提升20%。
2.如果职位(job)为“MANAGER”的员工,那么工资提升30%。
3. 要求某部门下的以上两个职位的员工工资,要么工资全部提升成功,要么工资全部提升失败。
参考答案
实现此案例需要按照如下步骤进行。
步骤一:准备JDBC操作数据库的基本代码
首先,在EmpDAO类中新建updateSalByDeptno方法,方法的声明如下所示:
publicvoidupdateSalByDeptno(int deptno){}
该方法实现将部门编号为deptno的、职位为“ANALYST”和“MANAGER”的员工的工资进行提升。
然后,准备数据库连接的Connection对象、操作SQL语句的Statement对象并进行异常的处理,代码如下所示:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; publicclass EmpDAO { publicstaticvoid main(String[] args) { EmpDAO dao = new EmpDAO(); // dao.findSalByEname("CLARK"); // dao.findSalByEname("a' OR 'b'='b"); // dao.findSalByEname1("CLARK"); // dao.findSalByEname1("a' OR 'b'='b"); } publicvoidupdateSalByDeptno(int deptno) { Connection con = null; Statement stmt = null; try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findSalByEname(String ename) { ... ... } publicvoid findSalByEname1(String ename) { ... ... } }
步骤二:实现员工工资的提升
使用Connection的setAutoCommit方法、commit方法以及rollback方法来控制事务,以正确实现员工工资的提升,代码如下所示:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; publicclass EmpDAO { publicstaticvoid main(String[] args) { EmpDAO dao = new EmpDAO(); // dao.findSalByEname("CLARK"); // dao.findSalByEname("a' OR 'b'='b"); // dao.findSalByEname1("CLARK"); // dao.findSalByEname1("a' OR 'b'='b"); } publicvoidupdateSalByDeptno(int deptno) { Connection con = null; Statement stmt = null; try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); #cold_bold // 插入数据的SQL语句 #cold_bold String sql1 = "update emp set sal =sal*1.2" + " where deptno=" #cold_bold + deptno + " and job='ANALYST'"; #cold_bold String sql2 = "update emp set sal =sal*1.3" + " where deptno=" #cold_bold + deptno + " and job='MANAGER'"; #cold_bold // 关闭自动提交 #cold_bold con.setAutoCommit(false); #cold_bold // 执行SQL语句 #cold_bold stmt.executeUpdate(sql1); #cold_bold stmt.executeUpdate(sql2); #cold_bold // 提交 #cold_bold con.commit(); } catch (SQLException e) { #cold_bold try { #cold_bold con.rollback(); #cold_bold } catch (SQLException e1) { #cold_bold System.out.println("回滚事务异常!"); #cold_bold throw new RuntimeException(e1); #cold_bold } System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findSalByEname(String ename) { ... ... } publicvoid findSalByEname1(String ename) { ... ... } }
步骤三:测试
在EmpDAO类的main方法中,调用updateSalByDeptno方法,代码如下所示:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; publicclass EmpDAO { publicstaticvoid main(String[] args) { EmpDAO dao = new EmpDAO(); // dao.findSalByEname("CLARK"); // dao.findSalByEname("a' OR 'b'='b"); // dao.findSalByEname1("CLARK"); // dao.findSalByEname1("a' OR 'b'='b"); // 员工工资提升 #cold_bold dao.updateSalByDeptno(20); } publicvoidupdateSalByDeptno(int deptno) { Connection con = null; Statement stmt = null; try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); // 插入数据的SQL语句 String sql1 = "update emp set sal =sal*1.2" + " where deptno=" + deptno + " and job='ANALYST'"; String sql2 = "update emp set sal =sal*1.3" + " where deptno=" + deptno + " and job='MANAGER'"; // 关闭自动提交 con.setAutoCommit(false); // 执行SQL语句 stmt.executeUpdate(sql1); stmt.executeUpdate(sql2); // 提交 con.commit(); } catch (SQLException e) { try { con.rollback(); } catch (SQLException e1) { System.out.println("回滚事务异常!"); thrownew RuntimeException(e1); } System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findSalByEname(String ename) { ... ... } publicvoid findSalByEname1(String ename) { ... ... } }
运行EmpDAO类,然后查看Oracle数据库中的emp表,会发现部门编号为20的、职位为“ANALYST”和“MANAGER”的员工的工资进行了提升。
本案例中,类EmpDAO的完整代码如下所示:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; publicclass EmpDAO { publicstaticvoid main(String[] args) { EmpDAO dao = new EmpDAO(); // dao.findSalByEname("CLARK"); // dao.findSalByEname("a' OR 'b'='b"); // dao.findSalByEname1("CLARK"); // dao.findSalByEname1("a' OR 'b'='b"); // 事务管理 // dao.updateSalByDeptno(20); } publicvoid updateSalByDeptno(int deptno) { Connection con = null; Statement stmt = null; try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); // 插入数据的SQL语句 String sql1 = "update emp set sal =sal*1.2" + " where deptno=" + deptno + " and job='ANALYST'"; String sql2 = "update emp set sal =sal*1.3" + " where deptno=" + deptno + " and job='MANAGER'"; // 关闭自动提交 con.setAutoCommit(false); // 执行SQL语句 stmt.executeUpdate(sql1); stmt.executeUpdate(sql2); // 提交 con.commit(); } catch (SQLException e) { try { con.rollback(); } catch (SQLException e1) { System.out.println("回滚事务异常!"); thrownew RuntimeException(e1); } System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findSalByEname(String ename) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; String sql = null; try { sql = "select sal from emp where ename = ?"; con = ConnectionSource.getConnection(); stmt = con.prepareStatement(sql); stmt.setString(1, ename); rs = stmt.executeQuery(); while (rs.next()) { double sal = rs.getDouble("sal"); System.out.println(sal); } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源发生异常"); } } } publicvoid findSalByEname1(String ename) { Connection con = null; Statement stmt = null; ResultSet rs = null; String sql = null; try { sql = "select sal from emp where ename = '" + ename + "'"; System.out.println(sql); con = ConnectionSource.getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery(sql); while (rs.next()) { double sal = rs.getDouble("sal"); System.out.println(sal); } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源发生异常"); } } } }
db.properties文件的内容与之前案例一样没有变化,该文件完整内容如下所示:
jdbc.driverClassName=oracle.jdbc.OracleDriver jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl jdbc.username=scott jdbc.password=tiger #<!-- 初始化连接 --> dataSource.initialSize=10 #<!-- 最大空闲连接 --> dataSource.maxIdle=20 #<!-- 最小空闲连接 --> dataSource.minIdle=5 #最大连接数量 dataSource.maxActive=50 #<!-- 超时等待时间以毫秒为单位 (6000毫秒/1000等于60秒 )--> dataSource.maxWait=1000
ConnectionSource类与之前案例一样没有变化,该类完整内容如下所示:
import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import org.apache.commons.dbcp.BasicDataSource; public class ConnectionSource { private static BasicDataSource dataSource = null; public ConnectionSource() { } public static void init() { Properties dbProps = new Properties(); // 取配置文件可以根据实际的不同修改 try { dbProps.load(ConnectionSource.class.getClassLoader().getResourceAsStream( "day01/v4/db.properties")); } catch (IOException e) { e.printStackTrace(); } try { String driveClassName = dbProps.getProperty("jdbc.driverClassName"); String url = dbProps.getProperty("jdbc.url"); String username = dbProps.getProperty("jdbc.username"); String password = dbProps.getProperty("jdbc.password"); String initialSize = dbProps.getProperty("dataSource.initialSize"); String minIdle = dbProps.getProperty("dataSource.minIdle"); String maxIdle = dbProps.getProperty("dataSource.maxIdle"); String maxWait = dbProps.getProperty("dataSource.maxWait"); String maxActive = dbProps.getProperty("dataSource.maxActive"); dataSource = new BasicDataSource(); dataSource.setDriverClassName(driveClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); // 初始化连接数 if (initialSize != null) dataSource.setInitialSize(Integer.parseInt(initialSize)); // 最小空闲连接 if (minIdle != null) dataSource.setMinIdle(Integer.parseInt(minIdle)); // 最大空闲连接 if (maxIdle != null) dataSource.setMaxIdle(Integer.parseInt(maxIdle)); // 超时回收时间(以毫秒为单位) if (maxWait != null) dataSource.setMaxWait(Long.parseLong(maxWait)); // 最大连接数 if (maxActive != null) { if (!maxActive.trim().equals("0")) dataSource.setMaxActive(Integer.parseInt(maxActive)); } } catch (Exception e) { e.printStackTrace(); System.out.println("创建连接池失败!请检查设置!!!"); } } public static synchronized Connection getConnection() throws SQLException { if (dataSource == null) { init(); } Connection conn = null; if (dataSource != null) { conn = dataSource.getConnection(); } return conn; } }
向Dept表中批量插入100条数据,需要插入数据的列为deptno、dname,这两列的数据要求如下:
1. deptno列的数据通过序列dept_seq自动生成;
2. dname列的数据为字符串,格式为:“name”+循环次数i。
参考答案
实现此案例需要按照如下步骤进行。
步骤一:在Oracle数据库中创建序列dept_seq
在Oracle数据库中创建名为dept_seq的序列,该序列的起始值为1、步进为1,SQL语句如下所示:
create sequence dept_seq start with 1 increment by 1;
步骤二:准备JDBC操作数据库的基本代码
首先,新建类Batch,在该类中新建batchAdd方法;然后,准备数据库连接Connection对象、操作SQL语句的Statement对象以及设置事务管理;最后进行异常的处理,代码如下所示:
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Random; publicclass Batch { publicvoid batchAdd() { Connection con = null; Statement stmt = null; String sql = null; try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); // 关闭自动提交 con.setAutoCommit(false); // 提交 con.commit(); } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicstaticvoid main(String args[]) { } }
步骤三:批量向Dept表中插入数据
使用Statement的addBatch方法和executeBatch方法,批量向Dept表中插入数据,代码如下所示:
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Random; publicclass Batch { publicvoid batchAdd() { Connection con = null; Statement stmt = null; String sql = null; try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); // 关闭自动提交 con.setAutoCommit(false); #cold_bold for (int i = 0; i < 100; i++) { #cold_bold // 插入数据的SQL语句 #cold_bold sql = "insert into dept(deptno, dname, loc) values(" #cold_bold + "dept_seq.nextval, 'name" + i + "', " #cold_bold + new Random().nextInt(10000) + ")"; #cold_bold System.out.println(sql); #cold_bold // 将SQL语句加入到Batch中 #cold_bold stmt.addBatch(sql); #cold_bold } #cold_bold // 执行批处理 #cold_bold stmt.executeBatch(); // 提交 con.commit(); } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicstaticvoid main(String args[]) { } }
步骤四:测试是否批量插入数据成功
在Batch类的main方法中,调用batchAdd方法,代码如下所示:
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Random; publicclass Batch { publicvoid batchAdd() { Connection con = null; Statement stmt = null; String sql = null; try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); // 关闭自动提交 con.setAutoCommit(false); for (int i = 0; i < 100; i++) { // 插入数据的SQL语句 sql = "insert into dept(deptno, dname, loc) values(" + "dept_seq.nextval, 'name" + i + "', " + new Random().nextInt(10000) + ")"; System.out.println(sql); // 将SQL语句加入到Batch中 stmt.addBatch(sql); } // 执行批处理 stmt.executeBatch(); // 提交 con.commit(); } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicstaticvoid main(String args[]) { #cold_bold Batch batch = new Batch(); #cold_bold batch.batchAdd(); } }
运行Batch类,然后去查看Oracle数据库中的Dept表,会发现批量向该表中插入了100条记录。
本案例中,Batch类的完整代码如下所示:
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Random; publicclass Batch { publicvoid batchAdd() { Connection con = null; Statement stmt = null; String sql = null; try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); // 关闭自动提交 con.setAutoCommit(false); for (int i = 0; i < 100; i++) { // 插入数据的SQL语句 sql = "insert into dept(deptno, dname, loc) values(" + "dept_seq.nextval, 'name" + i + "', " + new Random().nextInt(10000) + ")"; System.out.println(sql); // 将SQL语句加入到Batch中 stmt.addBatch(sql); } // 执行批处理 stmt.executeBatch(); // 提交 con.commit(); } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicstaticvoid main(String args[]) { Batch batch = new Batch(); batch.batchAdd(); } }
db.properties文件的内容与之前案例一样没有变化,该文件完整内容如下所示:
jdbc.driverClassName=oracle.jdbc.OracleDriver jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl jdbc.username=scott jdbc.password=tiger #<!-- 初始化连接 --> dataSource.initialSize=10 #<!-- 最大空闲连接 --> dataSource.maxIdle=20 #<!-- 最小空闲连接 --> dataSource.minIdle=5 #最大连接数量 dataSource.maxActive=50 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> dataSource.maxWait=1000
ConnectionSource类与之前案例一样没有变化,该类完整内容如下所示:
import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import org.apache.commons.dbcp.BasicDataSource; public class ConnectionSource { private static BasicDataSource dataSource = null; public ConnectionSource() { } public static void init() { Properties dbProps = new Properties(); // 取配置文件可以根据实际的不同修改 try { dbProps.load(ConnectionSource.class.getClassLoader().getResourceAsStream( "day01/v4/db.properties")); } catch (IOException e) { e.printStackTrace(); } try { String driveClassName = dbProps.getProperty("jdbc.driverClassName"); String url = dbProps.getProperty("jdbc.url"); String username = dbProps.getProperty("jdbc.username"); String password = dbProps.getProperty("jdbc.password"); String initialSize = dbProps.getProperty("dataSource.initialSize"); String minIdle = dbProps.getProperty("dataSource.minIdle"); String maxIdle = dbProps.getProperty("dataSource.maxIdle"); String maxWait = dbProps.getProperty("dataSource.maxWait"); String maxActive = dbProps.getProperty("dataSource.maxActive"); dataSource = new BasicDataSource(); dataSource.setDriverClassName(driveClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); // 初始化连接数 if (initialSize != null) dataSource.setInitialSize(Integer.parseInt(initialSize)); // 最小空闲连接 if (minIdle != null) dataSource.setMinIdle(Integer.parseInt(minIdle)); // 最大空闲连接 if (maxIdle != null) dataSource.setMaxIdle(Integer.parseInt(maxIdle)); // 超时回收时间(以毫秒为单位) if (maxWait != null) dataSource.setMaxWait(Long.parseLong(maxWait)); // 最大连接数 if (maxActive != null) { if (!maxActive.trim().equals("0")) dataSource.setMaxActive(Integer.parseInt(maxActive)); } } catch (Exception e) { e.printStackTrace(); System.out.println("创建连接池失败!请检查设置!!!"); } } public static synchronized Connection getConnection() throws SQLException { if (dataSource == null) { init(); } Connection conn = null; if (dataSource != null) { conn = dataSource.getConnection(); } return conn; } }
向Emp表中插入一个团队成员,该团队的成员信息如图-1所示。
图-1
从图-1可以看出tom为这个团队的管理者,其他三位员工的管理者ID(mgr) 都为1,而1是管理者tom的员工编号(empno)。
要求向Emp表插入以上四个员工的信息。职员marry、terry、jim的管理者ID(mgr)为刚刚插入Emp表的管理者tom的员工编号(empno)的数据。另外,Emp表的主键列empno的数据通过序列emp_seq获得。
参考答案
实现此案例需要按照如下步骤进行。
步骤一:创建序列emp_seq
在Oracle数据库中创建序列名为emp_seq,该序列的起始值为1、步进为1,SQL语句如下所示:
create sequence emp_seq start with 1 increment by 1;
步骤二:创建Emp类
Emp类为实体类和数据表emp之间的映射,该类的代码如下所示:
public class Emp { private int empNo; private String ename; private String job; private int mgr; private String hiredate; private double sal; private double comm; private int deptno; public Emp() { super(); } public Emp(int empNo, String ename, String job, int mgr, String hiredate, double sal, double comm, int deptno) { super(); this.empNo = empNo; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; this.sal = sal; this.comm = comm; this.deptno = deptno; } public int getEmpNo() { return empNo; } public void setEmpNo(int empNo) { this.empNo = empNo; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public int getMgr() { return mgr; } public void setMgr(int mgr) { this.mgr = mgr; } public String getHiredate() { return hiredate; } public void setHiredate(String hiredate) { this.hiredate = hiredate; } public double getSal() { return sal; } public void setSal(double sal) { this.sal = sal; } public double getComm() { return comm; } public void setComm(double comm) { this.comm = comm; } public int getDeptno() { return deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } }
步骤三:准备JDBC操作数据库的基本代码
首先,在EmpDAO类中新建addTeam方法,该方法的声明如下:
publicvoid addTeam(List<Emp> emps)
该方法用于实现向Emp表插入一个团队的数据。其中参数emps表示该团队的所有员工,在集合emps中的索引为0的位置存储管理者,索引为1、2、3的位置存储该管理者下属的三名员工。
然后,准备数据库连接Connection对象、操作SQL语句的PreparedStatement对象以及设置事务管理;最后进行异常的处理,代码如下所示:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; publicclass EmpDAO { publicstaticvoid main(String[] args) { EmpDAO dao = new EmpDAO(); // dao.findSalByEname("CLARK"); // dao.findSalByEname("a' OR 'b'='b"); // dao.findSalByEname1("CLARK"); // dao.findSalByEname1("a' OR 'b'='b"); // 事务管理 // dao.updateSalByDeptno(20); } publicvoid addTeam(List<Emp> emps) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; String sql = null; try { con = ConnectionSource.getConnection(); // 关闭自动提交 con.setAutoCommit(false); con.commit(); } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid updateSalByDeptno(int deptno) { ... ... } publicvoid findSalByEname(String ename) { ... ... } publicvoid findSalByEname1(String ename) { ... ... } }
步骤四:实现向Emp表中插入一个团队
向Emp表中插入数据,并使用PreparedStatement的getGeneratedKeys方法获得刚刚生成的主键,代码如下所示:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; publicclass EmpDAO { publicstaticvoid main(String[] args) { EmpDAO dao = new EmpDAO(); // dao.findSalByEname("CLARK"); // dao.findSalByEname("a' OR 'b'='b"); // dao.findSalByEname1("CLARK"); // dao.findSalByEname1("a' OR 'b'='b"); // 事务管理 // dao.updateSalByDeptno(20); } publicvoid addTeam(List<Emp> emps) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; String sql = null; try { con = ConnectionSource.getConnection(); // 关闭自动提交 con.setAutoCommit(false); #cold_bold #cold_bold sql = "insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)" #cold_bold + " values(emp_seq.nextval,?,?,?,to_date(?,'yyyy-mm-dd'),?,?,?)"; #cold_bold stmt = con.prepareStatement(sql, new String[] { "empno" }); #cold_bold int mgr = 0; #cold_bold for (int i = 0; i < emps.size(); i++) { #cold_bold Emp emp = (Emp) emps.get(i); #cold_bold stmt.setString(1, emp.getEname()); #cold_bold stmt.setString(2, emp.getJob()); #cold_bold if (i == 0) { #cold_bold stmt.setInt(3, emp.getMgr()); #cold_bold } else { #cold_bold stmt.setInt(3, mgr); #cold_bold } #cold_bold stmt.setString(4, emp.getHiredate()); #cold_bold stmt.setDouble(5, emp.getSal()); #cold_bold stmt.setDouble(6, emp.getComm()); #cold_bold stmt.setInt(7, emp.getDeptno()); #cold_bold stmt.executeUpdate(); #cold_bold if (i == 0) { #cold_bold rs = stmt.getGeneratedKeys(); #cold_bold if (rs.next()) { #cold_bold mgr = rs.getInt(1); #cold_bold } #cold_bold } #cold_bold } con.commit(); } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid updateSalByDeptno(int deptno) { ... ... } publicvoid findSalByEname(String ename) { ... ... } publicvoid findSalByEname1(String ename) { ... ... } }
步骤五:测试
按照图-1所示的数据构造四个Emp对象,并将这四个对象按照步骤三所描述的顺序存储到List集合中;然后将List集合对象作为参数传递给addTeam方法,代码如下所示:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; publicclass EmpDAO { publicstaticvoid main(String[] args) { EmpDAO dao = new EmpDAO(); // dao.findSalByEname("CLARK"); // dao.findSalByEname("a' OR 'b'='b"); // dao.findSalByEname1("CLARK"); // dao.findSalByEname1("a' OR 'b'='b"); // 事务管理 // dao.updateSalByDeptno(20); #cold_bold // 将管理者放置在索引为0的位置 #cold_bold List<Emp> emps = new ArrayList<Emp>(); #cold_bold Emp emp1=new Emp(); #cold_bold emp1.setEname("tom"); #cold_bold emp1.setJob("manager"); #cold_bold emp1.setMgr(7839); #cold_bold emp1.setHiredate("2014-05-01"); #cold_bold emp1.setSal(5000); #cold_bold emp1.setComm(300); #cold_bold emp1.setDeptno(30); #cold_bold #cold_bold Emp emp2=new Emp(); #cold_bold emp2.setEname("marry"); #cold_bold emp2.setJob("clerk"); #cold_bold emp2.setMgr(1); #cold_bold emp2.setHiredate("2014-05-28"); #cold_bold emp2.setSal(2000); #cold_bold emp2.setDeptno(30); #cold_bold #cold_bold Emp emp3=new Emp(); #cold_bold emp3.setEname("terry"); #cold_bold emp3.setJob("salesman"); #cold_bold emp3.setMgr(1); #cold_bold emp3.setHiredate("2014-05-29"); #cold_bold emp3.setSal(2500); #cold_bold emp3.setComm(200); #cold_bold emp3.setDeptno(30); #cold_bold #cold_bold Emp emp4=new Emp(); #cold_bold emp4.setEname("jim"); #cold_bold emp4.setJob("salesman"); #cold_bold emp4.setMgr(1); #cold_bold emp4.setHiredate("2014-05-26"); #cold_bold emp4.setSal(2500); #cold_bold emp4.setComm(200); #cold_bold emp4.setDeptno(30); #cold_bold #cold_bold emps.add(emp1); #cold_bold emps.add(emp2); #cold_bold emps.add(emp3); #cold_bold emps.add(emp4); #cold_bold #cold_bold dao.addTeam(emps); } publicvoid addTeam(List<Emp> emps) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; String sql = null; try { con = ConnectionSource.getConnection(); // 关闭自动提交 con.setAutoCommit(false); // 插入主表 sql = "insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)" + " values(emp_seq.nextval,?,?,?,to_date(?,'yyyy-mm-dd'),?,?,?)"; stmt = con.prepareStatement(sql, new String[] { "empno" }); int mgr = 0; for (int i = 0; i < emps.size(); i++) { Emp emp = (Emp) emps.get(i); stmt.setString(1, emp.getEname()); stmt.setString(2, emp.getJob()); if (i == 0) { stmt.setInt(3, emp.getMgr()); } else { stmt.setInt(3, mgr); } stmt.setString(4, emp.getHiredate()); stmt.setDouble(5, emp.getSal()); stmt.setDouble(6, emp.getComm()); stmt.setInt(7, emp.getDeptno()); stmt.executeUpdate(); if (i == 0) { rs = stmt.getGeneratedKeys(); if (rs.next()) { mgr = rs.getInt(1); } } } con.commit(); } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid updateSalByDeptno(int deptno) { ... ... } publicvoid findSalByEname(String ename) { ... ... } publicvoid findSalByEname1(String ename) { ... ... } }
运行上述代码,向Emp表插入了四条记录。其中一条记录为管理者信息,如果管理者的员工ID为1,那个其余三条员工记录的管理者ID为1。
本案例中,Emp类的完整代码如下:
public class Emp { private int empNo; private String ename; private String job; private int mgr; private String hiredate; private double sal; private double comm; private int deptno; public Emp() { super(); } public Emp(int empNo, String ename, String job, int mgr, String hiredate, double sal, double comm, int deptno) { super(); this.empNo = empNo; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; this.sal = sal; this.comm = comm; this.deptno = deptno; } public int getEmpNo() { return empNo; } public void setEmpNo(int empNo) { this.empNo = empNo; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public int getMgr() { return mgr; } public void setMgr(int mgr) { this.mgr = mgr; } public String getHiredate() { return hiredate; } public void setHiredate(String hiredate) { this.hiredate = hiredate; } public double getSal() { return sal; } public void setSal(double sal) { this.sal = sal; } public double getComm() { return comm; } public void setComm(double comm) { this.comm = comm; } public int getDeptno() { return deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } }
EmpDAO类的完整代码如下所示:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; publicclass EmpDAO { publicstaticvoid main(String[] args) { EmpDAO dao = new EmpDAO(); // dao.findSalByEname("CLARK"); // dao.findSalByEname("a' OR 'b'='b"); // dao.findSalByEname1("CLARK"); // dao.findSalByEname1("a' OR 'b'='b"); // 事务管理 // dao.updateSalByDeptno(20); // 将管理者放置在emps(0)位置 List<Emp> emps = new ArrayList<Emp>(); Emp emp1=new Emp(); emp1.setEname("tom"); emp1.setJob("manager"); emp1.setMgr(7839); emp1.setHiredate("2014-05-01"); emp1.setSal(5000); emp1.setComm(300); emp1.setDeptno(30); Emp emp2=new Emp(); emp2.setEname("marry"); emp2.setJob("clerk"); emp2.setMgr(1); emp2.setHiredate("2014-05-28"); emp2.setSal(2000); emp2.setDeptno(30); Emp emp3=new Emp(); emp3.setEname("terry"); emp3.setJob("salesman"); emp3.setMgr(1); emp3.setHiredate("2014-05-29"); emp3.setSal(2500); emp3.setComm(200); emp3.setDeptno(30); Emp emp4=new Emp(); emp4.setEname("jim"); emp4.setJob("salesman"); emp4.setMgr(1); emp4.setHiredate("2014-05-26"); emp4.setSal(2500); emp4.setComm(200); emp4.setDeptno(30); emps.add(emp1); emps.add(emp2); emps.add(emp3); emps.add(emp4); dao.addTeam(emps); } publicvoid addTeam(List<Emp> emps) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; String sql = null; try { con = ConnectionSource.getConnection(); // 关闭自动提交 con.setAutoCommit(false); // 插入主表 sql = "insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)" + " values(emp_seq.nextval,?,?,?,to_date(?,'yyyy-mm-dd'),?,?,?)"; stmt = con.prepareStatement(sql, new String[] { "empno" }); int mgr = 0; for (int i = 0; i < emps.size(); i++) { Emp emp = (Emp) emps.get(i); stmt.setString(1, emp.getEname()); stmt.setString(2, emp.getJob()); if (i == 0) { stmt.setInt(3, emp.getMgr()); } else { stmt.setInt(3, mgr); } stmt.setString(4, emp.getHiredate()); stmt.setDouble(5, emp.getSal()); stmt.setDouble(6, emp.getComm()); stmt.setInt(7, emp.getDeptno()); stmt.executeUpdate(); if (i == 0) { rs = stmt.getGeneratedKeys(); if (rs.next()) { mgr = rs.getInt(1); } } } con.commit(); } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid updateSalByDeptno(int deptno) { Connection con = null; Statement stmt = null; try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); // 插入数据的SQL语句 String sql1 = "update emp set sal =sal*1.2" + " where deptno=" + deptno + " and job='ANALYST'"; String sql2 = "update emp set sal =sal*1.3" + " where deptno=" + deptno + " and job='MANAGER'"; // 关闭自动提交 con.setAutoCommit(false); // 执行SQL语句 stmt.executeUpdate(sql1); stmt.executeUpdate(sql2); // 提交 con.commit(); } catch (SQLException e) { try { con.rollback(); } catch (SQLException e1) { System.out.println("回滚事务异常!"); thrownew RuntimeException(e1); } System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findSalByEname(String ename) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; String sql = null; try { sql = "select sal from emp where ename = ?"; con = ConnectionSource.getConnection(); stmt = con.prepareStatement(sql); stmt.setString(1, ename); rs = stmt.executeQuery(); while (rs.next()) { double sal = rs.getDouble("sal"); System.out.println(sal); } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源发生异常"); } } } publicvoid findSalByEname1(String ename) { Connection con = null; Statement stmt = null; ResultSet rs = null; String sql = null; try { sql = "select sal from emp where ename = '" + ename + "'"; System.out.println(sql); con = ConnectionSource.getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery(sql); while (rs.next()) { double sal = rs.getDouble("sal"); System.out.println(sal); } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源发生异常"); } } } }
db.properties文件的内容与之前案例一样没有变化,该文件完整内容如下所示:
jdbc.driverClassName=oracle.jdbc.OracleDriver jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl jdbc.username=scott jdbc.password=tiger #<!-- 初始化连接 --> dataSource.initialSize=10 #<!-- 最大空闲连接 --> dataSource.maxIdle=20 #<!-- 最小空闲连接 --> dataSource.minIdle=5 #最大连接数量 dataSource.maxActive=50 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> dataSource.maxWait=1000
ConnectionSource类与之前案例一样没有变化,该类完整内容如下所示:
import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import org.apache.commons.dbcp.BasicDataSource; public class ConnectionSource { private static BasicDataSource dataSource = null; public ConnectionSource() { } public static void init() { Properties dbProps = new Properties(); // 取配置文件可以根据实际的不同修改 try { dbProps.load(ConnectionSource.class.getClassLoader().getResourceAsStream( "day01/v4/db.properties")); } catch (IOException e) { e.printStackTrace(); } try { String driveClassName = dbProps.getProperty("jdbc.driverClassName"); String url = dbProps.getProperty("jdbc.url"); String username = dbProps.getProperty("jdbc.username"); String password = dbProps.getProperty("jdbc.password"); String initialSize = dbProps.getProperty("dataSource.initialSize"); String minIdle = dbProps.getProperty("dataSource.minIdle"); String maxIdle = dbProps.getProperty("dataSource.maxIdle"); String maxWait = dbProps.getProperty("dataSource.maxWait"); String maxActive = dbProps.getProperty("dataSource.maxActive"); dataSource = new BasicDataSource(); dataSource.setDriverClassName(driveClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); // 初始化连接数 if (initialSize != null) dataSource.setInitialSize(Integer.parseInt(initialSize)); // 最小空闲连接 if (minIdle != null) dataSource.setMinIdle(Integer.parseInt(minIdle)); // 最大空闲连接 if (maxIdle != null) dataSource.setMaxIdle(Integer.parseInt(maxIdle)); // 超时回收时间(以毫秒为单位) if (maxWait != null) dataSource.setMaxWait(Long.parseLong(maxWait)); // 最大连接数 if (maxActive != null) { if (!maxActive.trim().equals("0")) dataSource.setMaxActive(Integer.parseInt(maxActive)); } } catch (Exception e) { e.printStackTrace(); System.out.println("创建连接池失败!请检查设置!!!"); } } public static synchronized Connection getConnection() throws SQLException { if (dataSource == null) { init(); } Connection conn = null; if (dataSource != null) { conn = dataSource.getConnection(); } return conn; } }
使用JDBC分别连接Oracle数据库和MySQL数据库,实现对Dept表数据的分页查询功能。
参考答案
实现此案例需要按照如下步骤进行。
步骤一:添加方法findByPageOracle方法,并构建该方法的骨架代码
首先,在DeptDAO类中添加方法findByPageOracle,该方法的声明如下所示:
publicvoid findByPageOracle(int page, int pageSize) {}
其中,参数page表示要查询的页码、参数pageSize表示每页显示的记录数。
然后,构建findByPageOracle方法的骨架代码,代码如下所示:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; publicclass DeptDAO { publicstaticvoid main(String[] args) { // 1.select DeptDAO dao = new DeptDAO(); //dao.findAll(); // 2.insert Dept dept = new Dept(50, "developer", "Beijing"); // dao.add(dept); // 3.update dept.setLoc("ShangHai"); //dao.update(dept); } /** * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ #cold_bold publicvoid findByPageOracle(int page, int pageSize) { #cold_bold #cold_bold } publicvoid findAll() { ... ... } publicvoid add(Dept dept) { ... ... } publicvoid update(Dept dept) { ... ... } }
步骤二:定义SQL语句
在findByPageOracle方法中,定义变量sql_total以及sql来表示两条SQL语句,一条用于查询Emp表的总记录数,另一条作为分页的SQL语句,代码如下所示:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; publicclass DeptDAO { publicstaticvoid main(String[] args) { // 1.select DeptDAO dao = new DeptDAO(); //dao.findAll(); // 2.insert Dept dept = new Dept(50, "developer", "Beijing"); // dao.add(dept); // 3.update dept.setLoc("ShangHai"); //dao.update(dept); } /** * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ publicvoid findByPageOracle(int page, int pageSize) { #cold_bold String sql_total = "select count(*) from dept"; #cold_bold String sql = "select * from " #cold_bold + "(select rownum rn, deptno, dname ,loc from " #cold_bold + "(select * from dept order by deptno) )" #cold_bold + " where rn between ? and ?"; } publicvoid findAll() { ... ... } publicvoid add(Dept dept) { ... ... } publicvoid update(Dept dept) { ... ... } }
步骤三:查询Dept表的总记录数
获取数据库连接,使用PreparedStatement执行SQL语句(sql_total变量定义的SQL语句),获取数据库中Dept表的总记录数,代码如下所示:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; publicclass DeptDAO { publicstaticvoid main(String[] args) { // 1.select DeptDAO dao = new DeptDAO(); //dao.findAll(); // 2.insert Dept dept = new Dept(50, "developer", "Beijing"); // dao.add(dept); // 3.update dept.setLoc("ShangHai"); //dao.update(dept); } /** * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ publicvoid findByPageOracle(int page, int pageSize) { #cold_bold Connection con = null; #cold_bold PreparedStatement stmt = null; #cold_bold ResultSet rs = null; #cold_bold int total = -1;// 总记录数 String sql_total = "select count(*) from dept"; String sql = "select * from " + "(select rownum rn, deptno, dname ,loc from " + "(select * from dept order by deptno) )" + " where rn between ? and ?"; #cold_bold try { #cold_bold con = ConnectionSource.getConnection(); #cold_bold stmt = con.prepareStatement(sql_total); #cold_bold #cold_bold // 获得总的记录数 #cold_bold rs = stmt.executeQuery(); #cold_bold if (rs.next()) { #cold_bold total = rs.getInt(1); #cold_bold } #cold_bold } catch (SQLException e) { #cold_bold System.out.println("数据库访问异常!"); #cold_bold thrownew RuntimeException(e); #cold_bold } finally { #cold_bold try { #cold_bold if (rs != null) { #cold_bold rs.close(); #cold_bold } #cold_bold if (stmt != null) { #cold_bold stmt.close(); #cold_bold } #cold_bold if (con != null) { #cold_bold con.close(); #cold_bold } #cold_bold } catch (SQLException e) { #cold_bold System.out.println("释放资源时发生异常"); #cold_bold } #cold_bold } } publicvoid findAll() { ... ... } publicvoid add(Dept dept) { ... ... } publicvoid update(Dept dept) { ... ... } }
步骤四:计算总页数
将总记录数与每页记录数取余数,如果余数为0,则总页数等于总记录数除以每页记录数的商;如果余数不为0,则总页数等于总记录数除以每页记录数的商的基础上加1,代码如下所示:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; publicclass DeptDAO { publicstaticvoid main(String[] args) { // 1.select DeptDAO dao = new DeptDAO(); //dao.findAll(); // 2.insert Dept dept = new Dept(50, "developer", "Beijing"); // dao.add(dept); // 3.update dept.setLoc("ShangHai"); //dao.update(dept); } /** * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ publicvoid findByPageOracle(int page, int pageSize) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; int total = -1;// 总记录数 #cold_bold int pages = -1;// 总页数 String sql_total = "select count(*) from dept"; String sql = "select * from " + "(select rownum rn, deptno, dname ,loc from " + "(select * from dept order by deptno) )" + " where rn between ? and ?"; try { con = ConnectionSource.getConnection(); stmt = con.prepareStatement(sql_total); // 获得总的记录数 rs = stmt.executeQuery(); if (rs.next()) { total = rs.getInt(1); } #cold_bold // 计算总共需要多少页 #cold_bold int mod = total % pageSize; #cold_bold if (mod == 0) #cold_bold pages = total / pageSize; #cold_bold else #cold_bold pages = total / pageSize + 1; } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findAll() { ... ... } publicvoid add(Dept dept) { ... ... } publicvoid update(Dept dept) { ... ... } }
步骤五:边界判断
如果要查看的页码大于总页数,则要查看的页码等于总页数;如果要查看的页码小于1,则要查看的页码等于1,代码如下所示:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; publicclass DeptDAO { publicstaticvoid main(String[] args) { // 1.select DeptDAO dao = new DeptDAO(); //dao.findAll(); // 2.insert Dept dept = new Dept(50, "developer", "Beijing"); // dao.add(dept); // 3.update dept.setLoc("ShangHai"); //dao.update(dept); } /** * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ publicvoid findByPageOracle(int page, int pageSize) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; int total = -1;// 总记录数 int pages = -1;// 总页数 String sql_total = "select count(*) from dept"; String sql = "select * from " + "(select rownum rn, deptno, dname ,loc from " + "(select * from dept order by deptno) )" + " where rn between ? and ?"; try { con = ConnectionSource.getConnection(); stmt = con.prepareStatement(sql_total); // 获得总的记录数 rs = stmt.executeQuery(); if (rs.next()) { total = rs.getInt(1); } // 计算总共需要多少页 int mod = total % pageSize; if (mod == 0) pages = total / pageSize; else pages = total / pageSize + 1; #cold_bold // 如果要查看的页数大于最大页,或者小于1,则取最后一页或第一页 #cold_bold if (page > pages) #cold_bold page = pages; #cold_bold elseif (page < 1) { #cold_bold page = 1; #cold_bold } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findAll() { ... ... } publicvoid add(Dept dept) { ... ... } publicvoid update(Dept dept) { ... ... } }
步骤六:计算取记录的起始位置和结束位置
起始位置(begin)的计算公式如下:
int begin = (page - 1) * pageSize + 1;
结束位置(end)的计算公式如下:
int end = begin + pageSize - 1;
在findByPageOracle方法中的实现代码如下所示:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; publicclass DeptDAO { publicstaticvoid main(String[] args) { // 1.select DeptDAO dao = new DeptDAO(); //dao.findAll(); // 2.insert Dept dept = new Dept(50, "developer", "Beijing"); // dao.add(dept); // 3.update dept.setLoc("ShangHai"); //dao.update(dept); } /** * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ publicvoid findByPageOracle(int page, int pageSize) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; int total = -1;// 总记录数 int pages = -1;// 总页数 String sql_total = "select count(*) from dept"; String sql = "select * from " + "(select rownum rn, deptno, dname ,loc from " + "(select * from dept order by deptno) )" + " where rn between ? and ?"; try { con = ConnectionSource.getConnection(); stmt = con.prepareStatement(sql_total); // 获得总的记录数 rs = stmt.executeQuery(); if (rs.next()) { total = rs.getInt(1); } // 计算总共需要多少页 int mod = total % pageSize; if (mod == 0) pages = total / pageSize; else pages = total / pageSize + 1; // 如果要查看的页数大于最大页,或者小于1,则取最后一页或第一页 if (page > pages) page = pages; elseif (page < 1) { page = 1; } #cold_bold int begin = (page - 1) * pageSize + 1; #cold_bold int end = begin + pageSize - 1; } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findAll() { ... ... } publicvoid add(Dept dept) { ... ... } publicvoid update(Dept dept) { ... ... } }
步骤七:执行分页查询SQL语句
在findByPageOracle方法中执行分页查询的代码如下所示:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; publicclass DeptDAO { publicstaticvoid main(String[] args) { // 1.select DeptDAO dao = new DeptDAO(); //dao.findAll(); // 2.insert Dept dept = new Dept(50, "developer", "Beijing"); // dao.add(dept); // 3.update dept.setLoc("ShangHai"); //dao.update(dept); } /** * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ publicvoid findByPageOracle(int page, int pageSize) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; int total = -1;// 总记录数 int pages = -1;// 总页数 String sql_total = "select count(*) from dept"; String sql = "select * from " + "(select rownum rn, deptno, dname ,loc from " + "(select * from dept order by deptno) )" + " where rn between ? and ?"; try { con = ConnectionSource.getConnection(); stmt = con.prepareStatement(sql_total); // 获得总的记录数 rs = stmt.executeQuery(); if (rs.next()) { total = rs.getInt(1); } // 计算总共需要多少页 int mod = total % pageSize; if (mod == 0) pages = total / pageSize; else pages = total / pageSize + 1; // 如果要查看的页数大于最大页,或者小于1,则取最后一页或第一页 if (page > pages) page = pages; elseif (page < 1) { page = 1; } int begin = (page - 1) * pageSize + 1; int end = begin + pageSize - 1; #cold_bold stmt = con.prepareStatement(sql); #cold_bold stmt.setInt(1, begin); #cold_bold stmt.setInt(2, end); #cold_bold rs = stmt.executeQuery(); #cold_bold while (rs.next()) { #cold_bold System.out.println(rs.getInt("deptno") + "," #cold_bold + rs.getString("dname") + "," #cold_bold + rs.getString("loc")); #cold_bold } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findAll() { ... ... } publicvoid add(Dept dept) { ... ... } publicvoid update(Dept dept) { ... ... } }
步骤八:测试
在DeptDAO类的main方法中调用findByPageOracle方法,代码如下所示:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; publicclass DeptDAO { publicstaticvoid main(String[] args) { // 1.select DeptDAO dao = new DeptDAO(); //dao.findAll(); // 2.insert Dept dept = new Dept(50, "developer", "Beijing"); // dao.add(dept); // 3.update dept.setLoc("ShangHai"); //dao.update(dept); // 4.findByPageOracle #cold_bold dao.findByPageOracle(2, 3);// 查看第二页,每页3条 } /** * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ publicvoid findByPageOracle(int page, int pageSize) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; int total = -1;// 总记录数 int pages = -1;// 总页数 String sql_total = "select count(*) from dept"; String sql = "select * from " + "(select rownum rn, deptno, dname ,loc from " + "(select * from dept order by deptno) )" + " where rn between ? and ?"; try { con = ConnectionSource.getConnection(); stmt = con.prepareStatement(sql_total); // 获得总的记录数 rs = stmt.executeQuery(); if (rs.next()) { total = rs.getInt(1); } // 计算总共需要多少页 int mod = total % pageSize; if (mod == 0) pages = total / pageSize; else pages = total / pageSize + 1; // 如果要查看的页数大于最大页,或者小于1,则取最后一页或第一页 if (page > pages) page = pages; elseif (page < 1) { page = 1; } int begin = (page - 1) * pageSize + 1; int end = begin + pageSize - 1; stmt = con.prepareStatement(sql); stmt.setInt(1, begin); stmt.setInt(2, end); rs = stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getInt("deptno") + "," + rs.getString("dname") + "," + rs.getString("loc")); } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findAll() { ... ... } publicvoid add(Dept dept) { ... ... } publicvoid update(Dept dept) { ... ... } }
运行DeptDAO类,在控制台会输出第二页的三条数据。
步骤九:连接MySQL数据库,实现对Dept表中数据的分页查询
连接MySQL数据库,实现对Dept表中数据的分页查询,与连接Oracle是类似的。需要注意的是将db.properties文件中连接数据库的信息改为与MySQL数据库相关的,该文件内容如下:
#jdbc.driverClassName=oracle.jdbc.OracleDriver #jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl #jdbc.username=scott #jdbc.password=tiger jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/tts7 jdbc.username=root jdbc.password=root #<!-- 初始化连接 --> dataSource.initialSize=10 #<!-- 最大空闲连接 --> dataSource.maxIdle=20 #<!-- 最小空闲连接 --> dataSource.minIdle=5 #最大连接数量 dataSource.maxActive=50 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> dataSource.maxWait=1000
在DeptDAO类中添加findByPageMySQL方法,实现连接MySQL数据库,实现对Dept表中数据的分页查询,代码如下所示:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; publicclass DeptDAO { publicstaticvoid main(String[] args) { // 1.select DeptDAO dao = new DeptDAO(); //dao.findAll(); // 2.insert Dept dept = new Dept(50, "developer", "Beijing"); // dao.add(dept); // 3.update dept.setLoc("ShangHai"); //dao.update(dept); // 4.findByPageOracle //dao.findByPageOracle(2, 3);// 查看第二页,每页3条 #cold_bold // 5.findByPageMySQL #cold_bold dao.findByPageMySQL(2, 3);// 查看第二页,每页3条 } /** * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ publicvoid findByPageOracle(int page, int pageSize) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; int total = -1;// 总记录数 int pages = -1;// 总页数 String sql_total = "select count(*) from dept"; String sql = "select * from " + "(select rownum rn, deptno, dname ,loc from " + "(select * from dept order by deptno) )" + " where rn between ? and ?"; try { con = ConnectionSource.getConnection(); stmt = con.prepareStatement(sql_total); // 获得总的记录数 rs = stmt.executeQuery(); if (rs.next()) { total = rs.getInt(1); } // 计算总共需要多少页 int mod = total % pageSize; if (mod == 0) pages = total / pageSize; else pages = total / pageSize + 1; // 如果要查看的页数大于最大页,或者小于1,则取最后一页或第一页 if (page > pages) page = pages; elseif (page < 1) { page = 1; } int begin = (page - 1) * pageSize + 1; int end = begin + pageSize - 1; stmt = con.prepareStatement(sql); stmt.setInt(1, begin); stmt.setInt(2, end); rs = stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getInt("deptno") + "," + rs.getString("dname") + "," + rs.getString("loc")); } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } /** * * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ #cold_bold publicvoid findByPageMySQL(int page, int pageSize) { #cold_bold Connection con = null; #cold_bold PreparedStatement stmt = null; #cold_bold ResultSet rs = null; #cold_bold int total = -1;// 总记录数 #cold_bold int pages = -1;// 总页数 #cold_bold #cold_bold String sql_total = "select count(*) from dept"; #cold_bold String sql = "select * from dept order by deptno limit ?,?"; #cold_bold #cold_bold try { #cold_bold con = ConnectionSource.getConnection(); #cold_bold stmt = con.prepareStatement(sql_total); #cold_bold #cold_bold // 获得总的记录数 #cold_bold rs = stmt.executeQuery(); #cold_bold if (rs.next()) { #cold_bold total = rs.getInt(1); #cold_bold } #cold_bold System.out.println(total); #cold_bold // 计算总共需要多少页 #cold_bold int mod = total % pageSize; #cold_bold if (mod == 0) #cold_bold pages = total / pageSize; #cold_bold else #cold_bold pages = total / pageSize + 1; #cold_bold #cold_bold // 如果要查看的页数大于最大页,或者小于1,则取最后一页或第一页 #cold_bold if (page > pages) #cold_bold page = pages; #cold_bold elseif (page < 1) { #cold_bold page = 1; #cold_bold } #cold_bold int start = (page - 1) * pageSize; #cold_bold stmt = con.prepareStatement(sql); #cold_bold stmt.setInt(1, start); #cold_bold stmt.setInt(2, pageSize); #cold_bold rs = stmt.executeQuery(); #cold_bold while (rs.next()) { #cold_bold System.out.println(rs.getInt("deptno") + "," #cold_bold + rs.getString("dname") + "," #cold_bold + rs.getString("loc")); #cold_bold } #cold_bold } catch (SQLException e) { #cold_bold System.out.println("数据库访问异常!"); #cold_bold thrownew RuntimeException(e); #cold_bold } finally { #cold_bold try { #cold_bold if (rs != null) { #cold_bold rs.close(); #cold_bold } #cold_bold if (stmt != null) { #cold_bold stmt.close(); #cold_bold } #cold_bold if (con != null) { #cold_bold con.close(); #cold_bold } #cold_bold } catch (SQLException e) { #cold_bold System.out.println("释放资源时发生异常"); #cold_bold } #cold_bold } #cold_bold } publicvoid findAll() { ... ... } publicvoid add(Dept dept) { ... ... } publicvoid update(Dept dept) { ... ... } }
本案例中,DeptDAO类的完整代码如下所示:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; publicclass DeptDAO { publicstaticvoid main(String[] args) { // 1.select DeptDAO dao = new DeptDAO(); //dao.findAll(); // 2.insert Dept dept = new Dept(50, "developer", "Beijing"); // dao.add(dept); // 3.update dept.setLoc("ShangHai"); //dao.update(dept); // 4.findByPageOracle //dao.findByPageOracle(2, 3);// 查看第二页,每页3条 // 5.findByPageMySQL dao.findByPageMySQL(2, 3);// 查看第二页,每页3条 } /** * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ publicvoid findByPageOracle(int page, int pageSize) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; int total = -1;// 总记录数 int pages = -1;// 总页数 String sql_total = "select count(*) from dept"; String sql = "select * from " + "(select rownum rn, deptno, dname ,loc from " + "(select * from dept order by deptno) )" + " where rn between ? and ?"; try { con = ConnectionSource.getConnection(); stmt = con.prepareStatement(sql_total); // 获得总的记录数 rs = stmt.executeQuery(); if (rs.next()) { total = rs.getInt(1); } // 计算总共需要多少页 int mod = total % pageSize; if (mod == 0) pages = total / pageSize; else pages = total / pageSize + 1; // 如果要查看的页数大于最大页,或者小于1,则取最后一页或第一页 if (page > pages) page = pages; elseif (page < 1) { page = 1; } int begin = (page - 1) * pageSize + 1; int end = begin + pageSize - 1; stmt = con.prepareStatement(sql); stmt.setInt(1, begin); stmt.setInt(2, end); rs = stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getInt("deptno") + "," + rs.getString("dname") + "," + rs.getString("loc")); } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } /** * * @param page * 要查看第几页 * @param pageSize * 每页记录数 */ publicvoid findByPageMySQL(int page, int pageSize) { Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; int total = -1;// 总记录数 int pages = -1;// 总页数 String sql_total = "select count(*) from dept"; String sql = "select * from dept order by deptno limit ?,?"; try { con = ConnectionSource.getConnection(); stmt = con.prepareStatement(sql_total); // 获得总的记录数 rs = stmt.executeQuery(); if (rs.next()) { total = rs.getInt(1); } System.out.println(total); // 计算总共需要多少页 int mod = total % pageSize; if (mod == 0) pages = total / pageSize; else pages = total / pageSize + 1; // 如果要查看的页数大于最大页,或者小于1,则取最后一页或第一页 if (page > pages) page = pages; elseif (page < 1) { page = 1; } int start = (page - 1) * pageSize; stmt = con.prepareStatement(sql); stmt.setInt(1, start); stmt.setInt(2, pageSize); rs = stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getInt("deptno") + "," + rs.getString("dname") + "," + "," + rs.getString("loc")); } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源时发生异常"); } } } publicvoid findAll() { Connection con = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("oracle.jdbc.OracleDriver"); con = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger"); stmt = con.createStatement(); rs = stmt.executeQuery("select deptno,dname,loc from dept"); while (rs.next()) { System.out.println(rs.getInt("deptno") + "," + rs.getString("dname") + "," + rs.getString("loc")); } } catch (ClassNotFoundException e) { System.out.println("驱动类无法找到!"); thrownew RuntimeException(e); } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("关闭连接时发生异常"); } } } publicvoid add(Dept dept) { Connection con = null; Statement stmt = null; int flag = -1; String sql = "insert into dept(deptno,dname,loc) " + "values(" + dept.getDeptno() + ",'" + dept.getDname() + "','" + dept.getLoc() + "')"; System.out.println(sql); try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); flag = stmt.executeUpdate(sql); if (flag > 0) { System.out.println("新增记录成功!"); } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源发生异常"); } } } publicvoid update(Dept dept) { Connection con = null; Statement stmt = null; int flag = -1; String sql = "update dept set dname = '" + dept.getDname() + "'," + "loc = '" + dept.getLoc() + "' where deptno = " + dept.getDeptno(); try { con = ConnectionSource.getConnection(); stmt = con.createStatement(); flag = stmt.executeUpdate(sql); if (flag > 0) { System.out.println("更新记录成功!"); } } catch (SQLException e) { System.out.println("数据库访问异常!"); thrownew RuntimeException(e); } finally { try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException e) { System.out.println("释放资源发生异常"); } } } }
db.properties文件的完整内容如下所示:
#jdbc.driverClassName=oracle.jdbc.OracleDriver #jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl #jdbc.username=scott #jdbc.password=tiger jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/tts7 jdbc.username=root jdbc.password=root #<!-- 初始化连接 --> dataSource.initialSize=10 #<!-- 最大空闲连接 --> dataSource.maxIdle=20 #<!-- 最小空闲连接 --> dataSource.minIdle=5 #最大连接数量 dataSource.maxActive=50 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> dataSource.maxWait=1000
ConnectionSource类与之前案例一样没有变化,该类完整内容如下所示:
import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import org.apache.commons.dbcp.BasicDataSource; public class ConnectionSource { private static BasicDataSource dataSource = null; public ConnectionSource() { } public static void init() { Properties dbProps = new Properties(); // 取配置文件可以根据实际的不同修改 try { dbProps.load(ConnectionSource.class.getClassLoader().getResourceAsStream( "day01/v4/db.properties")); } catch (IOException e) { e.printStackTrace(); } try { String driveClassName = dbProps.getProperty("jdbc.driverClassName"); String url = dbProps.getProperty("jdbc.url"); String username = dbProps.getProperty("jdbc.username"); String password = dbProps.getProperty("jdbc.password"); String initialSize = dbProps.getProperty("dataSource.initialSize"); String minIdle = dbProps.getProperty("dataSource.minIdle"); String maxIdle = dbProps.getProperty("dataSource.maxIdle"); String maxWait = dbProps.getProperty("dataSource.maxWait"); String maxActive = dbProps.getProperty("dataSource.maxActive"); dataSource = new BasicDataSource(); dataSource.setDriverClassName(driveClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); // 初始化连接数 if (initialSize != null) dataSource.setInitialSize(Integer.parseInt(initialSize)); // 最小空闲连接 if (minIdle != null) dataSource.setMinIdle(Integer.parseInt(minIdle)); // 最大空闲连接 if (maxIdle != null) dataSource.setMaxIdle(Integer.parseInt(maxIdle)); // 超时回收时间(以毫秒为单位) if (maxWait != null) dataSource.setMaxWait(Long.parseLong(maxWait)); // 最大连接数 if (maxActive != null) { if (!maxActive.trim().equals("0")) dataSource.setMaxActive(Integer.parseInt(maxActive)); } } catch (Exception e) { e.printStackTrace(); System.out.println("创建连接池失败!请检查设置!!!"); } } public static synchronized Connection getConnection() throws SQLException { if (dataSource == null) { init(); } Connection conn = null; if (dataSource != null) { conn = dataSource.getConnection(); } return conn; } }
详细要求如下:
1. 查询所有角色信息。
2. 添加某个角色。
3. 修改某个角色的角色名称。
参考答案
在课上案例的基础上,完成当前案例。工程结构如图-2所示。
图-2
本案例,在课上案例实现的基础上添加了如下内容:
1. RoleInfo.java为数据库中的role_info表和Java对象的映射;
2. RoleInfoDAO.java 为一个接口,该接口中定义了三个方法,该三个方法的声明如下所示:
package com.tarena.netctoss; import java.sql.SQLException; import java.util.List; import com.tarena.netctoss.entity.RoleInfo; publicinterface RoleInfoDAO { /** * 查询所有的角色 * @return所有角色返回List集合 */ List<RoleInfo> findAll() throws SQLException; /** * 新增角色 * @paramrole要添加角色 * @return添加后角色,包含角色ID */ RoleInfo save(RoleInfo role) throws SQLException; /** * 修改某个角色 * @paramrole要修改的角色 * @return返回修改后的角色 */ RoleInfo modify(RoleInfo role) throws SQLException; }
以上三个方法的作用,请参考注释部分。
3. RoleInfoDAOImpl.java 该类继承自BaseDAO,来直接获取创建连接的方法;另外,该类实现了RoleInfoDAO接口,将该接口中的方法做出实现。
4.TestRoleInfoDAO.java 该类用于测试RoleInfoDAOImpl所实现的方法的正确性。
实现此案例需要按照如下步骤进行。
步骤一:创建序列、表以及向表中插入数据
首先,创建名为role_seq的序列;然后,创建名为role_info的表并向该表中插入测试数据,SQL语句如下所示:
create sequence role_seq; create table role_info( role_id number(4) constraint role_info_id_pk primary key, name varchar2(50) not null ); insert into role_info(role_id,name)values(role_seq.nextval,'管理员'); insert into role_info(role_id,name)values(role_seq.nextval,'柜台人员'); insert into role_info(role_id,name)values(role_seq.nextval,'中层领导'); commit;
步骤二:创建数据库中的role_info表和Java对象的映射类RoleInfo
代码如下所示:
package com.tarena.netctoss.entity; public class RoleInfo { private int roleId; private String name; public int getRoleId() { return roleId; } public void setRoleId(int roleId) { this.roleId = roleId; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "RoleInfo [name=" + name + ", roleId=" + roleId + "]"; } }
步骤三:创建RoleInfoDAO接口,该接口中定义了对数据的增改查的功能
代码如下所示:
package com.tarena.netctoss; import java.sql.SQLException; import java.util.List; import com.tarena.netctoss.entity.RoleInfo; publicinterface RoleInfoDAO { /** * 查询所有的角色 * @return所有角色返回List集合 */ List<RoleInfo> findAll() throws SQLException; /** * 新增角色 * @paramrole要添加角色 * @return添加后角色,包含角色ID */ RoleInfo save(RoleInfo role) throws SQLException; /** * 修改某个角色 * @paramrole要修改的角色 * @return返回修改后的角色 */ RoleInfo modify(RoleInfo role) throws SQLException; }
步骤四:创建RoleInfoDAOImpl类
创建RoleInfoDAOImpl类,该类继承自BaseDAO,来直接获取创建连接的方法;另外,该类实现了RoleInfoDAO接口,将该接口中的方法做出实现,代码如下所示:
package com.tarena.netctoss.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.tarena.netctoss.BaseDAO; import com.tarena.netctoss.RoleInfoDAO; import com.tarena.netctoss.entity.RoleInfo; publicclass RoleInfoDAOImpl extends BaseDAO implements RoleInfoDAO { privatestaticfinal String FIND_ALL = "SELECT role_id,name FROM ROLE_INFO"; privatestaticfinal String MODIFY = "UPDATE ROLE_INFO SET name = ? WHERE role_id=?"; privatestaticfinal String INSERT = "INSERT INTO ROLE_INFO(role_id, name) " + " VALUES (ROLE_SEQ.NEXTVAL,?)"; @Override public List<RoleInfo> findAll() throws SQLException { Connection conn = getConnection(); String sql = FIND_ALL; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); RoleInfo role = null; List<RoleInfo> list = new ArrayList<RoleInfo>(); while (rs.next()) { role = new RoleInfo(); role.setRoleId(rs.getInt("role_id")); role.setName(rs.getString("name")); list.add(role); } return list; } @Override public RoleInfo save(RoleInfo role) throws SQLException { Connection conn = getConnection(); String sql = INSERT; PreparedStatement ps = conn.prepareStatement(sql, new String[] { "role_id" }); ps.setString(1, role.getName()); ps.executeUpdate(); ResultSet rs = ps.getGeneratedKeys(); rs.next(); int id = rs.getInt(1); role.setRoleId(id); return role; } @Override public RoleInfo modify(RoleInfo role) throws SQLException { Connection conn = getConnection(); String sql = MODIFY; // 预先定义好的SQL语句 PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, role.getName()); ps.setInt(2, role.getRoleId()); int flag = ps.executeUpdate(); return (flag > 0) ? role : null; } }
步骤五:创建TestRoleInfoDAO类,用于测试功能是否实现
创建TestRoleInfoDAO类,该类用于测试RoleInfoDAOImpl所实现的方法的正确性,代码如下所示:
package com.tarena.netctoss; import java.sql.SQLException; import java.util.List; import com.tarena.netctoss.entity.RoleInfo; import com.tarena.netctoss.impl.RoleInfoDAOImpl; public class TestRoleInfoDAO { public static void main(String[] args) { TestRoleInfoDAO test=new TestRoleInfoDAO(); //test.testFindAll(); //test.testSave(); test.testModify(); } public void testModify() { RoleInfo role=new RoleInfo(); role.setRoleId(10); role.setName("common"); RoleInfoDAO dao = new RoleInfoDAOImpl(); try { role=dao.modify(role); System.out.println(role.toString()); } catch (SQLException e) { e.printStackTrace(); } } public void testSave() { RoleInfo role=new RoleInfo(); role.setName("admin"); RoleInfoDAO dao = new RoleInfoDAOImpl(); try { role=dao.save(role); System.out.println(role.toString()); } catch (SQLException e) { e.printStackTrace(); } } public void testFindAll() { RoleInfoDAO dao = new RoleInfoDAOImpl(); try { List<RoleInfo> list = dao.findAll(); for(RoleInfo role : list){ System.out.println(role.toString()); System.out.println("---------------------------------"); } } catch (SQLException e) { e.printStackTrace(); } } }