zoukankan      html  css  js  c++  java
  • JavaWeb学习之DButils和连接池

    DButils

    DButils是JDBC的简化开发工具包。需要导入commons-dbutils-1.6.jar才能够正常使用DButils工具类

    DButils封装了对JDBC的操作,简化了JDBC操作,可以少些代码。DButils的三个核心功能:

    1、QueryRunner提供了对sql语句操作的API

    2、ResultSetHandler接口,用于定义select操作后怎样去封装结果集

    3、DButils类,是一个工具类,定义了关闭资源与事物处理的方法

    QueryRunner核心类

    1、update(Connection conn,String sql,Object...params),用于完成表数据增加、删除、修改的操作

     //添加
    	public static void add() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "insert into users(username,pwd) values(?,?)";
    		Object[] obj = { "houyi", "123456" };
    		int row = qr.update(conn,sql, obj);
    		conn.close();
    		if (row > 0) {
    			System.out.println("添加成功");
    		} else {
    			System.out.println("添加失败");
    		}
    	}
        //修改
    	public static void update() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "update users set username=? ,pwd=? where id=?";
    		int row = qr.update(conn, sql, "zhangfei", "123", 3);
    		conn.close();
    		if (row > 0) {
    			System.out.println("修改成功");
    		} else {
    			System.out.println("修改失败");
    		}
    	}
        //删除
    	public static void delete() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "delete from users where id=?";
    		int row = qr.update(conn, sql, 2);
    		conn.close();
    		if (row > 0) {
    			System.out.println("删除成功");
    		} else {
    			System.out.println("删除失败");
    		}
    	}
    

    2、query(Connection conn,String sql,ResultSetHandler<T> rsh,Object...params),用来完成表数据的查询操作。

          esultSetHandler结果集处理类

    ArrayHandler

    将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值

    ArrayListHandler

    将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组再封装到List集合中。

    BeanHandler

    将结果集中第一条记录封装到一个指定的javaBean中。

    BeanListHandler

    将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中

    ColumnListHandler

    将结果集中指定的列的字段值,封装到一个List集合中

    ScalarHandler

    它是用于单数据。例如select count(*) from 表操作。

    MapHandler

    将结果集第一行封装到Map集合中,Key 列名, Value 该列数据

    MapListHandler

    将结果集第一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合

    // 查询ArrayHandler
    	public static void find1() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "select * from users";
    		Object[] obj = qr.query(conn, sql, new ArrayHandler());
    		for (Object o : obj) {
    			System.out.print(o + "	");
    		}
    	}
    
    	// 查询ArrayListHandler
    	public static void find2() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "select * from users";
    		List<Object[]> list = qr.query(conn, sql, new ArrayListHandler());
    		for (Object[] o : list) {
    			for (Object o2 : o) {
    				System.out.println(o2);
    			}
    		}
    	}
    
    	// 查询BeanHandler
    	public static void find3() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "select * from users";
    		User u = qr.query(conn, sql, new BeanHandler<User>(User.class));
    		System.out.println(u);
    	}
    
    	// 查询BeanListHandler
    	public static void find4() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "select * from users";
    		List<User> list = qr.query(conn, sql, new BeanListHandler<User>(User.class));
    		for (User u : list) {
    			System.out.println(u);
    		}
    	}
    
    	// 查询ColumnListHandler
    	public static void find5() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "select username from users";
    		List<String> list = qr.query(conn, sql, new ColumnListHandler<String>());
    		System.out.println(list);
    	}
    
    	// 查询ScalarHandler(单数据)
    	public static void find6() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "select count(*) from users";
    		long num = qr.query(conn, sql, new ScalarHandler<Long>());
    		System.out.println(num);
    	}
    
    	// 查询MapHandler
    	public static void find7() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "select * from users";
    		Map<String, Object> map = qr.query(conn, sql, new MapHandler());
    		for (String key : map.keySet()) {
    			System.out.println(key + "..." + map.get(key));
    		}
    	}
    
    	// 查询MapListHandler
    	public static void find8() throws SQLException {
    		QueryRunner qr = new QueryRunner();
    		String sql = "select * from users";
    		List<Map<String, Object>> list = qr.query(conn, sql, new MapListHandler());
    		for (Map<String, Object> map : list) {
    			for (String key : map.keySet()) {
    				System.out.println(key + "..." + map.get(key));
    			}
    		}
    	}
    

    连接池

    在实际开发中,获得连接或者释放资源是非常消耗系统资源的两个过程,为了解决这个问题就采用连接池技术来共享连接Connection。

    连接池原理:

    把连接Connection放到池中,这样就能够重复使用Connection。通过池来获取对象,当使用完Connection后,调用Connection的close()方法关闭Connection。这里并不是真正的关闭Connection,而是把Connection归还给池。池就可以反复利用这个Connection对象了

    Java为数据库连接池提供了公共的接口:javax.sql.DateSource,各个厂商只需要让自己的连接池实现这个接口即可。

    DBCP连接池

    1、导入jar包

    2、编写工具类

     连接数据库表的工具类,采用DBCP连接池的方式完成,Java中提供了一个连接池的规范接口:

    DateSource:是Java中提供的连接池,作为DriverManager工具的替代项。在DBCP包中提供了DataSource接口的实现类,我们要用的具体的连接池BasicDataSource类

    package com.oracle.demo;
    
    import javax.sql.DataSource;
    
    import org.apache.commons.dbcp.BasicDataSource;
    
    public class JDBCUtils {
    	public static final String DRIVER = "com.mysql.jdbc.Driver";
    	public static final String URL = "jdbc:mysql://localhost:3306/login?characterEncoding=utf-8";
    	public static final String USERNAME = "root";
    	public static final String PASSWORD = "123456";
    	/*
    	 * 创建连接池BasicDataSource
    	 */
    	public static BasicDataSource dataSource = new BasicDataSource();
    
    	// 静态代码块
    	static {
    		// 对连接池对象 进行基本的配置
    		dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
    		dataSource.setUrl(URL); // 指定要连接的数据库地址
    		dataSource.setUsername(USERNAME); // 指定要连接数据的用户名
    		dataSource.setPassword(PASSWORD); // 指定要连接数据的密码
    	}
    
    	/*
    	 * 返回连接池对象
    	 */
    	public static DataSource getDataSource() {
    		return dataSource;
    	}
    }
    
    // 添加
    	public static void add() throws SQLException {
    		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
    		String sql = "insert into users(username,pwd) values(?,?)";
    		Object[] obj = { "houyi", "123456" };
    		int row = qr.update(sql, obj);
    		conn.close();
    		if (row > 0) {
    			System.out.println("添加成功");
    		} else {
    			System.out.println("添加失败");
    		}
    	}

    常见的配置项

    分类

    属性

    描述

    必须项

    driverClassName

    数据库驱动名称

    url

    数据库的地址

    username

    用户名

    password

    密码

    基本项(扩展)

    maxActive

    最大连接数量

    minIdle

    最小空闲连接

    maxIdle

    最大空闲连接

    initialSize

    初始化连接

  • 相关阅读:
    js_闭包
    js_函数参数的相关问题
    js_浏览器控制台打印引用数据是打印的原始数据
    js_递归函数在严格模式下的调用方法
    js_执行环境及作用域
    js_关于为什么'函数的参数都是按值传递'的理解
    (项目)爬取安居客二手房房屋信息
    (项目)爬取自如租房链接的价格
    识别验证码之百度通用识别接口
    (项目)使用selenium的截屏功能实现自动登陆滴滴打码网
  • 原文地址:https://www.cnblogs.com/Java-125/p/9036243.html
Copyright © 2011-2022 走看看