目录
JDBC
类加载
JDBC的连接
导入jar包
加载驱动类
链接数据库
获得一个Statement对象
执行sql语句
ResultSet
获得结果的方法
PrepareStatement
事务
总结
JDBC
是Java访问数据库的标准规范 (接口),具体实现是由不同的数据库厂商来完成的
类加载
将类的信息从字节码文件读取到JVM中
方式:new、调用静态属性或者静态方法、用子类、手动类加载(Class.forName())
JDBC的连接
- 导入jar包
- 加载驱动(类)
- 链接数据库
- 获得一个Statement对象
- 执行sql语句
导入jar包
略
加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
Class.forName("com.mysql.cj.jdbc.Driver");
驱动路径有两种:"com.mysql.cj.jdbc.Driver"(使用于mysql8,兼容mysql5)和"com.mysql.jdbc.Driver"(适用于mysql5)
链接数据库
String url = "jdbc:mysql://127.0.0.1:3306/数据库名称?serverTimezone=GMT";
Connection conn = DiverManger.getConnection(url,"账户名","密码");
获得一个Statement对象
Statement stmt = conn.createStatemt();
执行sql语句
- stmt.execute(String sql)方法,可以执行ddl、dml、dql语句,但建议执行ddl,返回值boolean类型,判断是否有返回结果
- stmt.executeUpdate(String sql)方法,可以执行ddl、dml、dql语句,但建议执行dml,返回值int类型,判断有几条返回结果
- stmt.executeQuery(String sql)方法,只能执行dql语句,返回值为一个ResultSet对象
ResultSet
String url = "jdbc:mysql://127.0.0.1:3306/数据库名称?serverTimezone=GMT";
Connection conn = DiverManger.getConnection(url,"账户名","密码");
Statement stmt = conn.createStatemt();
执行sql语句
- stmt.execute(String sql)方法,可以执行ddl、dml、dql语句,但建议执行ddl,返回值boolean类型,判断是否有返回结果
- stmt.executeUpdate(String sql)方法,可以执行ddl、dml、dql语句,但建议执行dml,返回值int类型,判断有几条返回结果
- stmt.executeQuery(String sql)方法,只能执行dql语句,返回值为一个ResultSet对象
ResultSet
stmt.executeQuery(String sql)返回的结果的集合,只有一个方法next()
刚开始ResultSet指向结果中第一个记录的前面,必须使用next()使ResultSet指向的位置移动
String sql = "select * from emp";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()){
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
String job = rs.getString("job");
String mgr = rs.getString("mgr");
if (mgr==null) mgr = "无";
Date hiredate = rs.getDate("hiredate");
int sal = rs.getInt("sal");
int comm = rs.getInt("comm");
String deptno = rs.getString("deptno");
if (deptno==null) deptno="无";
System.out.println("雇员编号:"+empno+",姓名:"+ename+",职业:"+job+",经理编号:"+mgr+",入职时间:"+hiredate+",薪水:"+sal+",奖金:"+comm+",部门编号:"+deptno);
}
获得结果的方法
要获得int类型就调用getInt方法,要获得String类型就调用getString方法,以此类推
getXXX()方法中需要输入参数,可以是String类型的字段名,也可以是int类型字段对应的下标(JDBC下标从1开始)
PrepareStatement
预编译:先将sql语言模板发到数据库,再发送数据
String sql = "select * from emp where ? or ?"; PreparedStatement pstmt = conn.preparedStatement(sql); pstmt.setString(1,"替换第一个?"); pstmt.setInt(2,999);//替换第二个?
事务
package JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Savepoint;
public class demo04 {
public static void main(String[] args) {
Connection conn = JDBCUtil.getConnection();
Savepoint A = null;
try {
//不同的操作不能用同一个PreparedStatement
PreparedStatement pstmt1 = conn.prepareStatement("update emp set sal = sal-? where ename=?");
PreparedStatement pstmt2 = conn.prepareStatement("update emp set sal = sal+? where ename=?");
pstmt1.setInt(1,100);
pstmt2.setInt(1,100);
pstmt1.setString(2,"ALLEN");
pstmt2.setString(2,"SMITH");
//关闭自动提交(start transaction)
conn.setAutoCommit(false);
pstmt1.executeUpdate();
pstmt2.executeUpdate();
//设置存档点
A = conn.setSavepoint("name");
//制造异常让程序终止
int i=1/0;
pstmt1.executeUpdate();
pstmt2.executeUpdate();
//提交
System.out.println("提交");
conn.commit();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
//如果程序出错,回滚到存档点A
System.out.println("程序出错,回滚到A");
conn.rollback(A);
conn.commit();//回滚完还要提交
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
总结
- JDBC是一种规范,对于不同的数据库厂商,JDBC都是一样的,不同的是驱动地址、url等
- 用PreparedStatement代替Statement
- JDBC的下标从1开始
- JDBC是一种规范,对于不同的数据库厂商,JDBC都是一样的,不同的是驱动地址、url等
- 用PreparedStatement代替Statement
- JDBC的下标从1开始



