JDBC
JDBC
概念
Java database connectivity
java数据库连接
Java语言操作数据库
本质
数据库实现了数据的持久化,但我们最终要在程序里处理数据,那java代码中怎么去访问数据库读写数据呢?
官方(Sun公司)定义了一套操作所有关系型数据库的规则,即接口。各个数据库去实现这套接口,提供数据库驱动jar包实现自家的驱动Driver。我们可以使用这套接口(jdbc)编程,java就可以对数据库进行操作了,真正执行的代码是驱动jar包中的实现类。
快速入门
jdbc下载地址:https://dev.mysql.com/downloads/connector/j/
步骤
- 导入驱动jar包
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 获取执行sql语句的对象 Statement
- 执行sql 接收返回的结果
- 处理结果
- 释放资源
public static void main(String[] args) throws ClassNotFoundException, SQLException, SQLException {
//1. 导入驱动jar包
//lib,加入库
//2. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//3. 获取数据库连接对象 Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
//4. 定义sql
String sql="update account set money=1000 where id=1";
//5. 获取执行sql语句的对象 Statement
Statement stmt = conn.createStatement();
//6. 执行sql 接收返回的结果
int count = stmt.executeUpdate(sql);
//7. 处理结果
System.out.println(count);
//8. 释放资源
stmt.close();
conn.close();
}
详解各个对象
DriverManager:驱动管理对象
功能:
注册驱动
告诉程序该实验一个数据库驱动jar
static void registerDriver(Driver driver):注册与给定的驱动程序DriverManager.
写代码使用(简单):Class.forName(“com.mysql.cj.jdbc.Driver”);
通过查看源码发现:在com.mysql.cj.jdbc.Driver类中存在静态代码块
static{
try{
java.sql.DriverManager.registerDriver(new Driver());
}catch(SQLException E){
throw new RuntimeException(“Can’t register driver!”);
}
}
在mysql5之后驱动jar包可以省略注册驱动的步骤。
获取数据库的连接。
DriverManager中的方法:static Connection getConnection(String url,String user,String password);
①参数:
url:指定连接的路径(jdbc:mysql://ip(域名):端口号/数据名称)
localhost表示本机。
如果连接的是本机的mysql服务器,并且Mysql服务器默认端口为3306,则url可以简写为(jdbc:mysql:///数据名称)
Connection:数据库连接对象
获取执行sql的对象
Statement createStatement()
PreparedStatement preparedStatement(String sql);
管理事务
- 开启事务:void setAutoCommit(boolean autoCommit)设置参数为false,则开启事务手动提交
- 提交事务:void commit()
- 回滚事务:void roolback();
statement:执行sql对象
- boolean execute(String sql):可以执行任意的sql语句(了解)
- int executeUpdate(String sql):可以执行DML(update,delete,insert),DDL(create,drop,alter)语句
返回值int:表示影响的行数,可以通过影响的行数判断DML语句是否执行成功,返回值>0则执行成功,反之,失效。 - ResultSet executeQuery(String sql):执行select语句
ResultSet:结果集对象,封装查询的结果
方法
Boolean next():游标向下移动一行(游标默认指向表头,即第一行数据的上一行)(判断当前行是否是最后一行末尾(是否有数据),如果是,返回false,不是,返回true)
getXxx(参数):Xxx代表数据类型;如:getInt()
参数:int类型:表示列的编号
String类型:表示类的名称,getXxx(“列名”);
String sql="select * from account ";
//执行对象
stmt = conn.createStatement();
rs=stmt.executeQuery(sql);
//结果处理
while (rs.next()) {
int i = rs.getInt(1);
String j = rs.getString("name");
double k = rs.getDouble(3);
System.out.println( i+ "---" + j + "---" + k);
}
....
//在finaly里释放资源
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
使用步骤
- 游标向下移动一行
- 判断是否有数据
- 获取数据
练习insert
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo2 {
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;
try {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//连接对象
conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
//sql
String sql="insert into account values(3,'王五',1000)";
//执行对象
stmt = conn.createStatement();
int num = stmt.executeUpdate(sql);
System.out.println(num);
if (num>0){
System.out.println("执行成功!");
}else {
System.out.println("执行失败!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
练习update
String sql="update account set money=100";
练习select语句
Emp类
package emp;
import java.util.Date;
public class Emp {
private int id;
private String ename;
private int job_id;
private int mgr;
private Date joindate;
private double salary;
private double bonus;
private int dept_id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getJob_id() {
return job_id;
}
public void setJob_id(int job_id) {
this.job_id = job_id;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public Date getJoindate() {
return joindate;
}
public void setJoindate(Date joindate) {
this.joindate = joindate;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public double getBonus() {
return bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
public int getDept_id() {
return dept_id;
}
public void setDept_id(int dept_id) {
this.dept_id = dept_id;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", ename='" + ename + '\'' +
", job_id=" + job_id +
", mgr=" + mgr +
", joindate=" + joindate +
", salary=" + salary +
", bonus=" + bonus +
", dept_id=" + dept_id +
'}';
}
}
测试类
package emp;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class EmpDemo {
public static void main(String[] args) {
List<Emp> all = new EmpDemo().getAll();
System.out.println(all);
System.out.println(all.size());
}
private List<Emp> getAll(){
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
List<Emp> list=new ArrayList<Emp>();
try {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//连接对象
conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
//sql
String sql="select * from emp";
//创建执行sql的statement对象
stmt = conn.createStatement();
//执行sql
rs = stmt.executeQuery(sql);
//处理结果
Emp m=new Emp();
while (rs.next()){
int id = rs.getInt("id");
String ename = rs.getString("ename");
int job_id = rs.getInt("job_id");
int mgr = rs.getInt("mgr");
Date joindate = rs.getDate("joindate");
double salary = rs.getDouble("salary");
double bonus = rs.getDouble("bonus");
int dept_id = rs.getInt("dept_id");
m.setId(id);
m.setEname(ename);
m.setJob_id(job_id);
m.setMgr(mgr);
m.setJoindate(joindate);
m.setSalary(salary);
m.setBonus(bonus);
m.setDept_id(dept_id);
list.add(m);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
}