赞
踩
事务回顾:
事务概念:在逻辑上一组不可分割的操作,由多个sql语句组成,多个sql语句要么全都执行成功,要么都不执行. 原子性 一致性 隔离性 持久性
JDBC控制事物主要就是在学习如何让多个数据库操作成为一个整体,实现要么全都执行成功,要么全都不执行
在JDBC中,事务操作是自动提交。一条对数据库的DML(insert、update、delete)代表一项事务操作,操作成功后,系统将自动调用commit()提交,否则自动调用rollback()回滚,在JDBC中,事务操作方法都位于接口java.sql.Connection中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交,倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常;此时就可以在异常捕获时调用rollback()进行回滚,回复至数据初始状态.事务开始的边界则不是那么明显了,它会开始于组成当前事务的所有statement中的第一个被执行的时候。事务结束的边界是commit或者rollback方法的调用
使用事务保证转账安全性
-
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
-
- public class TestTransaction {
-
- private static String driver ="com.mysql.cj.jdbc.Driver";
- 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";
- private static String user="root";
- private static String password="root";
- public static void main(String[] args) {
- testTransaction();
- }
- // 定义一个方法,向部门表增加1000条数据
- public static void testTransaction(){
- Connection connection = null;
- PreparedStatement preparedStatement=null;
-
-
- /*
- * JDBC 默认是自动提交事务
- * 每条DML都是默认提交事务的,多个preparedStatement.executeUpdate();都会提交一次事务
- * 如果想手动控制事务,那么就不能让事务自动提交
- * 通过Connection对象控制connection.setAutoCommit(false);
- * 如果不设置 默认值为true,自动提交,设置为false之后就是手动提交了
- * 无论是否发生回滚,事务最终会一定要提交的 提交我们建议放在finally之中进行提交
- * 如果是转账的过程中出现异常了,那么我们就要执行回滚,回滚操作应该方法catch语句块中
- *
- * */
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
- // 设置事务手动提交
- connection.setAutoCommit(false);
- String sql="update account set money =money- ? where aid = ?";
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
- // 转出
- preparedStatement.setDouble(1, 100);
- preparedStatement.setInt(2, 1);
- preparedStatement.executeUpdate();
- // 产生异常
- //int i =1/0;
-
- // 转入
- preparedStatement.setDouble(1, -100);
- preparedStatement.setInt(2, 2);
- preparedStatement.executeUpdate();
-
- }catch (Exception e){
- if(null != connection){
- try {
- connection.rollback();// 回滚事务
- } catch (SQLException ex) {
- ex.printStackTrace();
- }
- }
- e.printStackTrace();
- }finally {
- // 提交事务
- if(null != connection){
- try {
- connection.commit();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- }
-
- }
设置回滚点
- import java.sql.*;
- import java.util.LinkedList;
-
-
- public class TestTransaction2 {
- private static String driver ="com.mysql.cj.jdbc.Driver";
- 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";
- private static String user="root";
- private static String password="root";
- public static void main(String[] args) {
- testAddBatch();
- }
- // 定义一个方法,向部门表增加1000条数据
- public static void testAddBatch(){
- Connection connection = null;
- PreparedStatement preparedStatement=null;
-
- LinkedList<Savepoint> savepoints =new LinkedList<Savepoint>();
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
- connection.setAutoCommit(false);
- String sql="insert into dept values (DEFAULT ,?,?)";
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
-
- //设置参数
- for (int i = 1; i <= 10663; i++) {
- preparedStatement.setString(1, "name");
- preparedStatement.setString(2, "loc");
- preparedStatement.addBatch();// 将修改放入一个批次中
- if(i%1000==0){
- preparedStatement.executeBatch();
- preparedStatement.clearBatch();// 清除批处理中的数据
- // 设置回滚点
- Savepoint savepoint = connection.setSavepoint();
- savepoints.addLast(savepoint);
- }
- // 数据在 100001条插入的时候出现异常
- if(i ==10001){
- int x =1/0;
- }
- }
-
- /*
- * 整数数组中的元素代表执行的结果代号
- * SUCCESS_NO_INFO -2
- * EXECUTE_FAILED -3
- * */
- /*int[] ints = */
- preparedStatement.executeBatch();
- preparedStatement.clearBatch();
-
- }catch (Exception e){
- if(null != connection){
- try {
- //Savepoint sp = savepoints.getLast();
- Savepoint sp = savepoints.get(4);
- if(null != sp){
- // 选择回滚点
- connection.rollback(sp);// 回滚
- }
-
- } catch (SQLException e2) {
- e2.printStackTrace();
- }
- }
- e.printStackTrace();
- }finally {
- if(null != connection){
- try {
- connection.commit();// 提交
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
-
Connection接口
•作用:代表数据库连接
方法摘要
| |
|
close
|
|
commit
|
|
createStatement
|
|
prepareCall
|
|
prepareStatement
|
|
prepareStatement
|
|
rollback
|
|
setAutoCommit
|
DriverManager类
作用:管理一组 JDBC 驱动程序的基本服务
应用程序不再需要使用 Class.forName() 显式地加载 JDBC 驱动程序。在调用 getConnection 方法时,DriverManager 会试着从初始化时加载的那些驱动程序以及使用与当前 applet 或应用程序相同的类加载器显式加载的那些驱动程序中查找合适的驱动程序。
方法摘要
| |
|
getConnection
|
|
getConnection
|
|
getConnection
|
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形式获取结果集当前行指定列名值
|
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
导入各个层级的接口和页面之后的项目
项目结构截图如下
实体类代码
- public class Emp implements Serializable {
- private Integer empno;
- private String ename;
- private String job;
- private Integer mgr;
- private Date hiredate;
- private Double sal;
- private Double comm;
- private Integer deptno;
- }
-
-
- public class Dept implements Serializable {
- private Integer deptno;
- private String dname;
- private String loc;
- }
-
- //DAO接口代码
-
-
- public interface EmpDao {
- /**
- * 向数据库Emp表中增加一条数据的方法
- * @param emp 要增加的数据封装成的Emp类的对象
- * @return 增加成功返回大于0 的整数,增加失败返回0
- */
- int addEmp(Emp emp);
-
- /**
- * 根据员工编号删除员工信息的方法
- * @param empno 要删除的员工编号
- * @return 删除成功返回大于0的整数,失败返回0
- */
- int deleteByEmpno(int empno);
-
- }
-
- //DAO实现类代码
-
- import java.sql.*;
-
- public class EmpDaoImpl implements EmpDao {
- private static String driver ="com.mysql.cj.jdbc.Driver";
- private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
- private static String user="root";
- private static String password="root";
-
- @Override
- public int addEmp(Emp emp) {
- // 向 Emp表中增加一条数据
- Connection connection = null;
- PreparedStatement preparedStatement=null;
- int rows=0;
-
-
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
- String sql="insert into emp values(DEFAULT ,?,?,?,?,?,?,?)";
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
- //设置参数
- preparedStatement.setObject(1,emp.getEname());
- preparedStatement.setObject(2,emp.getJob() );
- preparedStatement.setObject(3,emp.getMgr());
- preparedStatement.setObject(4,emp.getHiredate());
- preparedStatement.setObject(5,emp.getSal());
- preparedStatement.setObject(6,emp.getComm());
- preparedStatement.setObject(7,emp.getDeptno());
-
- //执行CURD
- rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
- }catch (Exception e){
- e.printStackTrace();
- }finally {
-
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
-
- return rows;
- }
-
- @Override
- public int deleteByEmpno(int empno) {
- // 向 Emp表中增加一条数据
- Connection connection = null;
- PreparedStatement preparedStatement=null;
- int rows=0;
-
-
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
- String sql="delete from emp where empno =?";
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
- //设置参数
- preparedStatement.setObject(1,empno);
-
-
- //执行CURD
- rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
-
- }catch (Exception e){
- e.printStackTrace();
- }finally {
-
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
-
- return rows;
- }
- }
-
DAO接口
-
- import java.util.List;
-
- public interface EmpDao {
- /**
- * 向数据库Emp表中增加一条数据的方法
- * @param emp 要增加的数据封装成的Emp类的对象
- * @return 增加成功返回大于0 的整数,增加失败返回0
- */
- int addEmp(Emp emp);
-
- /**
- * 根据员工编号删除员工信息的方法
- * @param empno 要删除的员工编号
- * @return 删除成功返回大于0的整数,失败返回0
- */
- int deleteByEmpno(int empno);
-
- /**
- * 查看数据库表格中所有的员工信息
- * @return 所有员工信息封装的一个List<Emp>集合
- */
- List<Emp> findAll();
-
- /**
- * 根据员工编号修改员工其他所有字段的方法
- * @param emp 员工编号和其他7个字段封装的一个Emp类对象
- * @return 修改成功返回大于0的整数,失败返回0
- */
- int updateEmp(Emp emp);
-
- }
-
-
-
- import java.util.List;
- public interface DeptDao {
- /**
- * 查询全部门的方法
- * @return Dept对象封装的List集合
- */
- List<Dept> findAll();
-
- int addDept(Dept dept);
- }
-
-
-
- //DAO实现类
-
- public class EmpDaoImpl implements EmpDao {
- private static String driver ="com.mysql.cj.jdbc.Driver";
- private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
- private static String user="root";
- private static String password="root";
-
- @Override
- public int addEmp(Emp emp) {
- // 向 Emp表中增加一条数据
- Connection connection = null;
- PreparedStatement preparedStatement=null;
- int rows=0;
-
-
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
- String sql="insert into emp values(DEFAULT ,?,?,?,?,?,?,?)";
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
- //设置参数
- preparedStatement.setObject(1,emp.getEname());
- preparedStatement.setObject(2,emp.getJob() );
- preparedStatement.setObject(3,emp.getMgr());
- preparedStatement.setObject(4,emp.getHiredate());
- preparedStatement.setObject(5,emp.getSal());
- preparedStatement.setObject(6,emp.getComm());
- preparedStatement.setObject(7,emp.getDeptno());
-
- //执行CURD
- rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
- }catch (Exception e){
- e.printStackTrace();
- }finally {
-
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
-
- return rows;
- }
-
- @Override
- public int deleteByEmpno(int empno) {
- // 向 Emp表中增加一条数据
- Connection connection = null;
- PreparedStatement preparedStatement=null;
- int rows=0;
-
-
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
- String sql="delete from emp where empno =?";
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
- //设置参数
- preparedStatement.setObject(1,empno);
-
-
- //执行CURD
- rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
-
- }catch (Exception e){
- e.printStackTrace();
- }finally {
-
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
-
- return rows;
- }
-
- @Override
- public List<Emp> findAll() {
- // 查询名字中包含字母A的员工信息
- Connection connection = null;
- PreparedStatement preparedStatement=null;
- ResultSet resultSet=null;
-
- List<Emp> list =null;
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
-
- String sql="select * from emp";
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
- //执行CURD
- resultSet = preparedStatement.executeQuery();// 这里不需要再传入SQL语句
- list=new ArrayList<Emp>() ;
- while(resultSet.next()){
- int empno = resultSet.getInt("empno");
- String ename = resultSet.getString("ename");
- String job = resultSet.getString("job");
- int mgr = resultSet.getInt("mgr");
- Date hiredate = resultSet.getDate("hiredate");
- double sal= resultSet.getDouble("sal");
- double comm= resultSet.getDouble("comm");
- int deptno= resultSet.getInt("deptno");
- Emp emp =new Emp(empno, ename, job, mgr, hiredate, sal, comm, deptno);
- list.add(emp);
- }
-
- }catch (Exception e){
- e.printStackTrace();
- }finally {
- if(null != resultSet){
- try {
- resultSet.close();
- } catch (SQLException e) {
- e.printStackTrace();
-
- }
-
- }
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- return list;
- }
-
- @Override
- public int updateEmp(Emp emp) {
- // 向 Emp表中增加一条数据
- Connection connection = null;
- PreparedStatement preparedStatement=null;
- int rows=0;
-
-
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
- String sql="update emp set ename =? ,job=?, mgr =?,hiredate =?,sal=?,comm=?,deptno=? where empno =?";
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
- //设置参数
- preparedStatement.setObject(1,emp.getEname());
- preparedStatement.setObject(2,emp.getJob() );
- preparedStatement.setObject(3,emp.getMgr());
- preparedStatement.setObject(4,emp.getHiredate());
- preparedStatement.setObject(5,emp.getSal());
- preparedStatement.setObject(6,emp.getComm());
- preparedStatement.setObject(7,emp.getDeptno());
- preparedStatement.setObject(8,emp.getEmpno());
-
- //执行CURD
- rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
- }catch (Exception e){
- e.printStackTrace();
- }finally {
-
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
-
- return rows;
- }
- }
-
-
- public class DeptDaoImpl implements DeptDao {
- private static String driver ="com.mysql.cj.jdbc.Driver";
- private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
- private static String user="root";
- private static String password="root";
- @Override
- public List<Dept> findAll() {
- // 查询名字中包含字母A的员工信息
- Connection connection = null;
- PreparedStatement preparedStatement=null;
- ResultSet resultSet=null;
-
- List<Dept> list =null;
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
-
- String sql="select * from dept";
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
- //执行CURD
- resultSet = preparedStatement.executeQuery();// 这里不需要再传入SQL语句
- list=new ArrayList<Dept>() ;
- while(resultSet.next()){
- int deptno = resultSet.getInt("deptno");
- String dname = resultSet.getString("dname");
- String loc = resultSet.getString("loc");
- Dept dept =new Dept(deptno,dname,loc);
- list.add(dept);
- }
-
- }catch (Exception e){
- e.printStackTrace();
- }finally {
- if(null != resultSet){
- try {
- resultSet.close();
- } catch (SQLException e) {
- e.printStackTrace();
-
- }
-
- }
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- return list;
- }
-
- @Override
- public int addDept(Dept dept) {
- // 向 Emp表中增加一条数据
- Connection connection = null;
- PreparedStatement preparedStatement=null;
- int rows=0;
-
-
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
- String sql="insert into dept values(?,?,?)";
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
- //设置参数
- preparedStatement.setObject(1,dept.getDeptno());
- preparedStatement.setObject(2,dept.getDname());
- preparedStatement.setObject(3,dept.getLoc() );
-
-
- //执行CURD
- rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
- }catch (Exception e){
- e.printStackTrace();
- }finally {
-
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
-
- return rows;
- }
- }
-
-
-
- //EmpManageSystem类
-
- public class EmpManageSystem {
- private static Scanner sc =new Scanner(System.in);
- private static EmpDao empDao =new EmpDaoImpl();
- private static DeptDao deptDao=new DeptDaoImpl();
- private static SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");;
-
- public static void main(String[] args) {
- while(true){
- showMenu();
- System.out.println("请录入选项");
- int option =sc.nextInt();
- switch (option){
- case 1:
- case1();
- break;
- case 2:
- case2();
- break;
- case 3:
- case3();
- break;
- case 4:
- case4();
- break;
- case 5:
- case5();
- break;
- case 6:
- case6();
- break;
- case 7:
- sc.close();
- System.exit(0);
- break;
- default:
- System.out.println("请正确输入选项");
- }
- }
- }
- private static void case1(){
- List<Emp> emps = empDao.findAll();
- emps.forEach(System.out::println);
- }
- private static void case2(){
- List<Dept> depts = deptDao.findAll();
- depts.forEach(System.out::println);
- }
- private static void case3(){
- System.out.println("请输入要删除的员工编号");
- int empno=sc.nextInt();
- empDao.deleteByEmpno(empno);
- }
- private static void case4(){
- System.out.println("请输入员工编号");
- int empno =sc.nextInt();
- System.out.println("请输入员工姓名");
- String ename =sc.next();
- System.out.println("请输入员工职位");
- String job =sc.next();
- System.out.println("请输入员工上级");
- int mgr =sc.nextInt();
- System.out.println("请输入员工入职日期,格式为yyyy-MM-dd");
- Date hiredate =null;
- try {
- hiredate = simpleDateFormat.parse(sc.next());
- } catch (ParseException e) {
- e.printStackTrace();
- }
- System.out.println("请输入员工工资");
- double sal =sc.nextDouble();
- System.out.println("请输入员工补助");
- double comm=sc.nextDouble();
- System.out.println("请输入员工部门号");
- int deptno =sc.nextInt();
- Emp emp=new Emp(empno, ename, job, mgr, hiredate, sal, comm,deptno);
- empDao.updateEmp(emp);
- }
- private static void case5(){
-
- System.out.println("请输入员工姓名");
- String ename =sc.next();
- System.out.println("请输入员工职位");
- String job =sc.next();
- System.out.println("请输入员工上级");
- int mgr =sc.nextInt();
- System.out.println("请输入员工入职日期,格式为yyyy-MM-dd");
- Date hiredate =null;
- try {
- hiredate = simpleDateFormat.parse(sc.next());
- } catch (ParseException e) {
- e.printStackTrace();
- }
- System.out.println("请输入员工工资");
- double sal =sc.nextDouble();
- System.out.println("请输入员工补助");
- double comm=sc.nextDouble();
- System.out.println("请输入员工部门号");
- int deptno =sc.nextInt();
- Emp emp=new Emp(null, ename, job, mgr, hiredate, sal, comm,deptno);
- empDao.addEmp(emp);
- }
- private static void case6(){
- System.out.println("请录入部门号");
- int deptno =sc.nextInt();
- System.out.println("请录入部门名称");
- String dname =sc.next();
- System.out.println("请录入部门位置");
- String loc =sc.next();
- Dept dept =new Dept(deptno,dname,loc);
- deptDao.addDept(dept);
- }
-
- public static void showMenu(){
- System.out.println("************************************");
- System.out.println("* 1 查看所有员工信息");
- System.out.println("* 2 查看所有部门信息");
- System.out.println("* 3 根据工号删除员工信息");
- System.out.println("* 4 根据工号修改员工信息");
- System.out.println("* 5 增加员工信息");
- System.out.println("* 6 增加部门信息");
- System.out.println("* 7 退出");
- System.out.println("************************************");
- }
- }
DAO抽取
- //BaseDAO代码
-
- public abstract class BaseDao {
- private static String driver ="com.mysql.cj.jdbc.Driver";
- private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
- private static String user="root";
- private static String password="root";
-
- public int baseUpdate(String sql,Object ... args){
- // 向 Emp表中增加一条数据
- Connection connection = null;
- PreparedStatement preparedStatement=null;
- int rows=0;
-
-
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
-
- preparedStatement = connection.prepareStatement(sql);
- //设置参数
- for (int i = 0; i <args.length ; i++) {
- preparedStatement.setObject(i+1, args[i]);
- }
-
- //执行CURD
- rows =preparedStatement.executeUpdate();// 这里不需要再传入SQL语句
- }catch (Exception e){
- e.printStackTrace();
- }finally {
-
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
-
- return rows;
- }
-
-
- public List baseQuery(Class clazz,String sql,Object ... args) {
- // 查询名字中包含字母A的员工信息
- Connection connection = null;
- PreparedStatement preparedStatement=null;
- ResultSet resultSet=null;
-
- List list =null;
- try{
- Class.forName(driver);
- connection = DriverManager.getConnection(url, user,password);
- preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
- //设置参数
- for (int i = 0; i <args.length ; i++) {
- preparedStatement.setObject(i+1, args[i]);
- }
-
-
- //执行CURD
- resultSet = preparedStatement.executeQuery();// 这里不需要再传入SQL语句
- list=new ArrayList() ;
- // 根据字节码获取所有 的属性
- Field[] fields = clazz.getDeclaredFields();
- for (Field field : fields) {
- field.setAccessible(true);// 设置属性可以 访问
- }
-
- while(resultSet.next()){
- // 通过反射创建对象
- Object obj = clazz.newInstance();//默认在通过反射调用对象的空参构造方法
- for (Field field : fields) {// 临时用Field设置属性
- String fieldName = field.getName();// empno ename job .... ...
- Object data = resultSet.getObject(fieldName);
- field.set(obj,data);
- }
- list.add(obj);
-
- }
-
- }catch (Exception e){
- e.printStackTrace();
- }finally {
- if(null != resultSet){
- try {
- resultSet.close();
- } catch (SQLException e) {
- e.printStackTrace();
-
- }
-
- }
- if(null != preparedStatement){
- try {
- preparedStatement.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if(null != connection){
- try {
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- return list;
- }
-
- }
-
- //实现类代码
- public class EmpDaoImpl extends BaseDao implements EmpDao {
-
- @Override
- public int addEmp(Emp emp) {
- String sql="insert into emp values(DEFAULT ,?,?,?,?,?,?,?)";
- return baseUpdate(sql, emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno());
- }
-
- @Override
- public int deleteByEmpno(int empno) {
- String sql="delete from emp where empno =?";
- return baseUpdate(sql, empno);
- }
-
- @Override
- public List<Emp> findAll() {
- String sql ="select * from emp";
- return baseQuery(Emp.class, sql );
- }
-
- @Override
- public int updateEmp(Emp emp) {
- String sql="update emp set ename =? ,job=?, mgr =?,hiredate =?,sal=?,comm=?,deptno=? where empno =?";
- return baseUpdate(sql, emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno(),emp.getEmpno());
-
- }
-
-
- }
-
- public class DeptDaoImpl extends BaseDao implements DeptDao {
-
- @Override
- public List<Dept> findAll() {
- String sql="select * from dept";
- return baseQuery(Dept.class, sql);
- }
-
- @Override
- public int addDept(Dept dept) {
- String sql="insert into dept values(?,?,?)";
- return baseUpdate(sql, dept.getDeptno(),dept.getDname(),dept.getLoc());
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。