使用JDBC操作数据库

本文介绍了JDBC(Java Database Connectivity)的基本使用,包括加载数据库驱动、建立连接、执行SQL语句以及关闭资源。讨论了prepareStatement与creatStatement的区别,前者预编译提高效率,适合批量操作,后者适用于一次性操作。并提供了一个完整的JDBC操作数据库的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDBC是Java数据库连接(Java Database Connectivity)的简称,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了查询和更新数据库数据的方法。

JDBC的使用

1、根据数据库不同导入相应jar包。这里用到的数据库是MySQL,版本为8.0.12,可以在MySQL官网下载对应版本的MySQL的jdbc驱动jar包,并导如的项目中。

在这里插入图片描述

2、加载驱动。使用Class.forName()方法加载MySQL连接驱动,在使用MySQL 5及之前的数据库和数据库连接时需要使用“com.mysql.jdbc.Driver”进行加载,使用的是MySQL 6及之后的数据库和数据库连接时就需要使用“com.mysql.cj.jdbc.Driver”进行加载。

在这里插入图片描述

3、根据数据参数(url、username、password)来获取数据库连接。url中的mysql的默认端口号为3306,并且在MySQL 8.0以上的数据库的url后面需要加上“?useSSL=false&serverTimezone=UTC”,指明是否进行SSL连接和指定时区

在这里插入图片描述
在这里插入图片描述

4、创建需要执行的sql命令。

在这里插入图片描述

5、执行sql命令,获取结果集。

在这里插入图片描述

6、遍历查询结果。

在这里插入图片描述

7、关闭资源。

在这里插入图片描述

prepareStatement与creatStatement

在执行sql语句的时候可以选择是使用prepareStatement执行sql语句还是使用createStatement的方式执行sql语句。

在这里插入图片描述

1、preparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程。

preparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,preparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。但是preparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

2、Statement不会初始化,没有预处理,每次都是从0开始执行SQL。在对数据库只执行一次性存取的时侯,适合用 Statement 对象进行处理。

3、preparedStatement可以使用占位符“?”进行参数赋值,createStatement只能使用字符串拼接的方式进行参数赋值。

完整示例

实体类Emp:

package com.jdbcDemo;

import java.util.Date;

public class Emp {
	private int empno;
	private String ename;
	private String job;
	private int mgr;
	private Date date;
	private double sal;
	private double comm;
	private int 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 Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	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;
	}
	@Override
	public String toString() {
		return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", mgr=" + mgr + ", date=" + date
				+ ", sal=" + sal + ", comm=" + comm + ", deptno=" + deptno + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		long temp;
		temp = Double.doubleToLongBits(comm);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		result = prime * result + ((date == null) ? 0 : date.hashCode());
		result = prime * result + deptno;
		result = prime * result + empno;
		result = prime * result + ((ename == null) ? 0 : ename.hashCode());
		result = prime * result + ((job == null) ? 0 : job.hashCode());
		result = prime * result + mgr;
		temp = Double.doubleToLongBits(sal);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Emp other = (Emp) obj;
		if (Double.doubleToLongBits(comm) != Double.doubleToLongBits(other.comm))
			return false;
		if (date == null) {
			if (other.date != null)
				return false;
		} else if (!date.equals(other.date))
			return false;
		if (deptno != other.deptno)
			return false;
		if (empno != other.empno)
			return false;
		if (ename == null) {
			if (other.ename != null)
				return false;
		} else if (!ename.equals(other.ename))
			return false;
		if (job == null) {
			if (other.job != null)
				return false;
		} else if (!job.equals(other.job))
			return false;
		if (mgr != other.mgr)
			return false;
		if (Double.doubleToLongBits(sal) != Double.doubleToLongBits(other.sal))
			return false;
		return true;
	}
	public Emp() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Emp(int empno, String ename, String job, int mgr, Date date, double sal, double comm, int deptno) {
		super();
		this.empno = empno;
		this.ename = ename;
		this.job = job;
		this.mgr = mgr;
		this.date = date;
		this.sal = sal;
		this.comm = comm;
		this.deptno = deptno;
	}
}

JdbcUtil类:

package com.jdbcDemo;

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

public class JdbcUtil {
	private static String driver;
	private static String url;
	private static String username;
	private static String password;
	
