当前位置:   article > 正文

MySQL入门教程:JDBC事务&API阅读&DAO模式_mysql preparedstatement addbatch 返回 -2

mysql preparedstatement addbatch 返回 -2

1、事务及回滚点

JDBC中使用事务

    事务回顾:

     事务概念:在逻辑上一组不可分割的操作,由多个sql语句组成,多个sql语句要么全都执行成功,要么都不执行.  原子性 一致性  隔离性 持久性

     JDBC控制事物主要就是在学习如何让多个数据库操作成为一个整体,实现要么全都执行成功,要么全都不执行

     在JDBC中,事务操作是自动提交。一条对数据库的DML(insert、update、delete)代表一项事务操作,操作成功后,系统将自动调用commit()提交,否则自动调用rollback()回滚,在JDBC中,事务操作方法都位于接口java.sql.Connection中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交,倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常;此时就可以在异常捕获时调用rollback()进行回滚,回复至数据初始状态.事务开始的边界则不是那么明显了,它会开始于组成当前事务的所有statement中的第一个被执行的时候。事务结束的边界是commit或者rollback方法的调用

  使用事务保证转账安全性

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.PreparedStatement;
  4. import java.sql.SQLException;
  5. public class TestTransaction {
  6.     private static String driver ="com.mysql.cj.jdbc.Driver";
  7.     private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useServerPrepStmts=true&cachePrepStmts=true&&rewriteBatchedStatements=true";
  8.     private static String user="root";
  9.     private static String password="root";
  10.     public static void main(String[] args) {
  11.         testTransaction();
  12.     }
  13.     // 定义一个方法,向部门表增加1000条数据
  14.     public static void testTransaction(){
  15.         Connection connection = null;
  16.         PreparedStatement preparedStatement=null;
  17.         /*
  18.         * JDBC 默认是自动提交事务
  19.         * 每条DML都是默认提交事务的,多个preparedStatement.executeUpdate();都会提交一次事务
  20.         * 如果想手动控制事务,那么就不能让事务自动提交
  21.         * 通过Connection对象控制connection.setAutoCommit(false);
  22.         * 如果不设置 默认值为true,自动提交,设置为false之后就是手动提交了
  23.         * 无论是否发生回滚,事务最终会一定要提交的 提交我们建议放在finally之中进行提交
  24.         * 如果是转账的过程中出现异常了,那么我们就要执行回滚,回滚操作应该方法catch语句块中
  25.         *
  26.         * */
  27.         try{
  28.             Class.forName(driver);
  29.             connection = DriverManager.getConnection(url, user,password);
  30.             // 设置事务手动提交
  31.             connection.setAutoCommit(false);
  32.             String sql="update account set money =money- ? where aid = ?";
  33.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  34.             // 转出
  35.             preparedStatement.setDouble(1, 100);
  36.             preparedStatement.setInt(2, 1);
  37.             preparedStatement.executeUpdate();
  38.             // 产生异常
  39.             //int i =1/0;
  40.             // 转入
  41.             preparedStatement.setDouble(1, -100);
  42.             preparedStatement.setInt(2, 2);
  43.             preparedStatement.executeUpdate();
  44.         }catch (Exception e){
  45.             if(null != connection){
  46.                 try {
  47.                     connection.rollback();// 回滚事务
  48.                 } catch (SQLException ex) {
  49.                     ex.printStackTrace();
  50.                 }
  51.             }
  52.             e.printStackTrace();
  53.         }finally {
  54.             // 提交事务
  55.             if(null != connection){
  56.                 try {
  57.                     connection.commit();
  58.                 } catch (SQLException e) {
  59.                     e.printStackTrace();
  60.                 }
  61.             }
  62.             if(null != preparedStatement){
  63.                 try {
  64.                     preparedStatement.close();
  65.                 } catch (SQLException e) {
  66.                     e.printStackTrace();
  67.                 }
  68.             }
  69.             if(null != connection){
  70.                 try {
  71.                     connection.close();
  72.                 } catch (SQLException e) {
  73.                     e.printStackTrace();
  74.                 }
  75.             }
  76.         }
  77.     }
  78. }

 设置回滚点

  1. import java.sql.*;
  2. import java.util.LinkedList;
  3. public class TestTransaction2 {
  4.     private static String driver ="com.mysql.cj.jdbc.Driver";
  5.     private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useServerPrepStmts=true&cachePrepStmts=true&&rewriteBatchedStatements=true";
  6.     private static String user="root";
  7.     private static String password="root";
  8.     public static void main(String[] args) {
  9.         testAddBatch();
  10.     }
  11.     // 定义一个方法,向部门表增加1000条数据
  12.     public static void testAddBatch(){
  13.         Connection connection = null;
  14.         PreparedStatement preparedStatement=null;
  15.         LinkedList<Savepoint> savepoints =new LinkedList<Savepoint>();
  16.         try{
  17.             Class.forName(driver);
  18.             connection = DriverManager.getConnection(url, user,password);
  19.             connection.setAutoCommit(false);
  20.             String sql="insert into dept values (DEFAULT ,?,?)";
  21.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  22.             //设置参数
  23.             for (int i = 1; i <= 10663; i++) {
  24.                 preparedStatement.setString(1, "name");
  25.                 preparedStatement.setString(2, "loc");
  26.                 preparedStatement.addBatch();// 将修改放入一个批次中
  27.                 if(i%1000==0){
  28.                     preparedStatement.executeBatch();
  29.                    preparedStatement.clearBatch();// 清除批处理中的数据
  30.                     // 设置回滚点
  31.                     Savepoint savepoint = connection.setSavepoint();
  32.                     savepoints.addLast(savepoint);
  33.                 }
  34.                 // 数据在 100001条插入的时候出现异常
  35.                 if(i ==10001){
  36.                     int x =1/0;
  37.                 }
  38.             }
  39.             /*
  40.             * 整数数组中的元素代表执行的结果代号
  41.             * SUCCESS_NO_INFO -2
  42.             * EXECUTE_FAILED  -3
  43.             * */
  44.             /*int[] ints = */
  45.             preparedStatement.executeBatch();
  46.             preparedStatement.clearBatch();
  47.         }catch (Exception e){
  48.             if(null != connection){
  49.                 try {
  50.                     //Savepoint sp = savepoints.getLast();
  51.                     Savepoint sp = savepoints.get(4);
  52.                     if(null != sp){
  53.                         // 选择回滚点
  54.                         connection.rollback(sp);// 回滚
  55.                     }
  56.                 } catch (SQLException e2) {
  57.                     e2.printStackTrace();
  58.                 }
  59.             }
  60.             e.printStackTrace();
  61.         }finally {
  62.             if(null != connection){
  63.                 try {
  64.                     connection.commit();// 提交
  65.                 } catch (SQLException e) {
  66.                     e.printStackTrace();
  67.                 }
  68.             }
  69.             if(null != preparedStatement){
  70.                 try {
  71.                     preparedStatement.close();
  72.                 } catch (SQLException e) {
  73.                     e.printStackTrace();
  74.                 }
  75.             }
  76.             if(null != connection){
  77.                 try {
  78.                     connection.close();
  79.                 } catch (SQLException e) {
  80.                     e.printStackTrace();
  81.                 }
  82.             }
  83.         }
  84.     }
  85. }

