Java-通过代码操作数据库增删改查

涎涎原创约 2376 字大约 8 分钟...JavaJava

Java-通过代码操作数据库增删改查

注意

本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。

DBUtil

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 连接数据库的工具类
 * 
 * @author hp
 *
 */
public class DBUtil {

	//获取Connection连接的方法
	public static Connection getConnection() {
		Connection conn=null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott123");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	//释放资源的方法
	public static void release(Connection conn, Statement stmt, ResultSet rs) {
		try {
			if (rs != null) {
				rs.close();
			}
			if (stmt != null) {
				stmt.close();
			}
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

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.Arrays;
import java.util.List;

/**
 * 对emp表进行增删改查的数据访问对象
 * Dao是数据访问对象
 * @author hp
 *
 */
public class EmpDao {

	// 1.根据id查询某个员工信息
	public Emp queryEmpByEmpno(Integer empno) {
		Emp emp = null;

		/**
		 * 1、连接数据库
		 * 2、Statement操作对象 传送sql语句到数据库并执行
		 * 3、获取结果集ResultSet
		 * 4、把结果集中的数据转化为EMP对象
		 */
		
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		String query_mes_by_empno = 
				"select empno,ename,job,hiredate,sal from emp where empno="+empno;
		
		try {
			conn = DBUtil.getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery(query_mes_by_empno);
//			4、把结果集中的数据转化为EMP对象
			//目标是把结果集中的数据取出来放入emp对象中
			emp = new Emp();
			if(rs.next()) {//确认结果集中只有一条数据,所以只需要游标移动一次
//				System.out.println(rs.getDouble("sal"));
//				System.out.println(rs.getString("ename"));
//				System.out.println(rs.getInt("empno"));
//				System.out.println(rs.getString("job"));
//				System.out.println(rs.getDate("hiredate"));
				
				emp.setSal(rs.getDouble("sal"));
				emp.setEname(rs.getString("ename"));
				emp.setEmpno(rs.getInt("empno"));
				emp.setJob(rs.getString("job"));
				//sql.date继承util.date 故setHiredate中要求的日期类型是util.data
				//用其子类也可以。。
				emp.setHiredate(rs.getDate("hiredate"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.release(conn, stmt, rs);
		}
		return emp;
	}

	// 2.根据id查询某个员工的工资 √
	//因为没有id所以我理解成empno
	public Double querySalByEmpno(Integer empno) {
		Double sal = null;
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		String query_sal_by_empno = "select sal from emp where empno = " + empno;
		try {
			conn = DBUtil.getConnection();//获取连接方法
			stmt = conn.createStatement();//创建执行sql语句的命令对象
			rs = stmt.executeQuery(query_sal_by_empno);//执行sql语句
			if(rs.next()) {
				sal = rs.getDouble("sal");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.release(conn, stmt, rs);
		}
		return sal;
	}

	// 3.查询所有员工的总工资 √
	public Double querySumSal() {
		Double sal = null;
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		String query_sumSal = "select sum(sal) from emp";
		
		try {
			conn = DBUtil.getConnection();//获取链接的方法
			stmt = conn.createStatement();//创建执行SQL语句的命令对象
			rs = stmt.executeQuery(query_sumSal);//执行sql语句
			if(rs.next()) {
				sal = rs.getDouble("sum(sal)");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.release(conn, stmt, rs);
		}
		return sal;
	}

	// 4.查询所有员工信息
	public List<Emp> queryAllEmp() {
		List<Emp> list = new ArrayList<>();//集合一声明必须马上实例化 因为马上要往堆区放元素

		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		String query_allms =
				"select sal,ename,empno,job,hiredate from emp";
		
		try {
			conn = DBUtil.getConnection();
			stmt = conn.createStatement();
			
			rs = stmt.executeQuery(query_allms);
			//如何把数据从结果集中取出来放入list集合呢?
			while(rs.next()) {//确认结果集中有多于一条数据时,就要使用while循环
				Emp emp = new Emp();//这里必须得放循环里面 若放在外边则只有最后一条数据一直重复
				emp.setSal(rs.getDouble("sal"));
				emp.setEname(rs.getString("ename"));
				emp.setEmpno(rs.getInt("empno"));
				emp.setJob(rs.getString("job"));
				//sql.date继承util.date 故setHiredate中要求的日期类型是util.data
				//用其子类也可以。。
				emp.setHiredate(rs.getDate("hiredate"));
				list.add(emp);//将这个对象放在一个集合中
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.release(conn, stmt, rs);
		}
		return list;
	}

	// 5.查询工资前五名的员工信息
	/*
	 * 查询工资前五名的员工信息 select * from emp e where (select count(1) from emp where
	 * sal>e.sal)<=4;
	 */
	public List<Emp> queryEmpLimitFive() {
		List<Emp> list = new ArrayList<>();//集合一声明必须马上实例化 因为马上要往堆区放元素

		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		String query_topSalfive = 
				"select sal,ename,empno,job,hiredate from emp e "
						+ "where (select count(1) from emp where sal>e.sal) <= 4";
		try {
			conn = DBUtil.getConnection();
			stmt = conn.createStatement();
			
			rs = stmt.executeQuery(query_topSalfive);
			//如何把数据从结果集中取出来放入list集合呢?
			while(rs.next()) {//确认结果集中有多于一条数据时,就要使用while循环
				Emp emp = new Emp();//这里必须得放循环里面 若放在外边则只有最后一条数据一直重复
				emp.setSal(rs.getDouble("sal"));
				emp.setEname(rs.getString("ename"));
				emp.setEmpno(rs.getInt("empno"));
				emp.setJob(rs.getString("job"));
				//sql.date继承util.date 故setHiredate中要求的日期类型是util.data
				//用其子类也可以。。
				emp.setHiredate(rs.getDate("hiredate"));
				list.add(emp);//将这个对象放在一个集合中
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.release(conn, stmt, rs);
		}
		return list;
	}

	// 6.根据id删除某个员工
	public int deleteEmpByEmpno(Integer empno) {
		int rows = 0;
		Connection conn=null;
		Statement stmt=null;
		try {
			conn=DBUtil.getConnection();
			stmt=conn.createStatement();
			String delete_emp_by_empno="delete from emp where empno="+empno;

			rows=stmt.executeUpdate(delete_emp_by_empno);
		} catch (Exception e) {
			e.printStackTrace();
		}finally
		{
			DBUtil.release(conn, stmt, null);
		}
		return rows;
	}


	// 7.批量删除(executeBatch方法是提交批处理的命令,
	//返回一个整形数组int[],数组中的每个数字对应一条命令的影响行数,
	//在Oracle的驱动中没有实现该功能,即提交成功后不能返回影响行数,所以返回-2
	public boolean deleteEmp(Integer[] empnos) {
		boolean result = false;
		Connection conn=null;
		PreparedStatement stmt=null;
		String sql="delete from emp where empno=?";
		try {
			conn=DBUtil.getConnection();
			stmt=conn.prepareStatement(sql);
			
			for (Integer id:empnos) {
				stmt.setInt(1,id);//给sql语句中的问号(占位符)赋值,1表示索引,id是值
				stmt.addBatch();//批处理的意思,因为sql语句要执行多次,那么一次执行完
			}
			
			int[] a=stmt.executeBatch();
			
			System.out.println(Arrays.toString(a));
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;

	}

	// 8.更新某个员工的信息  更新不需要结果集
	//若不用点位符。。则这条sql语句很low
	public int updateEmp(Emp emp) {
		int rows = 0;
		Connection conn = null;
		PreparedStatement stmt = null;

		try {
			conn = DBUtil.getConnection();
			stmt = conn.prepareStatement("update emp set ename=?,job=?,sal=?,hiredate=? where empno=?");
			//注意:在执行更新操作之前必须 给点位符赋值
			stmt.setString(1,emp.getEname());//1表示第一个?号
			stmt.setString(2,emp.getJob());//2表示第二个?号
			stmt.setDouble(3,emp.getSal());//3表示第三个?号
			
//			Date date = emp.getHiredate();
//			long time = date.getTime();
//			java.sql.Date date2 = new java.sql.Date(time);
			
			stmt.setDate(4,new java.sql.Date(emp.getHiredate().getTime()));
			stmt.setInt(5,emp.getEmpno());
			
			//执行 更新
			rows = stmt.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.release(conn, stmt, null);
		}
		return rows;
	}

	// 9.添加一个员工信息
	// 一般主键在前 insert into emp (empno,ename,job,sal,hiredate) Values(?,?,?,?,?)
	public int addEmp(Emp emp) {
		int rows = 0;
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
			conn = DBUtil.getConnection();
			stmt = conn.prepareStatement("insert into emp (empno,ename,job,sal,hiredate) Values(?,?,?,?,?)");
			//注意:在执行更新操作之前必须 给点位符赋值
			stmt.setInt(1,emp.getEmpno());//1表示第一个?号
			stmt.setString(2,emp.getEname());//2表示第二个?号
			stmt.setString(3,emp.getJob());//3表示第三个?号
			stmt.setDouble(4,emp.getSal());
//			Date date = emp.getHiredate();
//			long time = date.getTime();
//			java.sql.Date date2 = new java.sql.Date(time);
			stmt.setDate(5,new java.sql.Date(emp.getHiredate().getTime()));
			//执行 更新
			rows = stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.release(conn, stmt, null);
		}
		return rows;
	}
	/**
	 * 10、 批量删除
	 * 有事务控制
	 * @param empnos
	 * @return
	 */
	public boolean deleteEmp_ok(Integer[] empnos) {
		boolean tmp=false;
		Connection conn=null;
		PreparedStatement stmt=null;
		
		try {
			conn=DBUtil.getConnection();
			//设置事务提交为手动
			conn.setAutoCommit(false);
			stmt=conn.prepareStatement("delete from emp where empno=?");
			int rows=0;
			for (int i = 0; i < empnos.length; i++) {
				stmt.setInt(1,empnos[i]);
				
				rows+=stmt.executeUpdate();
				
				/*if(rows==1)
				{
					int a=10/0;
				}*/
			}
			
			if(rows==empnos.length)
			{
				tmp=true;
				//如果删除影响的行数等于数组长度,表示每个删除都有执行,所以事务是成功的,所以事务提交
				conn.commit();
			}else
			{
				conn.rollback();
			}
		} catch (Exception e) {
			e.printStackTrace();
			try {
				//如果代码抛出异常,有的删除执行有的没有执行,那么事务回滚
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}finally
		{
			DBUtil.release(conn, stmt, null);
		}
		return tmp;
	}
}

TestEmpDao 测试类

import java.util.Date;
import java.util.List;

public class TestEmpDao {
	// 1、测试根据id查询某个员工信息
	public static void test_queryEmpByEmpno() {
		EmpDao dao = new EmpDao();
		Emp emp = dao.queryEmpByEmpno(7566);
		System.out.println(emp.toString());
	}
	// 2、测试根据id查询某个员工的工资 
	public static void test_querySalByEmpno() {
		EmpDao dao = new EmpDao();
		Double emp = dao.querySalByEmpno(7369);
		System.out.println(emp);
	}
	// 3、测试查询所有员工的总工资
	public static void test_querySumSal() {
		EmpDao dao = new EmpDao();
		Double emp = dao.querySumSal();
		System.out.println(emp);
	}
	// 4、测试查询所有员工信息
	public static void test_queryAllEmp(){
		EmpDao dao = new EmpDao();
		List<Emp> emp = dao.queryAllEmp();
		System.out.println(emp.toString());
	}
	//5、测试查询工资前五名的员工信息
	public static void test_queryEmpLimitFive() {
		EmpDao dao = new EmpDao();
		List<Emp> emp = dao.queryEmpLimitFive();
		System.out.println(emp.toString());
	}
	
	// 6、测试删除方法
	public static void test_deleteEmpByEmpno() {
		EmpDao dao=new EmpDao();
		
		int rows=dao.deleteEmpByEmpno(8888);

		System.out.println(rows);
	}
	//7、测试批处理删除方法
	public static void test_deleteEmp() {
		
		EmpDao dao=new EmpDao();
		
		Integer[] empnos={7,6};
		
		dao.deleteEmp(empnos);
	}
	//8、测试更新某个员工的信息 
	public static void test_updateEmp() {
		//666不行
		Emp emp = new Emp();
		emp.setEmpno(667);
		emp.setEname("sbmnmjge2");
		emp.setSal(288.9);
		emp.setJob("Hr");
		emp.setHiredate(new Date());
		EmpDao dao = new EmpDao();
		dao.updateEmp(emp);
	}
	//9、测试添加一个员工信息
	public static void test_addEmp() {
		//将Emp类实例化 并赋值属性值
		Emp emp = new Emp();
		emp.setEmpno(666);
		emp.setEname("mnmjgesb");
		emp.setSal(678.0);
		emp.setJob("hr");
		emp.setHiredate(new Date());
		//将Dao类实例化并调用其对应方法 然后将emp对象作为参数传入
		EmpDao dao = new EmpDao();
		dao.addEmp(emp);
	}
	/**
	 * 10、测试批量删除
	 */
	public static void test_deleteEmp_ok() {
		
		EmpDao dao=new EmpDao();
		Integer[] empnos={7566,7698};
		boolean tmp=dao.deleteEmp_ok(empnos);
		System.out.println(tmp);
	}
	
	
	public static void main(String[] args) {
//		test_queryEmpByEmpno();// 1、测试根据id查询某个员工信息
//		test_querySalByEmpno();// 2、测试根据id查询某个员工的工资 
//		test_querySumSal();//3、测试查询所有员工的总工资
//		test_queryAllEmp();//4、测试查询所有员工信息
//		test_queryEmpLimitFive();//5、测试查询工资前五名的员工信息
//		test_deleteEmpByEmpno();// 6、测试删除方法
//		test_deleteEmp();//7、测试批处理删除方法
//		test_updateEmp();//8、测试更新某个员工的信息 
//		test_addEmp();//9、测试添加一个员工信息
//		test_deleteEmp_ok();//10、测试批量删除
	}
}

分割线


相关信息

以上就是我关于 Java-通过代码操作数据库增删改查 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。。

上次编辑于:
贡献者: 涎涎
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.4