IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JDBC自学总结梳理 -> 正文阅读

[Java知识库]JDBC自学总结梳理

? ????????寒假几天,在b站看了韩顺平老师的教学视频,收获很多。这里记录一下这几天学习JDBC的内容以便于日后复习。

????????首先是获取连接,获取连接有几种方式。第一种如下:创建出driver对象(com.jdbc.mysql.Driver包中),使用driver的connect方法获取连接。

//使用创建driver对象方式获取连接
    @Test
    public void connection01() throws SQLException {
        Driver driver = new Driver();
        String url = "jdbc:mysql://localhost:3306/lrz_db03";
        Properties properties = new Properties();
        properties.setProperty("user", "root");
        properties.setProperty("password", "1230");
        Connection connect = driver.connect(url, properties);
        System.out.println("获取链接为" + connect);
    }

? ? ? ? 第二种方式是使用driverManager的getConnection方法获取

//使用driverManager获取连接
    @Test
    public void connection02() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");//进行类加载
        String url = "jdbc:mysql://localhost:3306/lrz_db03";
        String user = "root";
        String password = "1230";
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);
    }

? ? ? ? 第三种方式也是比前两种方式更灵活的是使用配置文件进行URL和用户名和密码的编写

 @Test
    public void connection03() throws IOException, SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\connection.properties"));
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);
    }

? ? ? ? 但最后的方式是使用数据库连接池的方式进行连接,这种方式大大减少性能消耗。这里使用德鲁伊(Druid)连接池进行连接,首先需要导入相应的jar包,使用配置文件进行连接的具体信息的编写,如密码、用户名、URL、最大连接数,最小连接数等。通过Properties的到配置文件后,通过以下代码即可获取连接

//通过德鲁伊来获取连接
Properties properties = new Properties();
properties.load(new FileInputStream("src\\druid.properties"));
//获取连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//通过连接池获取连接
Connection connection = dataSource.getConnection();

? ? ? ? 获取连接后,就是对对数据库进行增删改查等操作。比如使用PrepareStatement进行查询,这里注意使用Statement会有SQL注入问题(有意思)

//执行语句 查询dog表
        PreparedStatement preparedStatement = connection.prepareStatement("select * from dog");
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            System.out.println(resultSet.getString(1) + resultSet.getString(2));
        }

? ? ? ? 这里使用executeQuery方法,返回resultset结果集对象,这个对象只能查询不能够进行数据的来回滚动读取。后续会改进。该对象的next方法,返回TRUE和FALSE,表示是否有下一个查询行,也有previous方法获取上一行数据。

? ? ? ? 由于获取连接课关闭连接比较常用,所以可以封装成一个类及方法,以后可以直接调用该类的get_Connection和close_Connection来获取连接和关闭连接。

public class Utils {
    static DataSource dataSource;
    static {
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("src\\druid.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection get_Connection() throws SQLException {
        //得到连接池
        return dataSource.getConnection();
    }
   
    public static void close_Connection(Connection con, Statement sta, ResultSet res){
        try {
            if(con != null){
                con.close();
            }
            if(sta != null){
                sta.close();
            }
            if(res != null){
                res.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

? ? ? ? 说到使用resultSet的问题,这里获得结果集后无法进行反复调用以及关闭不方便,所以使用Apache提供的DBUtils来将获取的结果进行进一层封装,变成对象。例如数据库中有actor表,有以下的属性。

? ? ? ? ?这里就可以创建一个actor对象,属性和上面一一对应。并加上set和get方法,无参有参构造器都写上。导入Apache的dbutils的jar包。创建queryRunner对象qr,使用qr对象来进行增删改查操作。 比如下面的query查询方法,这时返回的就是一个list集合,在query方法的第三个参数中,创建了一个BeanListHandler对象,qr对象在底层会自动将获取到的resultSet结果集进行进一步的对象封装并添加到一个list集合中,将该集合返回。关闭连接只需关闭连接即可,qr对象会将statement和resultset的连接关闭。

 @Test
    public  void test() throws SQLException {
        //先得到连接
        Connection connection = Utils.get_Connection();
        QueryRunner queryRunner = new QueryRunner();
        String sql = "select * from actor";
        List<actor> query = queryRunner.query(connection, sql, new BeanListHandler<>(actor.class));
        System.out.println(query);
        Utils.close_Connection(connection, null, null);
    }

? ? ? ?查询单行和单行单列大同小异。执行dml操作则使用qr.updata(connection,sql)获取返回的影响行数。

????????最后由于这种方式的SQL语句比较固定,不能通过参数传入,通用性不好,这里可以再进行进一步的封装变成DAO(数据访问对象)层。编写父类BasicDao。该类有Query?Runner其中包含查询方法。该方法集成了上述所有的链接和关闭连接以及查询操作。以后根据数据库对象可创建相应的dao对象,继承BasicDao即可。

public class BasicDao<T> {
    private QueryRunner qr = new QueryRunner();

    //开发通用dml方法,针对任意表
    public int update(String sql, Object... parameters) {
        Connection connection = null;
        try {
            connection = Utils.get_Connection();
            int update = qr.update(connection, sql, parameters);
            return update;
        } catch (SQLException throwables) {
            throw new RuntimeException();
        } finally {
            Utils.close_Connection(connection, null, null);
        }
    }

    //返回多个对象,即多行数据
    public List<T> queryMulti(String sql, Class<T> clazz, Object...parameters){
        Connection connection = null;
        try {
            connection = Utils.get_Connection();
            List<T> query = qr.query(connection, sql, new BeanListHandler<>(clazz), parameters);
            return query;
        } catch (SQLException throwables) {
            throw new RuntimeException();
        } finally {
            Utils.close_Connection(connection, null, null);
        }
    }
}

? ? ? ? 学习内容大致如上,如有错误敬请指正,最后感谢韩顺平老师!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:03:47  更:2022-02-03 01:03:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:36:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码