2、JDBCAPI总结_阅读

JDBC API总结

Connection接口

•作用:代表数据库连接

 

方法摘要

 

 

 void

 

 

close () 
 
  立即释放此   Connection  对象的数据库和 JDBC 资源,而不是等待它们被自动释放。

 

 

 void

 

 

commit () 
         
   使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection  对象当前持有的所有数据库锁。

 

 

 Statement

 

 

createStatement () 
         
   创建一个   Statement  对象来将 SQL 语句发送到数据库。

 

 

 CallableStatement

 

 

prepareCall (String  sql) 
           
 创建一个   CallableStatement  对象来调用数据库存储过程。

 

 

 PreparedStatement

 

 

prepareStatement (String  sql) 
       
     创建一个   PreparedStatement  对象来将参数化的 SQL 语句发送到数据库。

 

 

 PreparedStatement

 

 

prepareStatement (String  sql, int autoGeneratedKeys)
            创建一个默认   PreparedStatement  对象,该对象能获取自动生成的键。

 

 

 void

 

 

rollback () 
           
 取消在当前事务中进行的所有更改,并释放此   Connection  对象当前持有的所有数据库锁。

 

 

 void

 

 

setAutoCommit (boolean autoCommit) 
          
  将此连接的自动提交模式设置为给定状态。

 

  DriverManager类

 作用:管理一组 JDBC 驱动程序的基本服务

应用程序不再需要使用 Class.forName() 显式地加载 JDBC 驱动程序。在调用 getConnection 方法时,DriverManager 会试着从初始化时加载的那些驱动程序以及使用与当前 applet 或应用程序相同的类加载器显式加载的那些驱动程序中查找合适的驱动程序。

 

方法摘要

 

 

static Connection

 

 

getConnection (String  url) 
       
     试图建立到给定数据库 URL 的连接。

 

 

static Connection

 

 

getConnection (String  url, Properties  info) 
          
  试图建立到给定数据库 URL 的连接。

 

 

static Connection

 

 

getConnection (String  url, String  user, String  password)
            试图建立到给定数据库 URL 的连接。

 

Statement接口

