• Java学习之数据库连接池


    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还是很方便。

  • 相关阅读:
    转:Contrastive Loss (对比损失)
    转:Siamese network 孪生神经网络
    pytorch的nn.MSELoss损失函数
    python创建包
    pytorch中如何在lstm中输入可变长的序列
    转:python中with的用法
    转:np.insert函数
    转:分类模型的评估指标
    Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task(构造)
    Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot
  • 原文地址:https://www.cnblogs.com/nice0e3/p/13511365.html
Copyright © 2020-2023  润新知