增删改查需要的步骤:
- 关联数据库驱动包(不同的数据库使用的驱动包是不一样的)
- 注册驱动(通过反射进行驱动的注册)
- 连接数据库获取数据库连接对象(登录-选择数据库的过程)
- 执行SQL语句
- 处理结果集
- 关闭数据库连接对象
关键词:DriverManager(管理JDBC驱动)、Statement(用于SQL的编译及执行)/PreparedStatement(预编译)/CallableStatement(执行存储过程)、ResultSet(结果集)
Statement 接口
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。
execut方法
方法的返回类型是Boolean,表示有无ResultSet返回。
executeQuery 方法
方法返回的类型是ResultSet,返回执行了查询语句的结果集,通常用于执行查询语句。executeUpdate 方法
返回的类型是int,表示执行了sql语句后被影响到的行数,通常用于执行修改语句。
jdbc查询数据库代码演示:
public class JdbcTest {
//数据库驱动信息
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
//数据库连接参数,test2是数据库名称
private static final String URL = "jdbc:mysql://localhost:3306/test2?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
//数据库用户名
private static final String USER = "root";
//数据库登录密码
private static final String PASSWORD = "123456";
/**
* 查询功能
*/
public static void query() {
//声明几个变量,需要在以下各个代码块中使用
Connection conn = null;//Connection接口代表着与数据库的链接
Statement statement = null;//Statment接口,用于执行sql语句并返回其生成的结果对象
ResultSet rs = null;//ResultSet结果集,用于遍历
try {
//以下对象的创建有出现异常的可能,因此用trycatch捕捉异常
//加载MySQL驱动
Class.forName(DRIVER);
//登录数据库获取连接对象
conn = DriverManager.getConnection(URL, USER, PASSWORD);
//定义sql语句,选定数据库里的student表中的 s_id,s_name,s_birth,s_sex 字段
String sql = "select s_id,s_name,s_birth,s_sex from student where s_id = '01' ";
//创建一个Statement对象,执行SQL语句需要Statement对象
statement = conn.createStatement();
//executeQuery()用于执行SQL语句获取结果集
rs = statement.executeQuery(sql);
//遍历结果集(查询的过程中,可能会出现查询结果为空)
while( rs.next() ) {
//判断是否有下一个元素,每次循环都代表一行数据
//以下是ResultSet类里的方法,可以获取数据库表里的一行数据中的每个数据,调用的方法要与数据库中的字段类型匹配。
//方法参数写成数字形式时,必须与以上sql中字段顺序匹配
int s_id = rs.getInt(1);
String s_name = rs.getString("s_name");
Date s_birth = rs.getDate(3);
String s_sex = rs.getString("s_sex");
System.out.println(s_id+"--"+s_name+"--"+s_birth+"--"+s_sex);
}
} catch (SQLException e) {
e.printStackTrace();
}catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
//关闭数据库连接对象,注意关闭顺序
try {
//关闭连接对象的操作有出现异常的可能,因此用trycatch捕捉异常
//可能出现了异常导致对象未成功创建,也就不用关闭连接,因此加上if判断
if(rs != null) {
rs.close();
}
if(statement != null) {
statement.close();
}
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
测试查询功能:
public static void main(String[] args) {
JdbcTest.query();
}
/*程序运行结果
1--赵雷--1990-01-01--男
*/
增删改三个功能的操作有点相似
添加功能
public class JdbcTest {
//数据库驱动信息
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
//数据库连接参数
private static final String URL = "jdbc:mysql://localhost:3306/test2?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
//数据库用户名
private static final String USER = "root";
//数据库登录密码
private static final String PASSWORD = "123456";
/**
* 添加数据
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void insert() throws ClassNotFoundException, SQLException {
//加载驱动程序
Class.forName(DRIVER);
//连接数据库
Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);
//定义一个sql语句
String sql = "insert into student values(9,'张三','1991-01-01','男')";
//用于执行sql语句的对象
Statement statement = conn.createStatement();
//使用Statement接口里的executeUpdate()方法执行sql语句,返回值为执行了sql语句后被影响到的行数
int result = statement.executeUpdate(sql);
//打印输出被影响到的行数
System.out.println(result);
//关闭连接
if(statement != null) {
statement.close();
}
if(conn != null) {
conn.close();
}
}
}
测试添加功能:
public static void main(String[] args) throws ClassNotFoundException, SQLException {
JdbcTest.insert();
}
/*程序运行结果
1
*/
修改功能
/**
* 修改数据
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void update() throws ClassNotFoundException, SQLException {
//加载驱动程序
Class.forName(DRIVER);
//连接数据库
Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);
//定义一个sql语句
String sql = "update student set s_name='李四' where s_id=9";
//用于执行sql语句的对象
Statement statement = conn.createStatement();
//使用Statement接口里的executeUpdate()方法执行sql语句,返回值为执行了sql语句后被影响到的行数
int result = statement.executeUpdate(sql);
//打印输出被影响到的行数
System.out.println(result);
//关闭连接
if(statement != null) {
statement.close();
}
if(conn != null) {
conn.close();
}
}
测试修改功能:
public static void main(String[] args) throws ClassNotFoundException, SQLException {
JdbcTest.update();
}
/*程序运行结果
1
*/
删除功能
/**
* 删除数据
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void delete() throws ClassNotFoundException, SQLException {
//加载驱动程序
Class.forName(DRIVER);
//连接数据库
Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);
//定义一个sql语句
String sql = "delete from student where s_id=9";
//用于执行sql语句的对象
Statement statement = conn.createStatement();
//使用Statement接口里的executeUpdate()方法执行sql语句,返回值为执行了sql语句后被影响到的行数
int result = statement.executeUpdate(sql);
//打印输出被影响到的行数
System.out.println(result);
//关闭连接
if(statement != null) {
statement.close();
}
if(conn != null) {
conn.close();
}
}
测试删除功能:
public static void main(String[] args) throws ClassNotFoundException, SQLException {
JdbcTest.delete();
}
/*程序运行结果
1
*/
如果在执行修改动作时出现乱码,是因为开发工具的编码与数据库中的编码不一致导致的,数据库的编码大多数为UTF-8,所以在连接的地址上去设置编码即可,针对5.1及8.0的版本不同,设置编码的方式为:
8.0:jdbc:mysql://localhost:3306/test2?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
5.1:jdbc:mysql://localhost:3306/test2?characterEncoding=UTF-8
上面可以看出,增删改查中有重复的代码,尤其是增删改,可以把这些重复的地方封装起来,提高代码的简洁性和灵活性。
先分析相同点和不同点,以决定具体需要封装的功能
增删改查四个功能的相同点和不同点
相同点:
1、注册驱动
2、连接数据库
3、关闭数据库
不同点:
1、SQL语句不同
2、结果集不同
增删改的异同点
相同:
1、注册驱动
2、连接数据库
3、执行SQL方式
4、关闭数据库
不同点:
1、SQL语句不同
代码演示:
/**
* 一个数据库连接工具类
* @author Administrator
*/
public class DBUtil {
//数据库驱动信息
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
//数据库连接参数
private static final String URL = "jdbc:mysql://localhost:3306/test2?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
//数据库用户名
private static final String USER = "root";
//数据库登录密码
private static final String PASSWORD = "123456";
private static Connection conn = null;
//注册驱动,写在静态代码块里,随着类的加载而加载驱动
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
System.out.println("驱动注册失败");
e.printStackTrace();
}
}
/**
* 获取数据库连接对象的功能
* @return 返回值为该对象
* @throws SQLException
*/
public static Connection newInstance() throws SQLException {
//对象已经创建,说明数据库已经连接,不需要再创建连接对象
if(conn == null){
conn = DriverManager.getConnection(URL,USER,PASSWORD);
}
return conn;
}
/**
* 关闭连接的功能
* 参数为需要关闭的三个常用连接对象
* @param conn
* @param sta
* @param rs
*/
public static void close(Connection conn,Statement sta,ResultSet rs) {
try {
//先判断要关闭的对象是否存在,注意关闭顺序
if(rs != null) {
rs.close();
}
if(sta != null) {
sta.close();
}
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 增删改通用方法
* @param sql
* 要执行的SQL
* @return
* 0 代表操作失败 正数代表影响的行数
*/
public static int curdMethod(String sql) {
Statement statement = null;
try {
//连接数据库
newInstance();
//用于执行sql语句的对象
statement = conn.createStatement();
//执行sql语句
int result = statement.executeUpdate(sql);
return result;
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭连接
close(conn,statement,null);
}
//上面的操作失败则返回0
return 0;
}
}
测试:
public static void main(String[] args) {
int i = DBUtil.curdMethod("insert into student values(9,'王五','1992-02-02','男')");
System.out.println(i);
}
/*运行结果
1
*/