JDBC的基本使用
目录
一、JDBC入门
JDBC(Java DataBase Connectivity,java 数据库连接)是一种用于执行 SQL 语句的 Java API,可以为多种关系数据库提供统一访问,它由一组用 java 语言编写的类和接口组成。JDBC 提供了一个种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
二、JDBC 的开发步骤
- 注册驱动:连接 MySQL5 使用 com.mysql.jdbc.Driver,连接 MySQL6 及以上使用 com.mysql.cj.jdbc.Driver,且需要指定时区 serverTimezone
- 获取数据库连接:使用 JDBC 中的类,获得数据库的连接对象 Connection
- 创建statement :通过 Connection 可以获取执行者对象,Statement、PreparedStatement.
- 执行查询,得到结果:使用执行者对象,向数据库中执行 SQL 语句,然后可以得到对应的接口,有单个结果,也可能有结果集 ResultSet。
- 处理结果
- 关闭资源
三、JDBC的简单使用
public static void JDBC() throws Exception {
// 1.注册驱动
// mysql驱动包名
String DRIVER = "com.mysql.cj.jdbc.Driver";
Class.forName(DRIVER);
// 2.获取数据库连接
// 数据库连接地址
String URL = "jdbc:mysql://localhost:3306/demo? serverTimezone=GMT &useUnicode=true& characterEncoding=utf8";
// 用户名
String USER = "root";
// 密码
String PASSWORD = "root";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 3.创建statement
Statement st = conn.createStatement();
// 4.执行查询,得到结果
String sql = "select * from table";
ResultSet rs = st.executeQuery(sql);
// 5.处理结果
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + "--" + name);
}
// 6.关闭资源
rs.close();
st.close();
conn.close();
}
四、Properties 配置文件
在实际开发中,我们一般情况下,会声明一个配置文件 xxx.properties,用来保存配置相关的信息。当我们要用的时候,直接从配置文件中获取使用。
# mysql驱动包名
driver=com.mysql.cj.jdbc.Driver
# 数据库连接地址,demo为数据库名
url=jdbc:mysql://localhost:3306/demo? serverTimezone=GMT &useUnicode=true& characterEncoding=utf8
# 用户名
user=root
# 密码
password=root
五、JDBC工具类
在实际开发中,我们经常会碰到一些重复的代码,比如在获取某些资源的时候,解析某些数据的时候,都是需要重复去做一些相似的动作,这个时候很有必要抽取这些重复的代码成一个工具类,方面后面的使用。
public class JDBCUtil {
private static String driver = null;
private static String url = null;
private static String user = null;
private static String password = null;
static {
try {
//创建一个属性配置对象
Properties pro = new Properties();
InputStream is = new FileInputStream("resources/jdbc.properties");
// 导入输入流
pro.load(is);
// 读取属性
driver = pro.getProperty("driver");
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接对象
*/
public static Connection getConn() {
Connection conn = null;
try {
// 注册驱动
Class.forName(driver);
// 获取数据库连接
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 释放资源
*/
public static void release(Connection conn, Statement st, ResultSet rs) {
closeRs(rs);
closeSt(st);
closeConn(conn);
}
public static void release(Connection conn, Statement st) {
closeSt(st);
closeConn(conn);
}
private static void closeRs(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private static void closeSt(Statement st) {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private static void closeConn(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
通过构建 JDBC 工具类,改写上面的类
public static void test() throws SQLException {
// 1.获取数据库连接
Connection conn = JDBCUtil.getConn();
// 2.创建statement
Statement st = conn.createStatement();
// 3.执行查询,得到结果
String sql = "select * from table";
ResultSet rs = st.executeQuery(sql);
// 4.处理结果
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + "--" + name);
}
// 5.关闭资源
JDBCUtil.release(conn, st, rs);
}
六、封装数据
如果要封装数据的话,则需要新建一个对应的 JavaBean 类。
如果要提供一个 JavaBean 的话,需要实现序列化接口、提供字段以及字段对应的 get 和 set 方法。
// JavaBean 的命名,最好和对应的数据表一致,Table对应数据库中的table表
public class Table {
// 表中每个字段在实体中为一个属性
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
七、JDBC DAO模式
DAO(Data Access Object,数据存取对象)是一个操作数据库的设计模式,大概的思路就是将对一个数据库(和一个数据表)的操作封装到一个类中,由其他的类来调用这个类的方法完成对数据库的操作,这样可以简化负责业务处理的类的复杂性和耦合性。
1. 新建一个DAO接口, 里面声明数据库访问规则,定义操作数据库的方法 :
public interface TableDao {
public boolean findAll();//根据id删除用户
// 其他方法
}
2. 新建一个DAO的实现类,具体实现早前定义的规则
public class TableDaoImpl implements UserDao {
@Override
public boolean findAll() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//1. 获取连接对象
conn = JDBCUtil.getConn();
//2. 创建statement对象
st = conn.createStatement();
// 3.执行查询,得到结果
String sql = "select * from table";
rs = st.executeQuery(sql);
// 4.处理结果
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + "--" + name);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.release(conn, st, rs);
}
}
}
3. 直接使用实现
public void test() {
TableDao dao = new TableDaoImpl();
dao.findAll();
}
八、JDBC PrepareStatement
Statement 的执行 ,其实是拼接sql语句的。 先拼接sql语句,然后在一起执行。
使用 PreparedStatement 对象,可以预防SQL 注入和提高 SQL 的预编译。PrepareStatement 相比较 statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。
public void test() throws Exception {
// 1.获取数据库连接
Connection conn = JDBCUtils.getConn();
// 2. 准备 SQL 语句
String sql = "update table set name = ? where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "张三");
ps.setString(2, "2");
// 3. 执行 SQL 语句
// 此处的返回值是 int 类型,如果有一条数据发生改变的话,则返回 1
int i = ps.executeUpdate();
// 4. 处理结果
if (i == 1) {
System.out.println("修改成功了");
}
// 6. 关闭资源
JDBCUtil.release(conn, ps);
}