作用:用于将 SQL 语句发送到数据库中,或理解为执行sql语句

有三种 Statement对象:

Statement:用于执行不带参数的简单SQL语句;

PreparedStatement(从 Statement 继承):用于执行带或不带参数的预编译SQL语句;

CallableStatement(从PreparedStatement 继承):用于执行数据库存储过程的调用。

 

方法

 

 

作用

 

 

ResultSet   executeQuery(String   sql)

 

 

执行SQL查询并获取到ResultSet对象

 

 

int   executeUpdate(String   sql)

 

 

可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数

 

  PreparedStatement接口

关系:public interface PreparedStatement extends Statement

区别

PreparedStatment安全性高,可以避免SQL注入

PreparedStatment简单不繁琐,不用进行字符串拼接

PreparedStatment性能高,用在执行多个相同数据库DML操作时

ResultSet接口

     ResultSet对象是executeQuery()方法的返回值,它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。

     ResultSet里的数据一行一行排列,每行有多个字段,且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。

    ResultSet对象自动维护指向当前数据行的游标。每调用一次next()方法,游标向下移动一行。

     初始状态下记录指针指向第一条记录的前面,通过next()方法指向第一条记录。循环完毕后指向最后一条记录的后面。

 

方法名

 

 

说    明

 

 

boolean   next()

 

 

将光标从当前位置向下移动一行

 

 

boolean   previous()

 

  游标从当前位置向上移动一行

 

 

void   close()

 

 

关闭ResultSet 对象

 

 

int   getInt(int colIndex)

 

 

以int形式获取结果集当前行指定列号值

 

 

int   getInt(String colLabel)

 

 

以int形式获取结果集当前行指定列名值

 

 

float   getFloat(int colIndex)

 

 

以float形式获取结果集当前行指定列号值

 

 

Float   getFloat(String colLabel)

 

 

以float形式获取结果集当前行指定列名值

 

 

String   getString(int colIndex)

 

 

以String 形式获取结果集当前行指定列号值

 

 

StringgetString(String   colLabel)

 

 

以String形式获取结果集当前行指定列名值

 

 

3、DAO模式

DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。

在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储.

简单来说,就是定义一个接口,规定一些增删改查的方法,然后交给实现类去实现, 它介于数据库和业务逻辑代码之间,这样当我们需要操作数据库是,根据接口定义的API去操作数据库就可以了,每个方法都是一个原子性的操作,例如:增加、修改、删除等

Dao模式要求项目必须具备这样几个结构

1、实体类:和数据库表格一一对应的类,单独放入一个包中,包名往往是 pojo/entity/bean,要操作的每个表格都应该有对应的实体类

emp > class Emp  

dept > class Dept  

account > class Account 

2、DAO 层:定义了对数据要执行那些操作的接口和实现类,包名往往是 dao/mapper,要操作的每个表格都应该有对应的接口和实现类

emp > interface EmpDao >EmpDaoImpl

dept > interface DeptDao> DeptDaoImpl

3、Mybatis/Spring JDBCTemplate 中,对DAO层代码进行了封装,代码编写方式会有其他变化   

项目的搭建

1.创建项目

2.添加jar包

3.创建包

4.创建实体类Emp

5.创建后台的接口EmpDao和实现类EmpDaoImpl

导入各个层级的接口和页面之后的项目

项目结构截图如下

