JDBC连接数据库操作

Mysql jdbc 连接数据库

  • statement方式
  • 1.注册驱动
    2.建立连接
    3.获取执行者平台
    4.准备sql语句
    5.执行sql语句,返回结果集
    6.处理结果集
    7.释放资源
@Test
    public void run(){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
            String user = "root";
            String password = "root";
            Connection conn = DriverManager.getConnection(url, user, password);
            Statement stmt = conn.createStatement();
            String sql = "select * from student;";
            ResultSet rs = stmt.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString("name")+" -- "+rs.getString("age"));
            }
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Oracle

@Test
    public void run(){
        try {
            Class.forName("oracle.jdbc.OracleDriver");
            String url = "jdbc:oracle:thin:@localhost:1521:orcl";
            String user = "scott";
            String password = "1234";
            Connection conn = DriverManager.getConnection(url, user, password);
            Statement stmt = conn.createStatement();
            String sql = "select * from emp";
            ResultSet rs = stmt.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString("ename")+" -- "+rs.getInt("deptno"));
            }
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • prepareStatements方式
  • 1.注册驱动
    2.建立连接
    3.准备sql语句
    4.获取预处理执行者平台
    5.将需要操作的信息设置到ptmt
    6.执行sql语句
    *7.释放资源
@Test
    public void run1(){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
            String user = "root";
            String password = "root";
            Connection conn = DriverManager.getConnection(url, user, password);
            String sql = "select * from student where id = ?;";
            PreparedStatement ptmt = conn.prepareStatement(sql);
            ptmt.setString(1, "4");
            ResultSet rs = ptmt.executeQuery();
            /*int i = ptmt.executeUpdate();
            if(i == 1){
                System.out.println("查询成功");
                System.out.println(rs.getString("name")+"--"+rs.getShort("age"));
            }else{
                System.out.println("查询失败");
            }*/
            while(rs.next()){
                System.out.println(rs.getString("name")+"--"+rs.getShort("age"));
            }
            rs.close();
            ptmt.close();
            conn.close();
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

Oracle

@Test
    public void run1() throws Exception{
        Class.forName("oracle.jdbc.OracleDriver");
        String url = "jdbc:oracle:thin:@localhost:1521:orcl";
        String user = "scott";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, user, password);
        String sql = "select * from emp";
        PreparedStatement ptmt = conn.prepareStatement(sql);
        ResultSet rs = ptmt.executeQuery();
        while(rs.next()){
            System.out.println(rs.getInt("empno")+"+"+rs.getString("ename")+"+"+rs.getString("job"));
        }
        rs.close();
        ptmt.close();
        conn.close();
    }

QueryRunner操作对象
插入数据

public void insert() throws SQLException {

        // 1. 获取 Connection 连接对象
        // Connection conn = DataBaseUtils.getDataBaseConnection();

        // 2. 创建 QueryRunner 操作对象
        // 在调用 QueryRunner() 方法的时候,需要传入一个 dataSource 数据源
        // dataSource 数据源 到底是一个什么东西?
        // 简单理解,就是需要操作的数据库中的数据 DataSource
        // 在 DataBaseUtils 工具类中,通过 getDataBaseConnection() 已经将数据库资源获取了
        QueryRunner qr = new QueryRunner();

        // 3. 准备 SQL
        String sql = "insert into tb_student(username, password) values (?, ?)";

        // 4. 给占位符进行赋值
        Object[] params = { "hello", 123 };

        // 5. 执行操作
        int i = qr.execute(conn, sql, params);

        // 也可以使用 update() 方法进行操作,update() 方法可以同时操作 insert、update、delete
        // int i = qr.update(conn, sql, params);

        System.out.println(i);

        // 5. 释放资源
        DbUtils.close(conn);
    }

更新数据

public void update() throws SQLException {

        QueryRunner qr = new QueryRunner();

        String sql = "update tb_student set username = ?, password = ? where id = ?";

        Object[] params = { "温老板", 250, 3};

        int i = qr.execute(conn, sql, params);

        System.out.println(i);

        // 5. 释放资源
        DbUtils.close(conn);
    }

删除数据

public void delete() throws SQLException {

        QueryRunner qr = new QueryRunner();

        String sql = "delete from tb_student where id = ?";

        int i = qr.execute(conn, sql, 5);

        DbUtils.close(conn);
    }

DateBaseUtils工具类

public class DataBaseUtils {
    
    public DataBaseUtils(){
        super();
    }
    
    private static Connection conn;
    
    // 如果将注册和获取连接对象放到一个方法中的话,其实不好,因为想要用到它们的时候必须要先调用方法才行。
    // 而每次调用方法,都要重新注册一次,获取一次新的连接对象,对性能消耗太大
    // 疑问:能不能只要去注册一次,只要有一个连接对象就可以?
    static {
        
        try {

            // 1. 注册驱动(老司机)
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 获取连接对象
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true ",
                    "root", "root");
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    // 1. 获取数据库连接
    public static Connection getDataBaseConnection(){
        return conn;
    }
    
    // 2. 关闭资源
    public static void closeResource(Connection conn , Statement stmt, ResultSet rs){
        
        // 注意,在关闭之前,要判断所操作的资源不能是 null,否则报 NullPointerException 异常
        if(rs != null){         
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if(stmt != null){           
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if(conn != null){           
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void closeResource(Connection conn , Statement stmt){

        if(stmt != null){           
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if(conn != null){           
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void closeResource(Connection conn){
    
        if(conn != null){           
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

commons.dbutils.QueryRunner query方法中RequestSetHandler 参数对应的返回类型:

AbstractListHandler -- 返回多行List的抽象类

ArrayHandler -- 返回一行的Object[]

ArrayListHandler -- 返回List,每行是Object[]

BeanHandler -- 返回第一个Bean对象

BeanListHandler -- 返回List,每行是Bean

ColumnListHandler -- 返回一列的List

KeyedHandler -- 返回Map,具体见代码

MapHandler -- 返回单个Map

MapListHandler -- 返回List,每行是Map

ScalarHandler -- 返回列的头一个值

apache.commons.dbutils.QueryRunner.query方法的handler参数
第一次用apache.commons.dbutils.QueryRunner访问数据库的人会有一个疑问..

String url = "jdbc:mysql://localhost:3306/test";
Connection con = DriverManager.getConnection(url, "root", "pwd");
String sql = "select * from myTable";
QueryRunner qr = new QueryRunner();
qr.query(con, sql, handler); //con是数据库连接, sql是查询语句, handler是什么?

QueryRunner.query方法的返回值是一个Object对象,该Object对象保存着从数据库获取的数据,

它的类型(可显式转换的类型)是由调用query方法时的handler参数决定的.

ResultSetHandler handler = new ArrayHandler();
Object obj = qr.query(con, sql, handler);
Object[] arr = (Object[])obj;

ResultSetHandler handler = new ArrayListHandler();
Object obj = qr.query(con, sql, handler);
List list = (List)obj;

也就是说,保存数据的Object对象的显式转换类型是由handler参数决定的.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容