JDBC使用
基本概念
java 数据库连接, 是java提供的一套api接口,以一种一致的方式,访问不同的数据库(mysql,oracle,sqlserver)
java.sql.*
java.sql.Driver 驱动(如何连接数据库)
java.sql.Connection 连接(代表java程序和数据库之间连接通道)
java.sql.Statement 执行sql语句
java.sql.PreparedStatement
java.sql.CallableStatement
java.sql.ResultSet 结果集 代表的是从数据库查询结果
java.sql.DriverManager 工具类,用来获取Connection
java.sql.SQLException 代表执行sql过程中出现的异常
具体的实现由数据库厂商来提供
MySQL Connector/J 是mysql提供的针对jdbc接口的实现,以jar包方式提供
idea 中加入mysql驱动jar包(每次)
使用步骤
1)加载驱动
2)创建连接,创建Connection对象
3)创建Statement对象
4)执行sql语句,增删改或者查询
5)关闭释放资源,先打开的资源最后关闭
例如 :
import java.sql.*;
public class TestJDBC1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1) 加载驱动 (在新版的jdbc中可以省略此步骤)只需要执行一次即可
// Class.forName("com.mysql.jdbc.Driver"); mysql 5.1
Class.forName("com.mysql.cj.jdbc.Driver"); // mysql 8.8
//2) 创建连接,创建Connection对象
// jdbc:mysql: 称为连接协议
// localhost: mysql服务器的ip地址
// 3306: 连接端口号
// test3: 数据库名称
// serverTimezone=GMT%2B8 设置连接时区与数据库服务器一致 (连接8.0 mysql时新增 )
String url = "jdbc:mysql://localhost:3306/test3?serverTimezone=GMT%2B8&useSSL=false"; // 数据库的连接字符串
String username="root"; // 数据库用户名
String password="root"; // 数据库的密码
Connection conn = DriverManager.getConnection(url, username, password);
// 3) 创建Statement 对象
Statement stmt = conn.createStatement();
// 4) 执行sql语句(执行增删改或查询)
/* stmt.executeUpdate(sql) // 用来执行 insert, update, delete
stmt.executeQuery(sql) // 用来执行 select
stmt.execute(sql) : 可以增删改也可以查询 ,返回boolean类型,false则为增删改,true则为查询
stmt.execute(sql,Statement.RETURN_GENERATED_KEYS)返回自增的id值
executeUpdate方法返回的整数,代表增删改影响的记录行数
int i = stmt.executeUpdate("insert into dept(deptno,dname,loc) values(60, '教学部', '西安'),(70, '市场部', '西安')");
System.out.println("影响行数是:" +i); */
// 结果集对象
ResultSet rs = stmt.executeQuery("select deptno,dname,loc from dept");
// rs.next() 返回值是一个boolean 表示是否有下一条记录
while(rs.next()) {
/* int deptno = rs.getInt(1);// getXXX方法的参数,代表第几列,从1开始
String dname = rs.getString(2);
String loc = rs.getString(3); */
int deptno = rs.getInt("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
System.out.println(deptno + "\t" + dname + "\t" + loc);
}
// 5) 关闭释放资源, 先打开的资源最后关闭
rs.close();
stmt.close();
conn.close();
}
}
重要接口API
ResultSet
1)查询时需要 ,next() 方法
移动到结果集的下一条记录,如果返回true表示有下一条记录,否则返回false
2)getXxx(int 列下表)
用来获取结果集中某一列的数据,其中XXX为数据类型,如果是字符串使用 getString 如果是整数,使用getInt ... ,列下标从1开始
getXxx(列名)也可用于获取结果集中某列数据
PreparedStatement
需要SQL语句中的值使用'?'占位符,再通过setXxx方法给'?'赋值
若为整数类型调用setInt(?的下标, 值),下标的值从1开始
异常的处理
为方便起见,最好创建个Utils包,方便直接创建连接,以及快速关闭释放资源
异常处理大致如下 :
import java.sql.*;
public class TestJDBC4 {
public static void aaa(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = Utils.getConnection();
stmt = conn.prepareStatement("select * from Student");
rs = stmt.executeQuery();
} catch (Exception e) {
e.printStackTrace();
} finally {
Utils.close(rs, stmt, conn);
}
}
public static void bbb(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = Utils.getConnection();
stmt = conn.prepareStatement("insert * from Student");
stmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
Utils.close(stmt, conn);
}
}
}
表格-->对象
创建个类
类名相当于数据库表名
类中属性相当于数据库列名
再通过setXxx()方法和getXxx()方法输入或者输入值,一一对应
例 :
//自定义School类含学生id,姓名,生日和性别等属性,还有set,get方法
//工具包Utils创建连接方法和关闭资源方法
public class TestSchool {
//查找方法
public School findById(int sid){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = Utils.getConnection();
//输入sql语句
String sql = "select * from student where sid = ?";
stmt = conn.prepareStatement(sql);
//给占位符赋值
stmt.setInt(1,sid);
//执行语句
rs = stmt.executeQuery();
//因为不存在循环,只返回一条语句所以用if
if(rs.next()){
//把数据用School保存起来
School sc = new School();
sc.setSid(rs.getInt("sid"));
sc.setSname(rs.getString("sname"));
sc.setBirthday(rs.getDate("birthday"));
sc.setSex(rs.getString("sex"));
return sc;
}else {
return null;
}
}catch (Exception e){
throw new RuntimeException();
}finally {
Utils.close(rs,stmt,conn);
}
}
public static void main(String[] args) throws ParseException {
//创建TestSchool对象
TestSchool ts = new TestSchool();
School byId = ts.findById(1006);
System.out.println(byId);
}
}