实体类代码

  1. public class Emp implements Serializable {
  2.     private Integer empno;
  3.     private String ename;
  4.     private String job;
  5.     private Integer mgr;
  6.     private Date hiredate;
  7.     private Double sal;
  8.     private Double comm;
  9.     private Integer deptno;
  10. }
  11. public class Dept implements Serializable {
  12.     private Integer deptno;
  13.     private String dname;
  14.     private String loc;
  15. }
  16. //DAO接口代码
  17. public interface EmpDao {
  18.     /**
  19.      * 向数据库Emp表中增加一条数据的方法
  20.      * @param emp 要增加的数据封装成的Emp类的对象
  21.      * @return 增加成功返回大于0 的整数,增加失败返回0
  22.      */
  23.     int addEmp(Emp emp);
  24.     /**
  25.      * 根据员工编号删除员工信息的方法
  26.      * @param empno 要删除的员工编号
  27.      * @return 删除成功返回大于0的整数,失败返回0
  28.      */
  29.     int deleteByEmpno(int empno);
  30. }
  31. //DAO实现类代码
  32. import java.sql.*;
  33. public class EmpDaoImpl implements EmpDao {
  34.     private static String driver ="com.mysql.cj.jdbc.Driver";
  35.     private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
  36.     private static String user="root";
  37.     private static String password="root";
  38.     @Override
  39.     public int addEmp(Emp emp) {
  40.         // 向 Emp表中增加一条数据
  41.         Connection connection = null;
  42.         PreparedStatement preparedStatement=null;
  43.         int rows=0;
  44.         try{
  45.             Class.forName(driver);
  46.             connection = DriverManager.getConnection(url, user,password);
  47.             String sql="insert into emp values(DEFAULT ,?,?,?,?,?,?,?)";
  48.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  49.             //设置参数
  50.             preparedStatement.setObject(1,emp.getEname());
  51.             preparedStatement.setObject(2,emp.getJob() );
  52.             preparedStatement.setObject(3,emp.getMgr());
  53.             preparedStatement.setObject(4,emp.getHiredate());
  54.             preparedStatement.setObject(5,emp.getSal());
  55.             preparedStatement.setObject(6,emp.getComm());
  56.             preparedStatement.setObject(7,emp.getDeptno());
  57.             //执行CURD
  58.             rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
  59.         }catch (Exception e){
  60.             e.printStackTrace();
  61.         }finally {
  62.             if(null != preparedStatement){
  63.                 try {
  64.                     preparedStatement.close();
  65.                 } catch (SQLException e) {
  66.                     e.printStackTrace();
  67.                 }
  68.             }
  69.             if(null != connection){
  70.                 try {
  71.                     connection.close();
  72.                 } catch (SQLException e) {
  73.                     e.printStackTrace();
  74.                 }
  75.             }
  76.         }
  77.         return rows;
  78.     }
  79.     @Override
  80.     public int deleteByEmpno(int empno) {
  81.         // 向 Emp表中增加一条数据
  82.         Connection connection = null;
  83.         PreparedStatement preparedStatement=null;
  84.         int rows=0;
  85.         try{
  86.             Class.forName(driver);
  87.             connection = DriverManager.getConnection(url, user,password);
  88.             String sql="delete from emp where empno =?";
  89.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  90.             //设置参数
  91.             preparedStatement.setObject(1,empno);
  92.             //执行CURD
  93.             rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
  94.         }catch (Exception e){
  95.             e.printStackTrace();
  96.         }finally {
  97.             if(null != preparedStatement){
  98.                 try {
  99.                     preparedStatement.close();
  100.                 } catch (SQLException e) {
  101.                     e.printStackTrace();
  102.                 }
  103.             }
  104.             if(null != connection){
  105.                 try {
  106.                     connection.close();
  107.                 } catch (SQLException e) {
  108.                     e.printStackTrace();
  109.                 }
  110.             }
  111.         }
  112.         return rows;
  113.     }
  114. }

4、员工管理系统开发

