1.元数据
2.DBUtils的增删改查
3.DBUtils增删改查的底层原理
4.DBUtils控制事务
1.元数据
(1).数据库、表、列的元数据
DataBaseMetaData meta = (DataBaseMetaData)conn.getMetaData();//获取数据库元数据
meta.getUserName(); //获取数据库用户名
meta.getDriverName(); //获取数据库驱动名
rs = meta.getTables(null,null,"user",new String[]{"TABLE"});//获取表
while(rs.next()){
String tableName = rs.getString("TABLE_NAME");
}
rs = meta.getPrimaryKeys(null,null,"user");//获取主键
while(rs.next()){
short seq = rs.getString("KEY_SEQ");//获取序号
String columnName = rs.getString("COLUMN_NAME");//获取列名
}
(2).参数元数据
ParameterMetaData meta = ps.getParameterMetaData();
meta.getParameterCount();//获取参数个数
meta.getParameterTypeName();//获取参数类型
(3).结果集元数据
ResultMetaData meta = rs.getMetaData();
meta.getColumnCount();//获取结果集中列数
meta.getColumnName(2);//查询指定列名
meta.getColumnTypeName(2);//查询指定列类型
while(rs.next()){//遍历结果集
for(int i = 0;i<meta.getColumnCount();i++){
Object obj = rs.getObject(i);
}
}
2.DBUtils的增删改查
(1).DBUtils的增删改是一样的:
public void update() throws SQLException{
QueryRunner runner = new QueryRunner(new ComboPooledDataSource());
runner.update("update user set password = ? where name = ?",123,"penggege");
}
(2).DBUtils的查询:
public void query() throws SQLException{
QueryRunner runner = new QueryRunner(new ComboPooledDataSource());
List<User> list = runner.query("select * from user where id > 2",
new ResultSetHandler<list<User>>(){
public List<User> handle(ResultSet rs) throws SQLException {
List<User> list = new ArrayList<User>();
while(rs.next()){
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
list.add(user);
}
return list;
}
}
,2);
}
3.DBUtils增删改查的底层原理
增删改:
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 meta = ps.getParameterMetaData();
for(int i = 0;i<meta.getParameterCount();i++){
ps.setObject(i+1,params[i]);
}
int num = ps.executeUpdate();
Dbutils.closeQuietly(conn,ps,null);
return num;
}
查:(基本同增删改,只是在处理结果集的时候用到了回调函数)
public <T> T query(String sql,ResultSetHandler<T> rsh,object... params){
Connection conn = source.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ParameterMetaData meta = ps.getParameterMetaData();
for(int i = 0;i<meta.getParameterCount();i++){
ps.setObject(i+1,params[i]);
}
ResultSet rs = ps.executeQuery();
T t = ResultSetHandler.handle(rs);
Dbutils.closeQuietly(conn,ps,rs);
return t;
}
回调函数:方法A需要调用方法B,但是B想要运行下去又需要A的结果,所以B运行到一半回到A向A讨要A的结果然后继续运行
4.DBUtils控制事务
(1).需要控制事务
QueryRunner()
int update(Connection conn,String sql)
<T> T query(Connection conn,String sql,ResultSetHandler<T> rsh)
(2).不需要控制事务
QueryRunner(DataSource ds)
int update(String sql)
<T> T query(String sql,ResultSetHandler<T> rsh)