快速入门
学校mysql的实验要求建立一个数据库并实现一些操作,本来就有想法学习javaweb写个小项目的,那就直接开始学JDBC!
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
// 按两次 Shift 打开“随处搜索”对话框并输入 `show whitespaces`,
// 然后按 Enter 键。现在,您可以在代码中看到空格字符。
public class Main {
public static void main(String[] args) throws Exception {
//连接参数
String url = "jdbc:mysql://127.0.0.1:3306/s_t_u202211896";
String username = "root";
String password = "2398574";
//注册驱动,mysql5以后不需要了
//Class.forName("com.mysql.jdbc.Driver");
//获取连接
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql语句
String sql = "update sc set grade = 81 where sno = '200215121'";
//获取sql对象
Statement stmt = conn.createStatement();
//执行sql语句
int count = stmt.executeUpdate(sql);
//显示结果
System.out.println(count);
//关闭连接
stmt.close();
conn.close();
}
}
API详解
上面是一个小例子,算是jdbc的快速入门,接下来着重学习一下几个接口和类。
DriverManager类
作用:
1.注册驱动
2.获取数据库连接
实现方法:
官方文档的介绍很抽象,直接来看两个重要方法
1.registerDriver
-
-
static void
registerDriver(Driver driver)
使用
DriverManager
注册给定的驱动程序。
-
代码实现一般是通过反射来注册驱动的,例如
Class.forName("com.mysql.jdbc.Driver");
Driver类的代码实现如下:
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
可以看到Driver类中有一个静态代码块,调用了 registerDriver方法,回顾一下java知识点,在第一次加载类的时候如果类中有静态代码块,则会执行代码块中的代码。而通过反射我们就是将这个类加载到了内存中,于是执行了其中的registerDriver方法。
因此最后仍然是通过registerDriver方法去注册驱动的。
2.getConnection
-
-
static Connection
getConnection(String url, String user, String password)
尝试建立与给定数据库URL的连接。
-
通过该方法可以获取连接,语法如下:
jdbc:mysql://ip:端口号/数据库名称?参数1&参数2&参数3&.....&参数n
实例:
jdbc:mysql://127.0.0.1:3306/s_t_u202211896
小细节:
1.如果连接的是本地的数据库,且数据库端口默认是3306,则可以简写成:
jdbc:mysql:///数据库名称?参数1&参数2&参数3&.....&参数n
2.ssl服务
在mysql版本较高时会有warning让你使用ssl安全连接的方式,但是配置较麻烦且会降低性能,因此我们可以通过useSSL=false:禁用SSL服务 让它不报错。
例如:jdbc:mysql://127.0.0.1:3306/s_t_u202211896?useSSL=flase
Connection
作用:
1.获取执行sql的对象
方法:
1.Statement CreateStatement()
获取普通的sql对象
2.PretendStatement PrepareStatement(sql)
获取预编译的sql对象(用于防止sql注入,老本行了哈哈哈)
3.CallableStatement prepareCall(sql)
执行存储过程的对象
2.事务管理
mysql中事务是指一个或多个数据库操作(dml语句),要么全部成功,要么全部回滚 (回复到事务开启前的状态)。
可以通过上面三个函数加上tyr catch来处理事务
try {
//开启事务
conn.setAutoCommit(false);
//执行sql语句
int count1 = stmt.executeUpdate(sql1);
int count2 = stmt.executeUpdate(sql2);
//显示结果
System.out.println(count1);
System.out.println(count2);
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
throw new RuntimeException(e);
}
Statement
其中DML指对表、库中数据进行操作,DDL对表、库这个整体进行操作,包括增删改
DQL指查询操作
1.executeUpdate(sql)
执行增删改操作,主要需要注意的是返回值,返回的是受影响的行数,一般可以通过返回值是否为0来判断修改是否成功,但需要注意的是用drop删除成功的时候返回的也是0
2.executeQuery
这一部分结合ResultSet api来一起讲
ResultSet
基本使用:
结果集就相当于这张表,我们通过游标(初始指向列名那一行)来一行行获得数据(通过next()方法)
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
rs.getInt(id);
}
具体例子
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
// 按两次 Shift 打开“随处搜索”对话框并输入 `show whitespaces`,
// 然后按 Enter 键。现在,您可以在代码中看到空格字符。
public class ResultSet {
public static void main(String[] args) throws Exception {
//连接参数
String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
String username = "root";
String password = "2398574";
//注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//获取连接
Connection conn = DriverManager.getConnection(url, username, password);
//定义sql语句
String sql = "select * from student";
//获取sql对象
Statement stmt = conn.createStatement();
//执行sql语句
java.sql.ResultSet rs = stmt.executeQuery(sql);
//显示结果
while(rs.next()){
String sno = rs.getString("sno");
String name = rs.getString("sname");
String sex = rs.getString("ssex");
int grade = rs.getInt("grade");
System.out.println(sno);
System.out.println(name);
System.out.println(sex);
System.out.println(grade);
}
//释放资源
rs.close();
//关闭连接
stmt.close();
conn.close();
}
}
学习案例
将ResultSet封装(也就是将一张表封装成一个对象,在将所有对象封装进Arraylist)
1.构建实体类
public class student {
private String sno;
private String sname;
private String ssex;
private int grade;
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
2.封装成对象
List<student> list = new ArrayList<>();
//显示结果
while(rs.next()){
student student = new student();
String sno = rs.getString("sno");
String name = rs.getString("sname");
String sex = rs.getString("ssex");
int grade = rs.getInt("grade");
student.setSno(sno);
student.setGrade(grade);
student.setSname(name);
student.setSsex(sex);
list.add(student);
}
System.out.println(list);
PrepareStatement
就是将参数先?作为占位符,然后在给这些参数赋值,就可以防止sql注入(对sql注入感兴趣的可以去看看我的博客嘿嘿)。
其他没啥区别,按上面的图写就行了,不多讲了,码代码去了。
数据连接池
package com.mono.druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
public class DruidDemo {
public static void main(String[] args) throws Exception{
//导入jar包
//导入配置文件
//加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("student/src/druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
注意代码需要导入druid的jar包