java学习日记(day30--dbutils)
01DButils工具类的介绍个三个核心类
* A: DButils工具类的介绍个三个核心类
* a: 概述
* DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
* ,DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。
* b: Dbutils三个核心功能介绍
* QueryRunner中提供对sql语句操作的API.
* update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作
* query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params
,用来完成表数据的查询操作
* ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
* DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
03QueryRunner类的update方法
* update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作
* Object...param 可变参数,Object类型,SQL语句会出现?占位符
04QueryRunner类实现insert添加数据
05QueryRunner类实现update删除数据
06QueryRunner类实现delete删除数据
public static void update() throws SQLException{ Connection con = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "update sort set sprice=? where sid=?"; Object[] params = {100,4}; qr.update(con, sql, params); DbUtils.closeQuietly(con); } public static void delete() throws SQLException{ Connection con = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "delete from sort where sid =?"; Object[] params = {4}; qr.update(con, sql, params); DbUtils.closeQuietly(con); } public static void insert() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "insert into sort(sid, sname,sprice, sdesc) values(?,?,?,?)"; //将三个?占位符的实际参数,写在数组中 Object[] param = {4, "风扇", 50, "超强风力"}; qr.update(conn, sql, param); DbUtils.closeQuietly(conn); }
07JavaBean类
* A: JavaBean类,将数据库中的数据用类对象表示,具有以下特性
1. 需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
2. 提供私有字段:private 类型 字段名;
3. 提供getter/setter方法:
4. 提供无参构造
08DBUtils工具类结果集处理的方式
* A: DBUtils工具类结果集处理的方式
* a: QueryRunner实现查询操作
* query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作
* b: ResultSetHandler结果集处理类
* 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集合
09QueryRunner类的方法query
* A: QueryRunner类的方法query
* 调用QueryRunner类方法query(Connection con,String sql,ResultSetHandler r, Object..params)
* ResultSetHandler r 结果集的处理方式,传递ResultSetHandler接口实现类
* Object..params SQL语句中的?占位符
* 注意: query方法返回值,返回的是T 泛型, 具体返回值类型,跟随结果集处理方式变化
10结果集处理ArrayHandler
11结果集处理ArrayListHandler
12结果集处理BeanHandler
13结果集处理BeanListHandler
14结果集处理ColumnListHandler
15结果集处理ScalarHandler
16结果集处理MapHandler
17结果集处理MapListHandler
public static void arraySelect() throws SQLException{ //建立连接 Connection conn = JDBCUtilConfig.getConnection(); //创建QueryRunner类对象 QueryRunner qr =new QueryRunner(); String sql = "SELECT * FROM sort"; Object[] objArr = qr.query(conn, sql, new ArrayHandler()); for(Object o : objArr){ System.out.println(o); } } public static void arrayListSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; // 一定是List接口,不能为ArrayList List<Object[]> list = qr.query(conn, sql, new ArrayListHandler()); for(Object[] obj : list){ System.out.println(Arrays.toString(obj)); } } public static void beanSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; SqlObject bean = qr.query(conn, sql,new BeanHandler<SqlObject>(SqlObject.class)); System.out.println(bean); } public static void beanListSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; List<SqlObject> beanList = qr.query(conn, sql,new BeanListHandler<SqlObject>(SqlObject.class)); for(SqlObject bean : beanList){ System.out.println(bean); } } public static void mapSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; Map<String, Object> map = qr.query(conn, sql, new MapHandler()); map.forEach((key, value)->{ System.out.println(key + "\t" + value); }); } public static void mapListSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; List<Map<String, Object>> mapList = qr.query(conn, sql, new MapListHandler()); mapList.forEach(m->{ m.forEach((key,value)->{ System.out.println(key + "\t" + value); }); }); } public static void colSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM sort"; List<Object> list = qr.query(conn, sql, new ColumnListHandler<Object>("sname")); System.out.println(list); } public static void scalarSelect() throws SQLException{ Connection conn = JDBCUtilConfig.getConnection(); QueryRunner qr = new QueryRunner(); String sql = "SELECT COUNT(*) FROM sort"; Long l = qr.query(conn, sql, new ScalarHandler<Long>()); System.out.println(l); }
###18连接池介绍
* A: 连接池介绍
* a: 连接池介绍
* 实际上就是存放连接的池子(容器)
* 在开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程
* 为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。
* 这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池
###19连接池概念规范和DataSource接口
* A: 连接池概念规范和DataSource接口
* a: 连接池概念规范
* 用池来管理Connection,这样可以重复使用Connection。
* 不用自己来创建Connection,而是通过池来获取Connection对象
* 使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池
* 连接池技术可以完成Connection对象的再次利用
* b: DataSource接口
* Java为数据库连接池提供了公共的接口:javax.sql.DataSource
* 各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池
* 常见的连接池:DBCP、C3P0
###20DBCP连接池介绍
* A: DBCP连接池介绍
* a: DBCP连接池介绍
* DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池
###21导入jar包
* A: 导入jar包
* a: jar包介绍
* mysql-connector-java-5.1.37-bin.jar:数据库驱动
* commons-dbutils-1.6.jar:提供QueryRunner类方便进行增删改查操作
* commons-dbcp-1.4.jar:
* commons-pool-1.5.6.jar:提供高效的数据库连接池技术
* b: 导入jar包
* 在项目根路径下建立文件夹lib
* 拷贝以上jar包,选定拷贝的jar包/右键/Build Path/Add to Build Path
22BasicDataSource类的使用
/* * 连接池jar包中,定义好一个类 BasicDataSource 实现类数据源的规范接口 javax.sql.DataSource */ public class DataSoruceDemo { public static void main(String[] args) { // 创建DataSource接口的实现类对象 // 实现类, org.apache.commons.dbcp BasicDataSource dataSource = new BasicDataSource(); // 连接数据库的4个最基本信息,通过对象方法setXXX设置进来 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/mybase"); dataSource.setUsername("root"); dataSource.setPassword("123"); try { // 调用对象方法getConnection获取数据库的连接 Connection con = dataSource.getConnection(); System.out.println(con); } catch (SQLException ex) { // System.out.println(ex); ex.printStackTrace(); throw new RuntimeException("数据库连接失败"); } } }
###23BasicDataSource类的常见配置
* A: BasicDataSource类的常见配置
必须项
driverClassName 数据库驱动名称
url 数据库的地址
username 用户名
password 密码
基本项(扩展)
maxActive 最大连接数量
minIdle 最小空闲连接
maxIdle 最大空闲连接
initialSize 初始化连接
24实现数据库连接池工具类
public class MySqlUtils { private static String driverClass; private static String url; private static String user; private static String password; private static String initialSize; private static String maxActive; private static String maxIdle; private static String minIdle; private static BasicDataSource bs = new BasicDataSource(); static{ InputStream inStream = MySqlUtils.class.getClassLoader(). getResourceAsStream("database.properties"); Properties pro = new Properties(); try { pro.load(inStream); driverClass = pro.getProperty("driverClass"); url = pro.getProperty("url"); user = pro.getProperty("user"); password = pro.getProperty("password"); initialSize = pro.getProperty("initialSize"); maxActive = pro.getProperty("maxActive"); maxIdle = pro.getProperty("maxIdle"); minIdle = pro.getProperty("minIdle"); bs.setDriverClassName(driverClass); bs.setUrl(url); bs.setUsername(user); bs.setPassword(password); if(initialSize != null){ bs.setInitialSize(Integer.parseInt(initialSize)); } if(maxActive != null){ bs.setMaxActive(Integer.parseInt(maxActive)); } if(maxIdle != null){ bs.setMaxIdle(Integer.parseInt(maxIdle)); } if(minIdle != null){ bs.setMinIdle(Integer.parseInt(minIdle)); } } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(); } } public static BasicDataSource getBasicDataSource(){ return bs; }
25工具类的测试
/* * 测试写好的工具类, * 提供的是一个DataSource接口的数据源 * QueryRunner类构造方法,接收DataSource接口的实现类 * 后面,调用方法update,query,无需传递他们Connection连接对象 */ import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; import cn.itcast.jdbcutils.JDBCUtils; public class QueryRunnerDemo { public static void main(String[] args) { select(); } // 定义2个方法,实现数据表的添加,数据表查询 // QueryRunner类对象,写在类成员位置 private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); // 数据表查询 public static void select() { String sql = "SELECT * FROM sort"; try { List<Object[]> list = qr.query(sql, new ArrayListHandler()); for (Object[] objs : list) { for (Object obj : objs) { System.out.print(obj + "\t"); } System.out.println(); } } catch (SQLException ex) { throw new RuntimeException("数据查询失败"); } } // 数据表添加数据 public static void insert() { String sql = "INSERT INTO sort (sname,sprice,sdesc)VALUES(?,?,?)"; Object[] params = { "水果", 100.12, "刚刚上市的核桃" }; try { int row = qr.update(sql, params); System.out.println(row); } catch (SQLException ex) { throw new RuntimeException("数据添加失败"); } }