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);
        }
    }
}
posted @ 2021-10-15 11:05  YoursEntice  阅读(61)  评论(0)    收藏  举报
TOP 底部