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);
}
}
执行结果: