要点1:理解JDBC是一个接口,一个规范,相当于JAVA程序和数据库之间的一道桥梁。
要点2:学会创建JDBC工具类
JDBC工具类的创建分为六步:
1.注册驱动
2.获取链接
3.获取数据库操作对象
4.执行sql语句
5.处理查询结果
6.释放资源
要点3:具体实现
第一步:注册驱动
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
这里需要说的是当mysql版本为5.0的时候是没有cj的。
说明:
1.参数中new的实例为下载的驱动。
2.数据库驱动:是jdbc这个接口与mysql连接的重要渠道,没有驱动不能连接数据库。
3.数据库驱动下载完毕之后需要导入。
例如:创建动态网页项目之后需要导入 WebContent 下的 WEB-INF 下的 lib 文件夹下。
4.代码需要被try catch包围。
这个是最直观,最能体现过程的注册驱动的方式。
而通过源码,我们发现Driver类中存在一个静态代码块,包含我们所需要引用的这个方法。所以我们一般会使用类加载方法来注册驱动,即
Class.forName(com.mysql.cj.jdbc.Driver);
第二步:获取连接
配置文件:也可直接在类中定义
url = jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
user = 数据库用户名
password = 数据库密码
连接方法
Connection conn = DriverManager.getConnection(url, user,password);
第三步:获取执行sql语句的对象
最初使用时
Statement stmt = conn.createStatement();
然而会出现特殊情况:即插入语句中可能会出现sql语句,比如 or、and等。
为了杜绝这种情况的出现,通常会使用预编译,我们在后面在详细说。
第四步:执行sql语句
在这之前我们需要先准备好我们需要执行的sql语句,即:
String sql = "select * from users";
//查询语句的执行
ResultSet rs = ps.executeQuery(sql);
String sql = "insert into users(userName,password,sex,email)values(?,?,?,?)";
//增删改语句的执行
executeUpdate(sql);
这里多出的概念为
ResultSet:结果集,来存放经过查询后的结果的集合。而这里需要注意,只有在查询过程中,才会用到它。
第五步:处理查询结果
这里需要引入两个方法:
//指向集合的光标下移
rs.next();
//得到光标指向处的数据,i为第几列,i也可表示列名。
rs.getString(i)
注:列名并不是数据库中表的列名,而是查询结果集中表的列名
第六步:释放资源
因为在第二步中JVM的进程和数据库自建的通道打开了,所以我们在使用完资源之后一定要关闭。
即
try {
if(rs != null)
rs.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
try {
if(ps != null)
ps.close();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
try {
if(conn != null)
conn.close();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
至此在JDBC中我们要进行的操作就结束了。但是需要注意的是,我们一般并不会在JDBC工具类中直接执行sql语句,而是在DAO类中执行。因此,预编译阶段也并不是在JDBC工具类中执行的,而是在DAO类中。之后会更新对于DAO类的理解。
这里附上自己的JDBCUtil的代码:
import java.sql.*;
import java.io.*;
import java.util.Properties;
public class JDBCUtil {
private static String driver;
private static String url;
private static String user;
private static String password;
static {
//初始化连接信息
//加载配置文件
//使用类加载器 查找jdbc配置文件 ,且转化为输入流对象
InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties prop = new Properties();
try {
//加载系统文件 转化为 配置对象
prop.load(in);
} catch (IOException e) {
e.printStackTrace();
System.out.println("系统文件无法加载");
}
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
//注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("未加载成功");
}
}
//获取连接
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user,password);
} catch (SQLException e) {
e.printStackTrace();
System.err.println("连接获取失败");
}
return conn;
}
//释放资源
public static void close(Connection conn,Statement ps,ResultSet rs) {
//释放资源,从小到大。
try {
if(rs != null)
rs.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
try {
if(ps != null)
ps.close();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
try {
if(conn != null)
conn.close();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}