JDBC元数据API :是框架编写的基础,掌握元数据API ,更清楚知道框架是如何实现的
元数据MetaData : 指数据库中 库、表、列的定义信息
1、DataBaseMetaData 数据库元数据
2、ParameterMetaData 参数元数据
3、ResultSetMetaData 结果集元数据
上面的元数据可以不必太深入了解,只需要知道DBUtils框架是使用该API实现的就可以了
------------------------------------------------------------------------------------------------------------------------------------------------
DBUtils学习
1、QueryRunner 框架核心类 ,所有数据库操作都是必须通过 QueryRunner 进行的
2、ResultSetHandler 结果集封装接口,完成将ResultSet 结果集 封装为一个Java对象
3、DbUtils 工具类 提供驱动管理、事务管理、释放资源等一系列公共方法
去官网下载DBUtils
将dbutils的jar 复制 WEB-INF/lib
QueryRunner 与 ResultSetHandler 一起使用,完成数据表增删改查
构造器:
QueryRunner() -------- 没有传递连接池给DBUtils 框架,框架不能获得数据库连接,接下来每个操作,必须将数据库连接传给框架 (手动管理事务)
QueryRunner(DataSource ds) ---- 将连接池给DBUtils框架,以后每个操作,都会从连接池中获取一个新的连接 (每条SQL 一个单独的事务)
更新操作 insert update delete
public int update(Connection conn, String sql, Object... params) ---- 手动管理事务,没有将连接池提供框架,传入连接
public int update(String sql, Object... params) ----- 将连接池交给框架,由框架管理事务,不需要传入连接
查询操作 select
public Object query(Connection conn, String sql, ResultSetHandler
public Object query(String sql, ResultSetHandler
1、需要手动管理事务
QueryRunner()
public int update(Connection conn, String sql, Object... params)
query(Connection conn, String sql, ResultSetHandler
2、由框架管理事务 (每条SQL都是一个单独事务)
QueryRunner(DataSource ds)
public int update(String sql, Object... params)
public Object query(String sql, ResultSetHandler
ResultSetHandler 在DBUtils 框架中提供九个默认 实现类,直接使用九个默认实现类,可以完成常规操作,而不需要自定义结果集封装
1) ArrayHandler 和 ArrayListHandler 将数据表的每行记录保存Object[] 中
2) BeanHandler 和 BeanListHandler 将数据表每行记录 保存JavaBean对象中
* 封装javabean属性时,必须保证数据表列名与 javabean属性名一致,否则无法封装
3) MapHandler和 MapListHandler 将结果每行记录保存到一个Map集合,key是列名,value是值
4) ColumnListHandler 查询结果集中指定一列数据
5) KeyedHandler(name) 结果集每行数据封装map,再将map存入另一个map 作为value,指定一列作为key
6) ScalarHandler 进行单值查询 select count(*) from account;
重点:BeanHandler 和 BeanListHandler 、ScalarHandler 、ColumnListHandler
------------------------------------------------------------------------------------------------------------------------------------------------
编程步骤:
导入jar包:
mysql-connector-java-5.0.8-bin.jar commons-dbutils-1.4.jar c3p0-0.9.1.2.jar
c3p0-config.xml :c3p0的配置文件,位于工程src目录下
xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="user">rootproperty> <property name="password">rootproperty> <property name="driverClass">com.mysql.jdbc.Driverproperty> <property name="jdbcUrl">jdbc:mysql:///day15?generateSimpleParameterMetadata=trueproperty> default-config> c3p0-config>
工具类(通过c3p0 建立连接和释放资源)
package cn.itcast.utils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; /** * 工具类 建立连接 释放资源 * * @author seawind * */ public class JDBCUtils { // 通过c3p0 数据库连接池 建立连接 // 自动读取 src下 c3p0-config.xml 配置文件 private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); public static DataSource getDataSource() { return dataSource; } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } // 释放资源的方法 可以被 DBUtils框架 DbUtils工具类取代 public static void release(ResultSet rs, Statement stmt, Connection conn) { // 释放资源 if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs = null; } release(stmt, conn); } public static void release(Statement stmt, Connection conn) { if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } }
DBUtilsTest:对数据库的CRUD操作
package cn.itcast.dbutils; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.junit.Test; import cn.itcast.domain.Account; import cn.itcast.utils.JDBCUtils; /** * 调用DBUtils框架完成增删改查 * * @author seawind * */ public class DBUtilsTest { @Test // 查询 public void testSelect() throws SQLException { QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); // 自定义结果集封装 Listaccounts = queryRunner.query("select * from account", new ResultSetHandler >() { @Override public List
handle(ResultSet rs) throws SQLException { List accounts = new ArrayList (); try { while (rs.next()) { Account account = new Account(); account.setId(rs.getInt("id")); account.setName(rs.getString("name")); account.setMoney(rs.getDouble("money")); accounts.add(account); } return accounts; } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } } }); for (Account account : accounts) { System.out.println(account.getName() + "," + account.getMoney()); } } @Test // 删除 public void testDelete() throws SQLException { QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); queryRunner.update("delete from account where name =?", "ddd"); } @Test // 修改 Account 数据 public void testUpdate() throws SQLException { QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); queryRunner.update("update account set name=?,money=? where id =?", "小明", 3000, 2); } @Test // 插入Account表数据 public void testInsert() throws SQLException { // 创建QueryRunner对象 QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); // 插入 queryRunner.update("insert into account values(null,?,?)", "eee", 1000); } }
DBUtils九个内置Handler(结果集处理)
package cn.itcast.dbutils; import java.sql.SQLException; import java.util.Arrays; import java.util.List; import java.util.Map; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayHandler; import org.apache.commons.dbutils.handlers.ArrayListHandler; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.commons.dbutils.handlers.KeyedHandler; import org.apache.commons.dbutils.handlers.MapHandler; import org.apache.commons.dbutils.handlers.MapListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.junit.Test; import cn.itcast.domain.Account; import cn.itcast.utils.JDBCUtils; /** * 使用 DBUtils 九个内置handler * * @author seawind * */ public class ResultSetHandlerTest { // ScalarHandler @Test public void testScalarHandler() throws SQLException { QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); long value = (Long) queryRunner.query("select count(*) from account", new ScalarHandler(1)); System.out.println(value); } @Test // KeyedHandler public void testKeyedHandler() throws SQLException { QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); Map