Java学习之数据库连接池

Java学习之数据库连接池0x00前言前面用到的jdbc,在每次连接数据库的时候都需要去重新建立对象。我们在这里会用到创建一个连接池,每次使用完后归还给连接池。0x01连接池概述连接池其实

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Java学习数据库连接池

0x00 前言

前面用到的jdbc,在每次连接数据库的时候都需要去重新建立对象。我们在这里会用到创建一个连接池,每次使用完后归还给连接池。

0x01 连接池概述

连接池其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

使用连接池能节约资源使用户访问高效。

0x02 连接池实现

C3P0创建线程池

添加jar文件到libs目录下,所需文件:

c3p0-0.9.5.2.jar  c3p0包 mchange-commons-java-0.2.12.jar//c3p0 依赖包
mysql-connector //数据库连接驱动包

将c3p0-config.xml放到src目录下,并进行配置。

创建连接池代码:

public class test1 {
    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new ComboPooledDataSource();
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        


    }
}

Druid 数据库连接池

导入jar包

druid-1.0.9.jar

导入druid.properties文件

代码:

public class test2 {
    public static void main(String[] args) throws Exception {
        Properties pro = new Properties();  //创建properties对象
        InputStream is = test2.class.getClassLoader().getResourceAsStream("druid.properties");   //获取配置文件资源
        pro.load(is);  //加载配置文件
        DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);   //创建连接池对象,并传入配置文件信息
        Connection connection = dataSource.getConnection();    //获取连接对象
        System.out.println(connection);



    }
}

使用完这些方式后可以发现,连接数据库也比较方便了,都是一些封装好的代码。

我们在这里可以再定义一个工具类,把连接的东西都封装在工具类里面,简化我们的代码。

工具类:

public class JDBCutiss {
    private static DataSource ds;

    static {
        Properties pro = new Properties();
        InputStream rs = JDBCutiss.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            pro.load(rs);
            try {
                ds = DruidDataSourceFactory.createDataSource(pro);

            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


        }
            //返回连接对象
        public static Connection getConnection() throws SQLException {
        return ds.getConnection();
        }
        public  static void close(Statement stmt,Connection conn){
        if (stmt!=null){
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

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

        }
        //该方法返回定义好的DataSource对象
        public static DataSource getDataSource(){
        return ds;
        }


    }

main方法:

public class test2 {
    public static void main(String[] args) throws Exception {
        Connection connection = JDBCutiss.getConnection();//获取连接对象
        String sql = "select * from users where id =?";  //设置sql语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);//传入sql语句并创建预编译执行对象
        preparedStatement.setString(1,"1");  //sql语句设置值
//        System.out.println(sql);
        ResultSet resultSet = preparedStatement.executeQuery();  //执行sql语句
        while (resultSet.next()){
            System.out.println(resultSet.getString("id"));  //获取id
            System.out.println(resultSet.getString("username"));//获取用户账户
            System.out.println(resultSet.getString("password"));//获取密码
        }
        JDBCutiss.close(preparedStatement,connection);


    }
}


Spring JDBC

Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发。

创建对象:

JdbcTemplate template = new JdbcTemplate(ds);

常用方法:

* update():执行DML语句。增、删、改语句
		* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
			* 注意:这个方法查询的结果集长度只能是1
		* queryForList():查询结果将结果集封装为list集合
			* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
		* query():查询结果,将结果封装为JavaBean对象
			* query的参数:RowMapper
				* 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
				* new BeanPropertyRowMapper<类型>(类型.class)
		* queryForObject:查询结果,将结果封装为对象
			* 一般用于聚合函数的查询

Template连接代码:

public class test3 {
    public static void main(String[] args) {
        JdbcTemplate template = new JdbcTemplate(JDBCutiss.getDataSource());//从工具类获取对象传入
        String sql = "update users set password =? where id =?";


        int admin = template.update(sql,"500",2);  //参数sql语句需要的参数,再进行执行sql语句
        System.out.println(admin);



    }
}

总体来说也就3行代码就实现了这么一个操作数据库的,比前面几个方法都简单很多,其他的所需功能都在工具类里面封装好了,可以直接进行调用。

0x03 结尾

在使用了spring Jdbc后发现代码比前面几个都轻松很多,定义的工具类开发程序的时候可以直接复制来使用,或者做一点稍微的改进再进行使用。总体来说spring还是很方便。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119943.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Springboot启动报错[ main] o.s.boot.SpringApplication: Application run failed(佷有可能是版本问题)

    Springboot启动报错[ main] o.s.boot.SpringApplication: Application run failed(佷有可能是版本问题)前言:本人小白一枚,最近在自学JAVA时遇到了一个小问题,在网上求解无果后,自己找到了原因,这里跟大家分享一下。开发环境:Win10;IntelliJIDEA2021.3.2版本信息:Java\jdk-17.0.2;apache-maven-3.8.4-bin;springboot2.3.4编程目的:本人之前对JAVA一窍不通,最近在自学JAVA时想要用JAVA,Springboot和maven搭建一个最基础的helloworld程序。报错信息:ERROR后面显示“o.s.boot.

    2022年9月8日
    1
  • insert into 语句的三种写法

    insert into 语句的三种写法

    2021年10月24日
    46
  • CharacterEncodingFilter 详解

    CharacterEncodingFilter 详解一、什么是CharacterEncodingFilter官方解释如下是spring内置过滤器的一种,用来指定请求或者响应的编码格式。在web开发中经常被从来使用二、CharacterEncodingFilter的用法在web.xml中的配置&amp;lt;filter&amp;gt;&amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/fi…

    2022年7月26日
    18
  • 学习方法

    学习方法

    2021年8月17日
    46
  • 值得收藏!15个 Pythonic 的代码示例

    值得收藏!15个 Pythonic 的代码示例Python 由于语言的简洁性 让我们以人类思考的方式来写代码 新手更容易上手 老鸟更爱不释手 要写出 Pythonic 优雅的 地道的 整洁的 代码 还要平时多观察那些大牛代码 Github 上有很多非常优秀的源代码值得阅读 比如 requests flask tornado 这里小明收集了一些常见的 Pythonic 写法 帮助你养成写优秀代码的习惯 01 变量交换 Badtmp aa bb tmpPythonica b b a02 列表推导 Badmy list

    2025年6月7日
    0
  • mysql只有information_schema_validationquery not set

    mysql只有information_schema_validationquery not set在MySQL8.0以前,通常会通过infomation_schema的表来获取一些元数据,例如从tables表中获取表的下一个auto_increment值,从indexes表获取索引的相关信息等。但在MySQL8.0去查询这些信息的时候,出现了不准确的情况。例如auto_increment,–此时test表的auto_increment是204mysql&amp;gt;showcreate…

    2022年9月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号