	static{
		//创建properties对象获取属性文件的内容
		//Properties p=new Properties();
		//获取属性文件的读取流对象
		//InputStream is=JdbcUtil.class.getResourceAsStream("/db.properties");
		try {
			//加载属性配置文件
			//p.load(is);
			//获取jdbc参数
			driver = "com.mysql.cj.jdbc.Driver";
			url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
			username = "root";
			password = "123456";
			//加载驱动
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//获取Connection对象
	public static Connection getConnection(){
		Connection conn=null;
		try {
			 conn=DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
		
	}
	
	//封装获取PreparedStatement对象
	public static PreparedStatement getPreparedStatement(String sql,Connection conn){
		
		PreparedStatement ps=null;
		try {
			ps =conn.prepareStatement(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return ps;
		
	}
	
	//封装获取Statement对象
	public static Statement getStatement(Connection conn){
		Statement stmt=null;
		try {
			stmt = conn.createStatement();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return stmt;
		
	}
	
	//关闭资源
	public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
		try {
			rs.close();
		} catch (Exception e) {
			
		}
		try {
			stmt.close();
		} catch (SQLException e) {
			
		}
		try {
			conn.close();
		} catch (SQLException e) {
			
		}
	}
	
	//封装DML
	public static int executeDML(String sql,Object...objs){
		//创建连接对象
		Connection conn=getConnection();
		//创建sql命令对象
		PreparedStatement ps=JdbcUtil.getPreparedStatement(sql, conn);
		//给占位符赋值
			try {
				conn.setAutoCommit(false);
				for(int i=0;i<objs.length;i++){
					ps.setObject(i+1, objs[i]);
				}
				int i=ps.executeUpdate();
				conn.commit();
				return i;
			} catch (Exception e) {
					try {
						conn.rollback();
					} catch (SQLException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
			}finally{
				//关闭资源
				JdbcUtil.closeAll(null, ps, conn);
			}
			//返回结果
			return -1;
	}
}

程序入口主类:

package com.jdbcDemo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;

public class JdbcTest {

	public static void main(String[] args) {
		selAllEmpInfo();
	}

	// 查询所有员工信息
	public static ArrayList<Emp> selAllEmpInfo() {
		// 声明JDBC对象
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		// 声明集合对象
		ArrayList<Emp> list = null;
		try {
			// 获取连接对象
			conn = JdbcUtil.getConnection();
			// 创建sql命令
			String sql = "select * from tb_user";
			// 创建sql命令对象
			ps = JdbcUtil.getPreparedStatement(sql, conn);
			// 执行sql
			rs = ps.executeQuery();
			list = new ArrayList<>();
			// 遍历查询结果
			while (rs.next()) {
				// 创建Emp对象
				Emp p = new Emp();
				p.setEmpno(rs.getInt("empno"));
				p.setEname(rs.getString("ename"));
				p.setJob(rs.getString("job"));
				p.setMgr(rs.getInt("mgr"));
				p.setDate(rs.getDate("hiredate"));
				p.setSal(rs.getDouble("sal"));
				p.setComm(rs.getDouble("comm"));
				p.setDeptno(rs.getInt("deptno"));
				list.add(p);
				System.out.println(p.toString());
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {// 关闭资源
			JdbcUtil.closeAll(rs, ps, conn);
		}
		// 返回结果
		return list;
	}
	
	//根据编号查询员工信息
	public Emp selEmpInfoByEmpno(int empno){
		//声明jdbc变量
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		//声明Emp对象
		Emp p=null;
		try {
			//获取连接对象
			conn=JdbcUtil.getConnection();
			//创建sql命令
			String sql="select * from emp where empno=?";
			//获取sql命令对象
			ps=JdbcUtil.getPreparedStatement(sql, conn);
			//给占位符赋值
			ps.setInt(1,empno);
			//执行符sql
			rs=ps.executeQuery();
			//遍历结果
			if(rs.next()){
				p=new Emp();
				p.setEmpno(rs.getInt("empno"));
				p.setEname(rs.getString("ename"));
				p.setJob(rs.getString("job"));
				p.setMgr(rs.getInt("mgr"));
				p.setDate(rs.getDate("hiredate"));
				p.setSal(rs.getDouble("sal"));
				p.setComm(rs.getDouble("comm"));
				p.setDeptno(rs.getInt("deptno"));
			}
		} catch (Exception e2) {
			// TODO: handle exception
		}finally{//关闭资源
			JdbcUtil.closeAll(rs, ps, conn);
		}
		//返回结果
		return p;
	}
	//添加员工信息
	public int insEmpInfo(int empno,String ename,String job,int mgr,Date hiredate,double sal,double comm,int deptno){
		//创建sql语句
		String sql="insert into emp values(?,?,?,?,?,?,?,?)";
		//将日期转换为java.sql.date类型
		java.sql.Date d=new java.sql.Date(hiredate.getTime());
		int i=JdbcUtil.executeDML(sql,empno,ename,job,mgr,d,sal,comm,deptno);
		return i;
	}
	//修改员工姓名
	public int upEmp(String newName,int empno){
		return JdbcUtil.executeDML("update emp set ename=? where empno=?",newName,empno);
	}
	//删除员工信息	
	public int delEmp(int empno){
		return JdbcUtil.executeDML("delete from emp where empno=?",empno);
	
	}

}

执行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值