JDBC全称又叫做Java DataBase Connectivity,就是Java数据库连接,说白了就是用Java语言来操作数据库。
JDBC原理
JDBC主要是用于java连接数据库的,能连接什么数据库没有指定,其实能连接很多种数据库,熟知的就有oracle、mysql和sqlserver。数据库种类太多,为每种数据库定值连接类对于开发人员来说是非常不友好的。于是sun公司那帮人想出了一个办法,sun公司定义一套规则,数据库厂商都按照这个规则来编写自己数据库的底层原理实现API,而开发人员只需要调用其就实现对数据库的访问。这套规则就是JDBC,遵循了JDBC规范数据库厂商编写的数据库的底层原理实现API被称之为驱动。
连接步骤
- 第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
- 第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,使用完必须关闭)
- 第三步:获取数据库操作对象(专门执行sql语句的对象)
- 第四步:执行sQL语句(DQL DML…)
- 第五步:处理香询结果集(只有当第四步执行的是select语句的时才有这一步)
- 第六步:释放资源(使用完资源之后一定要关闭资源)
例子
public class Main {
// 数据库连接地址
private static String JDBC_URL = null;
// 用户名
private static String JDBC_USER = null;
// 密码
private static String JDBC_PASSWORD = null;
// 驱动
private static String Driver = null;
// 储存学生信息
private static final List<Student> students = new ArrayList<Student>();
public static void main(String[] args) throws SQLException, IOException {
// 读取配置文件
InputStream in = Main.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(in);
JDBC_URL = properties.getProperty("JDBC_URL");
JDBC_USER = properties.getProperty("JDBC_USER");
JDBC_PASSWORD = properties.getProperty("JDBC_PASSWORD");
Driver = properties.getProperty("Driver");
// 注册驱动 利用反射加载静态方法块注册
try {
Class.forName(Driver);
} catch (ClassNotFoundException e) {
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace();
}
// 获取连接对象
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {
// 需要执行的sql语句
String sql = "SELECT * FROM student WHERE sdept=?";
// 获取可执行sql的对象(避免注入攻击)
try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
// 设置参数
preparedStatement.setObject(1, "软件工程");
// 执行
try (ResultSet rs = preparedStatement.executeQuery()) {
/**
* 执行查询 .executeQuery() 查
* 返回值 ResultSet结果集
* 执行更新 .executeUpdate() 增 删 改
* 返回值 int(更新数量)
*/
//遍历结果集,取出数据(.next()返回布尔值)
while (rs.next()) {
Student student = new Student();
student.setSno(rs.getString("Sno"));
student.setSname(rs.getString("Sname"));
student.setSsex(rs.getString("Ssex"));
student.setSage(rs.getInt("Sage"));
student.setSdept(rs.getString("Sdept"));
students.add(student);
}
}
}
}
// 输出结果
students.forEach(System.out::println);
// useBatch(students);
}
// 只有参数不同的若干语句可以使用batch执行
public static void useBatch(List<Student> list) throws SQLException {
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO student VALUES (?, ?, ?, ?, ?)")) {
// 对同一个PreparedStatement反复设置参数并调用addBatch():
for (Student s : list) {
ps.setString(1, s.getSno() + 1);
ps.setString(2, s.getSname());
ps.setString(3, s.getSsex());
ps.setInt(4, s.getSage());
ps.setString(5, s.getSdept());
// 添加到batch
ps.addBatch();
}
// 执行batch:
int[] ns = ps.executeBatch();
for (int n : ns) {
// batch中每个SQL执行的结果数量
System.out.println(n + " inserted.");
}
}
}
}
}
Student类:
public class Student {
private String Sno;
private String Sname;
private String Ssex;
private String Sdept;
private int Sage;
public String getSno() {
return Sno;
}
public void setSno(String sno) {
Sno = sno;
}
public String getSname() {
return Sname;
}
public void setSname(String sname) {
Sname = sname;
}
public String getSsex() {
return Ssex;
}
public void setSsex(String ssex) {
Ssex = ssex;
}
public String getSdept() {
return Sdept;
}
public void setSdept(String sdept) {
Sdept = sdept;
}
public int getSage() {
return Sage;
}
public void setSage(int sage) {
Sage = sage;
}
@Override
public String toString() {
return String.format("{Student: id=%s, name=%s, Sex=%s, age=%d, dept=%s}", this.Sno, this.Sname, this.Ssex, this.Sage, this.Sdept);
}
}
配置文件:
Driver = com.mysql.cj.jdbc.Driver
JDBC_URL = jdbc:mysql://localhost:3306/learnjdbc?serverTimezone=GMT
JDBC_USER = root
JDBC_PASSWORD = 123456
数据库字段:
数据库连接封装类
public class DBUtil {
// 数据库连接地址
private static String JDBC_URL = null;
// 用户名
private static String JDBC_USER = null;
// 密码
private static String JDBC_PASSWORD = null;
// 驱动
private static String Driver = null;
// 构造方法
private DBUtil() {
}
// 静态代码块,只在类加载的时候执行一次。
static {
// 读取配置文件
InputStream in = Main.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
try {
properties.load(in);
} catch (IOException e) {
e.printStackTrace();
}
JDBC_URL = properties.getProperty("JDBC_URL");
JDBC_USER = properties.getProperty("JDBC_USER");
JDBC_PASSWORD = properties.getProperty("JDBC_PASSWORD");
Driver = properties.getProperty("Driver");
try {
Class.forName(Driver);
} catch (ClassNotFoundException e) {
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace();
}
}
/**
* 获取数据库连接对象
* @throws SQLException
* @return 连接对象
*/
public static Connection getconnection() throws SQLException {
return DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
}
/**
* 关闭资源
* @param connection 数据库连接对象
* @param statement 数据库操作对象
* @param resultSet 数据库查询结果集
*/
public static void close(Connection connection, Statement statement, ResultSet resultSet) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
JDBC连接池
有空了在写~~