DAO接口

  1. import java.util.List;
  2. public interface EmpDao {
  3.     /**
  4.      * 向数据库Emp表中增加一条数据的方法
  5.      * @param emp 要增加的数据封装成的Emp类的对象
  6.      * @return 增加成功返回大于0 的整数,增加失败返回0
  7.      */
  8.     int addEmp(Emp emp);
  9.     /**
  10.      * 根据员工编号删除员工信息的方法
  11.      * @param empno 要删除的员工编号
  12.      * @return 删除成功返回大于0的整数,失败返回0
  13.      */
  14.     int deleteByEmpno(int empno);
  15.     /**
  16.      * 查看数据库表格中所有的员工信息
  17.      * @return 所有员工信息封装的一个List<Emp>集合
  18.      */
  19.     List<Emp> findAll();
  20.     /**
  21.      * 根据员工编号修改员工其他所有字段的方法
  22.      * @param emp 员工编号和其他7个字段封装的一个Emp类对象
  23.      * @return 修改成功返回大于0的整数,失败返回0
  24.      */
  25.     int updateEmp(Emp emp);
  26. }
  27. import java.util.List;
  28. public interface DeptDao {
  29.     /**
  30.      * 查询全部门的方法
  31.      * @return Dept对象封装的List集合
  32.      */
  33.     List<Dept> findAll();
  34.     int addDept(Dept dept);
  35. }
  36. //DAO实现类
  37. public class EmpDaoImpl implements EmpDao {
  38.     private static String driver ="com.mysql.cj.jdbc.Driver";
  39.     private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
  40.     private static String user="root";
  41.     private static String password="root";
  42.     @Override
  43.     public int addEmp(Emp emp) {
  44.         // 向 Emp表中增加一条数据
  45.         Connection connection = null;
  46.         PreparedStatement preparedStatement=null;
  47.         int rows=0;
  48.         try{
  49.             Class.forName(driver);
  50.             connection = DriverManager.getConnection(url, user,password);
  51.             String sql="insert into emp values(DEFAULT ,?,?,?,?,?,?,?)";
  52.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  53.             //设置参数
  54.             preparedStatement.setObject(1,emp.getEname());
  55.             preparedStatement.setObject(2,emp.getJob() );
  56.             preparedStatement.setObject(3,emp.getMgr());
  57.             preparedStatement.setObject(4,emp.getHiredate());
  58.             preparedStatement.setObject(5,emp.getSal());
  59.             preparedStatement.setObject(6,emp.getComm());
  60.             preparedStatement.setObject(7,emp.getDeptno());
  61.             //执行CURD
  62.             rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
  63.         }catch (Exception e){
  64.             e.printStackTrace();
  65.         }finally {
  66.             if(null != preparedStatement){
  67.                 try {
  68.                     preparedStatement.close();
  69.                 } catch (SQLException e) {
  70.                     e.printStackTrace();
  71.                 }
  72.             }
  73.             if(null != connection){
  74.                 try {
  75.                     connection.close();
  76.                 } catch (SQLException e) {
  77.                     e.printStackTrace();
  78.                 }
  79.             }
  80.         }
  81.         return rows;
  82.     }
  83.     @Override
  84.     public int deleteByEmpno(int empno) {
  85.         // 向 Emp表中增加一条数据
  86.         Connection connection = null;
  87.         PreparedStatement preparedStatement=null;
  88.         int rows=0;
  89.         try{
  90.             Class.forName(driver);
  91.             connection = DriverManager.getConnection(url, user,password);
  92.             String sql="delete from emp where empno =?";
  93.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  94.             //设置参数
  95.             preparedStatement.setObject(1,empno);
  96.             //执行CURD
  97.             rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
  98.         }catch (Exception e){
  99.             e.printStackTrace();
  100.         }finally {
  101.             if(null != preparedStatement){
  102.                 try {
  103.                     preparedStatement.close();
  104.                 } catch (SQLException e) {
  105.                     e.printStackTrace();
  106.                 }
  107.             }
  108.             if(null != connection){
  109.                 try {
  110.                     connection.close();
  111.                 } catch (SQLException e) {
  112.                     e.printStackTrace();
  113.                 }
  114.             }
  115.         }
  116.         return rows;
  117.     }
  118.     @Override
  119.     public List<Emp> findAll() {
  120.         // 查询名字中包含字母A的员工信息
  121.         Connection connection = null;
  122.         PreparedStatement preparedStatement=null;
  123.         ResultSet resultSet=null;
  124.         List<Emp> list =null;
  125.         try{
  126.             Class.forName(driver);
  127.             connection = DriverManager.getConnection(url, user,password);
  128.             String sql="select * from emp";
  129.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  130.             //执行CURD
  131.             resultSet = preparedStatement.executeQuery();// 这里不需要再传入SQL语句
  132.             list=new ArrayList<Emp>() ;
  133.             while(resultSet.next()){
  134.                 int empno = resultSet.getInt("empno");
  135.                 String ename = resultSet.getString("ename");
  136.                 String job = resultSet.getString("job");
  137.                 int mgr = resultSet.getInt("mgr");
  138.                 Date hiredate = resultSet.getDate("hiredate");
  139.                 double sal= resultSet.getDouble("sal");
  140.                 double comm= resultSet.getDouble("comm");
  141.                 int deptno= resultSet.getInt("deptno");
  142.                 Emp emp =new Emp(empno, ename, job, mgr, hiredate, sal, comm, deptno);
  143.                 list.add(emp);
  144.             }
  145.         }catch (Exception e){
  146.             e.printStackTrace();
  147.         }finally {
  148.             if(null != resultSet){
  149.                 try {
  150.                     resultSet.close();
  151.                 } catch (SQLException e) {
  152.                     e.printStackTrace();
  153.                 }
  154.             }
  155.             if(null != preparedStatement){
  156.                 try {
  157.                     preparedStatement.close();
  158.                 } catch (SQLException e) {
  159.                     e.printStackTrace();
  160.                 }
  161.             }
  162.             if(null != connection){
  163.                 try {
  164.                     connection.close();
  165.                 } catch (SQLException e) {
  166.                     e.printStackTrace();
  167.                 }
  168.             }
  169.         }
  170.         return list;
  171.     }
  172.     @Override
  173.     public int updateEmp(Emp emp) {
  174.         // 向 Emp表中增加一条数据
  175.         Connection connection = null;
  176.         PreparedStatement preparedStatement=null;
  177.         int rows=0;
  178.         try{
  179.             Class.forName(driver);
  180.             connection = DriverManager.getConnection(url, user,password);
  181.             String sql="update emp set ename =? ,job=?, mgr =?,hiredate =?,sal=?,comm=?,deptno=? where empno =?";
  182.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  183.             //设置参数
  184.             preparedStatement.setObject(1,emp.getEname());
  185.             preparedStatement.setObject(2,emp.getJob() );
  186.             preparedStatement.setObject(3,emp.getMgr());
  187.             preparedStatement.setObject(4,emp.getHiredate());
  188.             preparedStatement.setObject(5,emp.getSal());
  189.             preparedStatement.setObject(6,emp.getComm());
  190.             preparedStatement.setObject(7,emp.getDeptno());
  191.             preparedStatement.setObject(8,emp.getEmpno());
  192.             //执行CURD
  193.             rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
  194.         }catch (Exception e){
  195.             e.printStackTrace();
  196.         }finally {
  197.             if(null != preparedStatement){
  198.                 try {
  199.                     preparedStatement.close();
  200.                 } catch (SQLException e) {
  201.                     e.printStackTrace();
  202.                 }
  203.             }
  204.             if(null != connection){
  205.                 try {
  206.                     connection.close();
  207.                 } catch (SQLException e) {
  208.                     e.printStackTrace();
  209.                 }
  210.             }
  211.         }
  212.         return rows;
  213.     }
  214. }
  215. public class DeptDaoImpl implements DeptDao {
  216.     private static String driver ="com.mysql.cj.jdbc.Driver";
  217.     private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
  218.     private static String user="root";
  219.     private static String password="root";
  220.     @Override
  221.     public List<Dept> findAll() {
  222.         // 查询名字中包含字母A的员工信息
  223.         Connection connection = null;
  224.         PreparedStatement preparedStatement=null;
  225.         ResultSet resultSet=null;
  226.         List<Dept> list =null;
  227.         try{
  228.             Class.forName(driver);
  229.             connection = DriverManager.getConnection(url, user,password);
  230.             String sql="select * from dept";
  231.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  232.             //执行CURD
  233.             resultSet = preparedStatement.executeQuery();// 这里不需要再传入SQL语句
  234.             list=new ArrayList<Dept>() ;
  235.             while(resultSet.next()){
  236.                 int deptno = resultSet.getInt("deptno");
  237.                 String dname = resultSet.getString("dname");
  238.                 String loc = resultSet.getString("loc");
  239.                 Dept dept =new Dept(deptno,dname,loc);
  240.                 list.add(dept);
  241.             }
  242.         }catch (Exception e){
  243.             e.printStackTrace();
  244.         }finally {
  245.             if(null != resultSet){
  246.                 try {
  247.                     resultSet.close();
  248.                 } catch (SQLException e) {
  249.                     e.printStackTrace();
  250.                 }
  251.             }
  252.             if(null != preparedStatement){
  253.                 try {
  254.                     preparedStatement.close();
  255.                 } catch (SQLException e) {
  256.                     e.printStackTrace();
  257.                 }
  258.             }
  259.             if(null != connection){
  260.                 try {
  261.                     connection.close();
  262.                 } catch (SQLException e) {
  263.                     e.printStackTrace();
  264.                 }
  265.             }
  266.         }
  267.         return list;
  268.     }
  269.     @Override
  270.     public int addDept(Dept dept) {
  271.         // 向 Emp表中增加一条数据
  272.         Connection connection = null;
  273.         PreparedStatement preparedStatement=null;
  274.         int rows=0;
  275.         try{
  276.             Class.forName(driver);
  277.             connection = DriverManager.getConnection(url, user,password);
  278.             String sql="insert into dept values(?,?,?)";
  279.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  280.             //设置参数
  281.             preparedStatement.setObject(1,dept.getDeptno());
  282.             preparedStatement.setObject(2,dept.getDname());
  283.             preparedStatement.setObject(3,dept.getLoc() );
  284.             //执行CURD
  285.             rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
  286.         }catch (Exception e){
  287.             e.printStackTrace();
  288.         }finally {
  289.             if(null != preparedStatement){
  290.                 try {
  291.                     preparedStatement.close();
  292.                 } catch (SQLException e) {
  293.                     e.printStackTrace();
  294.                 }
  295.             }
  296.             if(null != connection){
  297.                 try {
  298.                     connection.close();
  299.                 } catch (SQLException e) {
  300.                     e.printStackTrace();
  301.                 }
  302.             }
  303.         }
  304.         return rows;
  305.     }
  306. }
  307. //EmpManageSystem类
  308. public class EmpManageSystem {
  309.     private static Scanner sc =new Scanner(System.in);
  310.     private static EmpDao empDao =new EmpDaoImpl();
  311.     private static DeptDao deptDao=new DeptDaoImpl();
  312.     private static SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");;
  313.     public static void main(String[] args) {
  314.         while(true){
  315.             showMenu();
  316.             System.out.println("请录入选项");
  317.             int option  =sc.nextInt();
  318.             switch (option){
  319.                 case 1:
  320.                     case1();
  321.                     break;
  322.                 case 2:
  323.                     case2();
  324.                     break;
  325.                 case 3:
  326.                     case3();
  327.                     break;
  328.                 case 4:
  329.                     case4();
  330.                     break;
  331.                 case 5:
  332.                     case5();
  333.                     break;
  334.                 case 6:
  335.                     case6();
  336.                     break;
  337.                 case 7
  338.                                               sc.close();
  339.                                                 System.exit(0);
  340.                     break;
  341.                 default:
  342.                    System.out.println("请正确输入选项");
  343.             }
  344.         }
  345.     }
  346.     private static void case1(){
  347.         List<Emp> emps = empDao.findAll();
  348.         emps.forEach(System.out::println);
  349.     }
  350.     private static void case2(){
  351.         List<Dept> depts = deptDao.findAll();
  352.         depts.forEach(System.out::println);
  353.     }
  354.     private static void case3(){
  355.         System.out.println("请输入要删除的员工编号");
  356.         int empno=sc.nextInt();
  357.         empDao.deleteByEmpno(empno);
  358.     }
  359.     private static void case4(){
  360.         System.out.println("请输入员工编号");
  361.         int empno =sc.nextInt();
  362.         System.out.println("请输入员工姓名");
  363.         String ename =sc.next();
  364.         System.out.println("请输入员工职位");
  365.         String job =sc.next();
  366.         System.out.println("请输入员工上级");
  367.         int mgr =sc.nextInt();
  368.         System.out.println("请输入员工入职日期,格式为yyyy-MM-dd");
  369.         Date hiredate =null;
  370.         try {
  371.             hiredate = simpleDateFormat.parse(sc.next());
  372.         } catch (ParseException e) {
  373.             e.printStackTrace();
  374.         }
  375.         System.out.println("请输入员工工资");
  376.         double sal =sc.nextDouble();
  377.         System.out.println("请输入员工补助");
  378.         double comm=sc.nextDouble();
  379.         System.out.println("请输入员工部门号");
  380.         int deptno =sc.nextInt();
  381.         Emp emp=new Emp(empno, ename, job, mgr, hiredate, sal, comm,deptno);
  382.         empDao.updateEmp(emp);
  383.     }
  384.     private static void case5(){
  385.         System.out.println("请输入员工姓名");
  386.         String ename =sc.next();
  387.         System.out.println("请输入员工职位");
  388.         String job =sc.next();
  389.         System.out.println("请输入员工上级");
  390.         int mgr =sc.nextInt();
  391.         System.out.println("请输入员工入职日期,格式为yyyy-MM-dd");
  392.         Date hiredate =null;
  393.         try {
  394.             hiredate = simpleDateFormat.parse(sc.next());
  395.         } catch (ParseException e) {
  396.             e.printStackTrace();
  397.         }
  398.         System.out.println("请输入员工工资");
  399.         double sal =sc.nextDouble();
  400.         System.out.println("请输入员工补助");
  401.         double comm=sc.nextDouble();
  402.         System.out.println("请输入员工部门号");
  403.         int deptno =sc.nextInt();
  404.         Emp emp=new Emp(null, ename, job, mgr, hiredate, sal, comm,deptno);
  405.         empDao.addEmp(emp);
  406.     }
  407.     private static void case6(){
  408.         System.out.println("请录入部门号");
  409.         int deptno =sc.nextInt();
  410.         System.out.println("请录入部门名称");
  411.         String dname =sc.next();
  412.         System.out.println("请录入部门位置");
  413.         String loc =sc.next();
  414.         Dept dept =new Dept(deptno,dname,loc);
  415.         deptDao.addDept(dept);
  416.     }
  417.     public static void showMenu(){
  418.         System.out.println("************************************");
  419.         System.out.println("* 1 查看所有员工信息");
  420.         System.out.println("* 2 查看所有部门信息");
  421.         System.out.println("* 3 根据工号删除员工信息");
  422.         System.out.println("* 4 根据工号修改员工信息");
  423.         System.out.println("* 5 增加员工信息");
  424.         System.out.println("* 6 增加部门信息");
  425.         System.out.println("* 7 退出");
  426.         System.out.println("************************************");
  427.     }
  428. }

