1.元数据
元数据:数据库、表、列的定义信息。
元数据- DataBaseMetaData
Connection.getMetaData()
DataBaseMetaData对象
getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
getDriverName():返回驱动驱动程序的名称。
getPrimaryKeys(String catalog, String schema, String table):返回指定表主键的结果集
getTables()
元数据- ParameterMetaData
MySQL不支持获取参数类型,但是在数据库的url后跟上参数就可以支持了,但是打印出来参数的类型都是varchar
jdbc:mysql:///day12?generateSimpleParameterMetadata=true
PreparedStatement . getParameterMetaData()
获得代表PreparedStatement元数据的ParameterMetaData对象。
Select * from user where name=? And password=?
ParameterMetaData对象
getParameterCount() 获得指定参数的个数
getParameterTypeName(int param) 获得指定参数的sql类型
getParameterType异常处理
Parameter metadata not available for the given statement
url后面拼接参数
?generateSimpleParameterMetadata=true
元数据- ResultSetMetaData
ResultSet. getMetaData()
获得代表ResultSet对象元数据的ResultSetMetaData对象。
ResultSetMetaData对象
getColumnCount() 返回resultset对象的列数
getColumnName(int column) 获得指定列的名称
getColumnTypeName(int column)获得指定列的类型
2.DBUtils实现增删改查
导入MySQL的驱动包,c3p0的包,c3p0的配置文件
public void del() throws SQLException{ MyQueryRunner runner = new MyQueryRunner(new ComboPooledDataSource()); runner.update("delete from account where id=?",3); } public void add() throws SQLException{ MyQueryRunner runner = new MyQueryRunner(new ComboPooledDataSource()); runner.update("insert into account values(null,?,?)","c",1000); } public void add3() throws SQLException{ MyQueryRunner runner = new MyQueryRunner(new ComboPooledDataSource()); runner.update("update account set money=? where name=?", 777,"a"); } public void add2() throws SQLException{ QueryRunner runner = new QueryRunner(new ComboPooledDataSource()); runner.update("update account set money=? where name=?", 888,"a"); } public void update1(){ Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; ComboPooledDataSource source = new ComboPooledDataSource(); try{ conn = source.getConnection(); ps = conn.prepareStatement("update account set money=? where name=?"); ps.setDouble(1, 999); ps.setString(2, "a"); ps.executeUpdate(); }catch (Exception e) { e.printStackTrace(); }finally{ DbUtils.closeQuietly(conn, ps, rs); } }
/** * Mydb方式实现查询 * @throws SQLException * *回调函数:当方法a调用方法b,而方法b在执行的过程中,其中的一些逻辑需要由方法a来告知,此时需要方法a在调用方法b时将逻辑传入,而java中是不允许传递java源代码,此时可以使用回调机制来解决 *所谓的回调,就是方法a和方法b约定一个接口,在这个接口中定义一个方法,这个方法的名字通常叫做hander方法,a方法在调用b时,传入此接口的一个实现,其中利用handler方法,将逻辑传入,方法b在执行的过程中需要执行a传入的逻辑时,调用接口实现的handler方法即可,此时a调用b时,b回来调用的a传入的逻辑,所以这个过程叫做回调. */ @Test public void find3() throws SQLException{ MyQueryRunner runner = new MyQueryRunner(new ComboPooledDataSource()); List<Account> list = runner.query("select * from account where money>?" , new MyResultSetHandler<List<Account>>(){ public List<Account> handle(ResultSet rs) throws SQLException { List<Account> list = new ArrayList<Account>(); while(rs.next()){ Account acc = new Account(); acc.setId(rs.getInt("id")); acc.setName(rs.getString("name")); acc.setMoney(rs.getDouble("money")); list.add(acc); } return list; } }, 500); System.out.println(list); } /** * DbUtils方式实现查询 * @throws SQLException */ @Test public void find2() throws SQLException{ QueryRunner runner = new QueryRunner(new ComboPooledDataSource()); List<Account>list = runner.query("select * from account where money>?" , new ResultSetHandler<List<Account>>(){ public List<Account> handle(ResultSet rs) throws SQLException { List<Account> list = new ArrayList<Account>(); while(rs.next()){ Account acc = new Account(); acc.setId(rs.getInt("id")); acc.setName(rs.getString("name")); acc.setMoney(rs.getDouble("money")); list.add(acc); } return list; } }, 500); System.out.println(list); } /** * 古老方式实现的查询 * ---sql/sql中的参数/结果集的处理 */ @Test public void find1(){ Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; ComboPooledDataSource source = new ComboPooledDataSource(); List<Account> list = new ArrayList<Account>(); try{ conn = source.getConnection(); ps = conn.prepareStatement("select * from account where money>?"); ps.setDouble(1, 500); rs = ps.executeQuery(); while(rs.next()){ Account acc = new Account(); acc.setId(rs.getInt("id")); acc.setName(rs.getString("name")); acc.setMoney(rs.getDouble("money")); list.add(acc); } System.out.println(list); }catch (Exception e) { e.printStackTrace(); }finally{ DbUtils.closeQuietly(conn, ps, rs); } } } public class MyQueryRunner { private DataSource source = null; public MyQueryRunner() { } public MyQueryRunner(DataSource source) { this.source = source; } public int update(String sql, Object... params) throws SQLException{ Connection conn = source.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); //--获取参数元数据,获取参数的个数 ParameterMetaData metaData = ps.getParameterMetaData(); int count = metaData.getParameterCount(); //--循环设置参数的值 for(int i=1;i<=count;i++){ ps.setObject(i, params[i-1]); } //--执行update操作 int num = ps.executeUpdate(); DbUtils.closeQuietly(conn, ps, null); return num; } public <T> T query(String sql, MyResultSetHandler<T> rsh, Object... params) throws SQLException{ Connection conn = source.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); //--获取参数元数据,获知参数个数 ParameterMetaData metaData = ps.getParameterMetaData(); int count = metaData.getParameterCount(); //--循环设置参数 for(int i=1;i<=count;i++){ ps.setObject(i, params[i-1]); } //--执行查询获取结果集 ResultSet rs = ps.executeQuery(); //--回调处理结果集的逻辑 T t = rsh.handle(rs); DbUtils.closeQuietly(conn, ps, rs); return t; } }
3.DBUtils_ResultSetHander的实现类
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的列。
ScalarHandler:获取结果集中第一行数据指定列的值,常用来进行单值查询
DBUtils
1.DbUtils
工具类
2.QueryRunner -- 两行代码搞定增删改查
(1)QueryRunner() --需要控制事务时,使用这组方法
intupdate(Connection conn, String sql)
Execute an SQL INSERT, UPDATE, or DELETE query without replacement parameters.
intupdate(Connection conn, String sql, Object... params)
Execute an SQL INSERT, UPDATE, or DELETE query.
intupdate(Connection conn, String sql, Object param)
Execute an SQL INSERT, UPDATE, or DELETE query with a single replacement parameter.
<T> T query(Connection conn, String sql, ResultSetHandler<T> rsh)
Execute an SQL SELECT query without any replacement parameters.
<T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
Execute an SQL SELECT query with replacement parameters.
(2)QueryRunner(DataSource ds) --不需要控制事务用这组方法
intupdate(String sql)
Executes the given INSERT, UPDATE, or DELETE SQL statement without any replacement parameters.
intupdate(String sql, Object... params)
Executes the given INSERT, UPDATE, or DELETE SQL statement.
intupdate(String sql, Object param)
Executes the given INSERT, UPDATE, or DELETE SQL statement with a single replacement parameter.
<T> T query(String sql, ResultSetHandler<T> rsh)
Executes the given SELECT SQL without any replacement parameters.
<T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
Executes the given SELECT SQL query and returns a result object.