JDBC操作
了解 JDBC
- JDBC 即 Java数据库连接(Java Database Connectivity)
- 提供了诸如添加查询和更新数据库中数据的方法
JDBC 导包流程
Oracle 数据库导包流程
idea 导包方法
- 步骤 : 文件 → 项目结构 → 项目设置 → 模块 → 依赖 → 添加依赖(找到 .jar文件自动导入即可)

eclipse 导包方法
- 步骤 : 创建 lib 文件夹 → 将文件复制到文件夹中 → 构建路径 → 图标变化即完成

JDBC 基础操作
Oracle 数据库 JDBC操作
添加数据
在数据库中 SCOTT 用户下 创建一个名为 T_USER 的表,其中有id、name、sex、tel、addtime字段,下面开始对 T_USER 进行 添加操作
- 创建 实体类
- 编写 insert 方法
import com.icss.model.T_USER; //调用 T_USER表 结构类
import java.sql.Connection; //创建 连接变量 时需要的导包
import java.sql.DriverManager; //连接变量 赋值 时需要的导包
import java.sql.PreparedStatement;//创建 执行变量 时需要的导包
import java.sql.SQLException; //连接变量 连接失败 导包
public class T_USERDao {
public boolean insert(T_USER user){
//创建连接变量 --- 用于连接数据库
Connection conn = null;
//创建执行SQL变量 --- 用于执行SQL语句
PreparedStatement ps = null;
//创建 返回值变量
boolean result = false;
try {
//装载类
Class.forName("oracle.jdbc.driver.OracleDriver");
//给 连接变量 赋值,赋值内容为 jdbc:连接数据库:连接方式:@IP地址(localhost 或者 127.0.0.1):端口号(1521):数据库名,"用户名","密码" 。赋值后需要用try catch环绕
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","SCOTT","tiger");
//给 执行SQL变量 赋予 SQL语句,用 问号 作为占位符,用于录入变量内容
//对 所有数据 进行输入赋值
String sql = "insert into T_USER values(?,?,?,?,to_date(?,'yyyy-mm-dd'))";
// 对除了 时间 之外数据进行输入赋值 ,时间截取当前时间
//String sql = "insert into T_USER values(?,?,?,?,sysdate)";
/*使用序列进行添加:
String sql = "insert into T_USER values(seq_a.nextval,?,?,?,sysdate)";
ps = conn.prepareStatement(sql);
ps.setString(1,user.getName());
ps.setString(2,user.getSex());
ps.setString(3,user.getTel());
*/
ps = conn.prepareStatement(sql);
//给占位的 问号 赋值,这里字段是什么类型 就 set 该类型即可
ps.setInt(1,user.getId());
ps.setString(2,user.getName());
ps.setString(3,user.getSex());
ps.setString(4,user.getTel());
//当取用当前时间时,注释掉第五个赋值
ps.setString(5,user.getAddtime());
//判断语句是否执行(判断 受影响行数 是否大于 0 即可)
if(ps.executeUpdate() > 0){
//有 受影响行,返回值变量 赋值为 真
result = true;
}
} catch (ClassNotFoundException e) {
//了解 注册失败 原因
System.out.println("注册驱动失败,原因为: " + e.getMessage());
} catch (SQLException e) {
//了解 连接失败 原因
System.out.println("连接失败,原因为: " + e.getMessage());
}finally {
//判断 执行SQL变量是否为空,为空则不需要关闭,不为空需要关闭。关闭连接也需要用try catch环绕
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
System.out.println("关闭ps失败");
}
}
//同理判断 连接变量是否为空,为空则不需要关闭,不为空需要关闭。关闭连接也需要用try catch环绕
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
System.out.println("关闭连接失败");
}
}
}
//返回 插入结果(成功 / 失败)
return result;
}
}
- 创建 测试类
- 创建 对象
- 调用 insert 方法
import com.icss.dao.T_USERDao;
import com.icss.model.T_USER;
public class T_USERTest {
public static void main(String[] args) {
T_USERDao td = new T_USERDao();
// 方法一 直接输入时间
T_USER user = new T_USER(1,"张三","男","1234","2021-9-29");
// 方法二 使用当前时间(在 实体类 中赋值)
//T_USER user = new T_USER(1,"张三","男","1234",null);
// 方法三 使用序列添加
//T_USER user = new T_USER(0,"张三","男","1234","2021-9-29");
//添加
boolean insert = td.insert(user);
if(insert) {
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
}
}
运行结果为添加成功后,返回到数据库中,对表格刷新即可查看结果(添加了一行数据),可以将固定的值改为控制台输入,这样就可以实现操作数据库添加数据了
删除数据
在数据库中 SCOTT用户下 创建一个名为 T_USER 的表,其中必须有 int 类型 字段 id,下面开始对 T_USER 进行 以 id 删除数据操作
- 创建 实体类
- 编写 delete 方法
import java.sql.Connection; //创建 连接变量 时需要的导包
import java.sql.DriverManager; //连接变量 赋值 时需要的导包
import java.sql.PreparedStatement; //创建 执行变量 时需要的导包
import java.sql.SQLException; //连接变量 连接失败 导包
public class T_USERDao {
public boolean delete(int id) {
//创建连接变量 --- 用于连接数据库
Connection conn = null;
//创建执行SQL变量 --- 用于执行SQL语句
PreparedStatement ps = null;
//创建 返回值变量
boolean result = false;
try {
//装载类
Class.forName("oracle.jdbc.driver.OracleDriver");
//给 连接变量 赋值,赋值内容为 jdbc:连接数据库:连接方式:@IP地址(localhost 或者 127.0.0.1):端口号(1521):数据库名,"用户名","密码" 。赋值后需要用try catch环绕
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","SCOTT","tiger");
//给 执行SQL变量 赋予 SQL语句,用 问号 作为占位符,用于录入变量内容
ps = conn.prepareStatement("delete from T_USER where id = ?");
//给占位的 问号 赋值,这里字段是什么类型 就 set 该类型即可
ps.setInt(1,id);
//判断语句是否执行(判断 受影响行数 是否大于 0 即可)
if(ps.executeUpdate() > 0){
//有 受影响行,返回值变量 赋值为 真
result = true;
}
} catch (ClassNotFoundException e) {
//了解 注册失败 原因
System.out.println("注册驱动失败,原因为: " + e.getMessage());
} catch (SQLException e) {
//了解 连接失败 原因
System.out.println("连接失败,原因为: " + e.getMessage());
}finally {
//判断 执行SQL变量是否为空,为空则不需要关闭,不为空需要关闭。关闭连接也需要用try catch环绕
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
System.out.println("关闭ps失败");
}
}
//同理判断 连接变量是否为空,为空则不需要关闭,不为空需要关闭。关闭连接也需要用try catch环绕
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
System.out.println("关闭连接失败");
}
}
}
//返回 删除结果(成功 / 失败)
return result;
}
}
- 创建 测试类
- 创建 对象
- 调用 delete 方法
import com.icss.dao.T_USERDao;
public class T_USERTest {
public static void main(String[] args) {
//调用实体类
T_USERDao td = new T_USERDao();
//给 id 赋值 5
boolean delete = td.delete(5);
if(delete) {
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
}
运行结果为删除成功后,返回到数据库中,对表格刷新即可查看结果(删除了id 为 5 的那一行数据),可以将固定的值改为控制台输入,这样就可以实现操作数据库删除数据了
修改数据
在数据库中 SCOTT 用户下 创建一个名为 T_USER 的表,其中有id、name、sex、tel、addtime字段,下面开始对 T_USER 修改 id 等于2 的数据
- 创建 实体类
- 编写 update方法
import com.icss.model.T_USER; //调用 T_USER表 结构类
import java.sql.Connection; //创建 连接变量 时需要的导包
import java.sql.DriverManager; //连接变量 赋值 时需要的导包
import java.sql.PreparedStatement;//创建 执行变量 时需要的导包
import java.sql.SQLException; //连接变量 连接失败 导包
public class T_USERDao {
public boolean update(T_USER user){
//创建连接变量 --- 用于连接数据库
Connection conn = null;
//创建执行SQL变量 --- 用于执行SQL语句
PreparedStatement ps = null;
//创建 返回值变量
boolean result = false;
try {
//装载类
Class.forName("oracle.jdbc.driver.OracleDriver");
//给 连接变量 赋值,赋值内容为 jdbc:连接数据库:连接方式:@IP地址(localhost 或者 127.0.0.1):端口号(1521):数据库名,"用户名","密码" 。赋值后需要用try catch环绕
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","SCOTT","tiger");
//给 执行SQL变量 赋予 SQL语句,用 问号 作为占位符,用于录入变量内容
//对 对应 id值 的 数据行 进行修改
String sql = "update T_USER set name = ?, sex = ?, tel = ?, addtime = to_date(?,'yyyy-mm-dd') where id = ?";
ps = conn.prepareStatement(sql);
//占位符 赋值
ps.setString(1,user.getName());
ps.setString(2,user.getSex());
ps.setString(3,user.getTel());
ps.setString(4,user.getAddtime());
ps.setInt(5,user.getId());
//判断语句是否执行(判断 受影响行数 是否大于 0 即可)
if(ps.executeUpdate() > 0){
//有 受影响行,返回值变量 赋值为 真
result = true;
}
} catch (ClassNotFoundException e) {
//了解 注册失败 原因
System.out.println("注册驱动失败,原因为: " + e.getMessage());
} catch (SQLException e) {
//了解 连接失败 原因
System.out.println("连接失败,原因为: " + e.getMessage());
}finally {
//判断 执行SQL变量是否为空,为空则不需要关闭,不为空需要关闭。关闭连接也需要用try catch环绕
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
System.out.println("关闭ps失败");
}
}
//同理判断 连接变量是否为空,为空则不需要关闭,不为空需要关闭。关闭连接也需要用try catch环绕
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
System.out.println("关闭连接失败");
}
}
}
//返回 插入结果(成功 / 失败)
return result;
}
}
- 创建 测试类
- 创建 对象
- 调用 update 方法
import com.icss.dao.T_USERDao;
import com.icss.model.T_USER;
public class T_USERTest {
public static void main(String[] args) {
T_USER user;
T_USERDao td = new T_USERDao();
user = new T_USER(2,"王五","女","42234","2000-1-1");
boolean update = td.update(user);
//修改
if(update) {
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
}
}
运行结果为修改成功后,返回到数据库中,对表格刷新即可查看结果(修改了id为2的那一行数据),可以将固定的值改为控制台输入,这样就可以实现操作数据库修改数据了
简化JDBC
简化并规范JDBC,对目录进行分层
- util --- 管理链接
- dao --- 持久层(数据访问层)
- model --- 实体类
- service --- 业务层
- imp --- 业务层下的实现类
- controller --- 控制层
util层内容
存储固定常量内容
package com.icss.util;
public interface DButil {
public String DRIVER = "oracle.jdbc.driver.OracleDriver";
public String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
public String USERNAME = "SCOTT";
public String PASSWD = "tiger";
}
dao层内容
增删改操作类
增删改操作的简化内容
package com.icss.dao;
import com.icss.util.DButil;
import java.sql.*;
public class BaseDao {
//连接操作
public static Connection getConn() {
Connection conn = null;
try {
Class.forName(DButil.DRIVER);
conn = DriverManager.getConnection(DButil.URL, DButil.USERNAME,DButil.PASSWD);
} catch (ClassNotFoundException e) {
System.out.println("注册驱动失败,原因为: " + e.getMessage());
} catch (SQLException e) {
System.out.println("连接数据库失败,原因为: " + e.getMessage());
}
return conn;
}
//关闭操作
public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
System.out.println("关闭结果集失败");
}
}
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
System.out.println("关闭ps失败");
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
System.out.println("关闭连接失败");
}
}
}
//增删改
public static boolean modify(String sql,Object...obj) {
Connection conn = getConn();
PreparedStatement ps = null;
int result = 0;
try {
ps = conn.prepareStatement(sql);
for(int i = 0; i < obj.length; i++){
ps.setObject(i+1,obj[i]);
}
result = ps.executeUpdate();
} catch (SQLException e) {
System.out.println("SQL异常" + e.getMessage());
}finally {
close(conn,ps,null);
}
return result > 0 ? true : false;
}
}
查询操作类
查询全部内容、查询单条内容操作
package com.icss.dao;
import com.icss.model.T_USER;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class T_USERSelectDao extends BaseDao{
public static List<T_USER> find(String sql,Object...obj){
Connection conn = BaseDao.getConn();
PreparedStatement ps = null;
List<T_USER> list = new ArrayList<T_USER>();
//结果集类型 存储查找出来的结果
ResultSet res = null;
try {
ps = conn.prepareStatement(sql);
for(int i = 0; i < obj.length; i++){
ps.setObject(i+1,obj[i]);
}
res = ps.executeQuery();
while(res.next()){
T_USER user = new T_USER();
//与字段在数据库中顺序对应
user.setId(res.getInt(1));
user.setName(res.getString(2));
user.setSex(res.getString(3));
user.setTel(res.getString(4));
user.setAddtime(res.getString(5));
list.add(user);
}
} catch (SQLException e) {
System.out.println("sql异常: " + e.getMessage());
}finally {
BaseDao.close(conn,ps,res);
}
return list;
}
}
model层内容
与T_USER表相对应的实体类
package com.icss.model;
public class T_USER {
private int id;
private String name;
private String sex;
private String tel;
private String addtime;
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddtime() {
return addtime;
}
public void setAddtime(String addtime) {
this.addtime = addtime;
}
public T_USER() {
id = 0;
name = null;
sex = null;
tel = null;
addtime = null;
}
public T_USER(int id, String name, String sex, String tel, String addtime) {
this.id = id;
this.name = name;
this.sex = sex;
this.tel = tel;
this.addtime = addtime;
}
@Override
public String toString() {
return "T_USER{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", tel='" + tel + '\'' +
", addtime='" + addtime + '\'' +
'}';
}
}
service层内容
对表操作接口
package com.icss.service;
import com.icss.model.T_USER;
import java.util.List;
public interface T_USERService {
//业务层
//增加
public boolean insert(T_USER user);
//删除
public boolean delete(int id);
//修改
public boolean update(T_USER user);
//全查询
public List<T_USER> selectAll();
//以id查询
public T_USER findById(int id);
//根据姓名模糊查询
public List<T_USER> selectByName(String name);
}
对表操作接口实现类
package com.icss.service.imp;
import com.icss.dao.BaseDao;
import com.icss.dao.T_USERSelectDao;
import com.icss.model.T_USER;
import com.icss.service.T_USERService;
import java.util.List;
public class T_USERServiceImp implements T_USERService {
//添加
@Override
public boolean insert(T_USER user) {
String sql = "insert into T_USER values(seq_a.nextval,?,?,?,to_date(?,'yyyy-mm-dd'))";
return BaseDao.modify(sql,user.getName(),user.getSex(),user.getTel(),user.getAddtime());
}
//删除
@Override
public boolean delete(int id) {
String sql = "delete from T_USER where id = ?";
return BaseDao.modify(sql,id);
}
//修改
@Override
public boolean update(T_USER user) {
String sql = "update T_USER set name = ?, sex = ?, tel = ?, addtime = to_date(?,'yyyy-mm-dd') where id = ?";
return BaseDao.modify(sql,user.getName(),user.getSex(),user.getTel(),user.getAddtime(),user.getId());
}
//查询全部
@Override
public List<T_USER> selectAll() {
String sql = "SELECT * from T_USER";
if(T_USERSelectDao.find(sql).size() == 0){
return null;
}else {
return T_USERSelectDao.find(sql);
}
}
//以 id 查询单条内容
@Override
public T_USER findById(int id) {
String sql = "SELECT * from T_USER where id = ?";
if(T_USERSelectDao.find(sql,id).size() == 0){
return null;
}else {
return T_USERSelectDao.find(sql,id).get(0);
}
}
@Override
public List<T_USER> selectByName(String name) {
//方法一
String sql = "Select * from T_USER where name like '%" + name + "%'";
/*
方法二
String sql = "Select * from T_USER where name like ?";
return T_USER_SelectDao.find(sql,name);
// %%在主方法中传参,oracle中不建议使用
方法三
String sql = "Select * from T_USER where name like ?";
return T_USER_SelectDao.find(sql,"%" + name + "%");
*/
if (T_USER_SelectDao.find(sql).size() == 0){
return null;
}else{
return T_USER_SelectDao.find(sql);
}
}
}