DAO抽取

  1. //BaseDAO代码
  2. public abstract class BaseDao {
  3.     private static String driver ="com.mysql.cj.jdbc.Driver";
  4.     private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
  5.     private static String user="root";
  6.     private static String password="root";
  7.     public int baseUpdate(String sql,Object ... args){
  8.         // 向 Emp表中增加一条数据
  9.         Connection connection = null;
  10.         PreparedStatement preparedStatement=null;
  11.         int rows=0;
  12.         try{
  13.             Class.forName(driver);
  14.             connection = DriverManager.getConnection(url, user,password);
  15.             preparedStatement = connection.prepareStatement(sql);
  16.             //设置参数
  17.             for (int i = 0; i <args.length ; i++) {
  18.                 preparedStatement.setObject(i+1, args[i]);
  19.             }
  20.             //执行CURD
  21.             rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
  22.         }catch (Exception e){
  23.             e.printStackTrace();
  24.         }finally {
  25.             if(null != preparedStatement){
  26.                 try {
  27.                     preparedStatement.close();
  28.                 } catch (SQLException e) {
  29.                     e.printStackTrace();
  30.                 }
  31.             }
  32.             if(null != connection){
  33.                 try {
  34.                     connection.close();
  35.                 } catch (SQLException e) {
  36.                     e.printStackTrace();
  37.                 }
  38.             }
  39.         }
  40.         return rows;
  41.     }
  42.     public List baseQuery(Class clazz,String sql,Object ... args) {
  43.         // 查询名字中包含字母A的员工信息
  44.         Connection connection = null;
  45.         PreparedStatement preparedStatement=null;
  46.         ResultSet resultSet=null;
  47.         List list =null;
  48.         try{
  49.             Class.forName(driver);
  50.             connection = DriverManager.getConnection(url, user,password);
  51.             preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
  52.             //设置参数
  53.             for (int i = 0; i <args.length ; i++) {
  54.                 preparedStatement.setObject(i+1, args[i]);
  55.             }
  56.             //执行CURD
  57.             resultSet = preparedStatement.executeQuery();// 这里不需要再传入SQL语句
  58.             list=new ArrayList() ;
  59.             // 根据字节码获取所有 的属性
  60.             Field[] fields = clazz.getDeclaredFields();
  61.             for (Field field : fields) {
  62.                 field.setAccessible(true);// 设置属性可以 访问
  63.             }
  64.             while(resultSet.next()){
  65.                 // 通过反射创建对象
  66.                 Object obj = clazz.newInstance();//默认在通过反射调用对象的空参构造方法
  67.                 for (Field field : fields) {// 临时用Field设置属性
  68.                     String fieldName = field.getName();// empno  ename job .... ...
  69.                     Object data = resultSet.getObject(fieldName);
  70.                     field.set(obj,data);
  71.                 }
  72.                 list.add(obj);
  73.             }
  74.         }catch (Exception e){
  75.             e.printStackTrace();
  76.         }finally {
  77.             if(null != resultSet){
  78.                 try {
  79.                     resultSet.close();
  80.                 } catch (SQLException e) {
  81.                     e.printStackTrace();
  82.                 }
  83.             }
  84.             if(null != preparedStatement){
  85.                 try {
  86.                     preparedStatement.close();
  87.                 } catch (SQLException e) {
  88.                     e.printStackTrace();
  89.                 }
  90.             }
  91.             if(null != connection){
  92.                 try {
  93.                     connection.close();
  94.                 } catch (SQLException e) {
  95.                     e.printStackTrace();
  96.                 }
  97.             }
  98.         }
  99.         return list;
  100.     }
  101. }
  102. //实现类代码
  103. public class EmpDaoImpl extends BaseDao implements EmpDao {
  104.     @Override
  105.     public int addEmp(Emp emp) {
  106.         String sql="insert into emp values(DEFAULT ,?,?,?,?,?,?,?)";
  107.         return baseUpdate(sql, emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno());
  108.     }
  109.     @Override
  110.     public int deleteByEmpno(int empno) {
  111.         String sql="delete from emp where empno =?";
  112.         return baseUpdate(sql, empno);
  113.     }
  114.     @Override
  115.     public List<Emp> findAll() {
  116.         String sql ="select * from emp";
  117.         return baseQuery(Emp.class, sql );
  118.     }
  119.     @Override
  120.     public int updateEmp(Emp emp) {
  121.         String sql="update emp set ename =? ,job=?, mgr =?,hiredate =?,sal=?,comm=?,deptno=? where empno =?";
  122.         return baseUpdate(sql, emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno(),emp.getEmpno());
  123.     }
  124. }
  125. public class DeptDaoImpl extends BaseDao implements DeptDao {
  126.     @Override
  127.     public List<Dept> findAll() {
  128.         String sql="select * from dept";
  129.         return  baseQuery(Dept.class, sql);
  130.     }
  131.     @Override
  132.     public int addDept(Dept dept) {
  133.         String sql="insert into dept values(?,?,?)";
  134.         return baseUpdate(sql, dept.getDeptno(),dept.getDname(),dept.getLoc());
  135.     }
  136. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码世界探险家/article/detail/61869
推荐阅读
相关标签
  

闽ICP备14008679号