使用 元数据简化JDBC代码

使用 元数据简化JDBC代码

首先了解三种元数据

一.元数据- DataBaseMetaData

元数据:数据库、表、列的定义信息。

Connection.getDatabaseMetaData()

DataBaseMetaData对象

a)getURL():返回一个String类对象,代表数据库的URL。

b)getUserName():返回连接当前数据库管理系统的用户名。

c)getDatabaseProductName():返回数据库的产品名称。

d)getDatabaseProductVersion():返回数据库的版本号。

e)getDriverName():返回驱动驱动程序的名称。

f)getDriverVersion():返回驱动程序的版本号。

g)isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。

元数据-ParameterMetaData

l PreparedStatement . getParameterMetaData()

• 获得代表PreparedStatement元数据的ParameterMetaData对象。

• Select * from user where name=? And password=?

l ParameterMetaData对象

• getParameterCount()

• 获得指定参数的个数

• getParameterType(intparam)

获得指定参数的sql类型

元数据-ResultSetMetaData

l ResultSet. getMetaData()

• 获得代表ResultSet对象元数据的ResultSetMetaData对象。

l ResultSetMetaData对象

• getColumnCount()

• 返回resultset对象的列数

• getColumnName(intcolumn)

• 获得指定列的名称

• getColumnTypeName(intcolumn)

• 获得指定列的类型

使用元数据简化JDBC代码

l 业务背景:系统中所有实体对象都涉及到基本的CRUD操作:

• 所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。

• 实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。

实例分析:实现增删改查的简化代码

DBManager.Java代码

package com.hbsi.utils;

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;

import javax.sql.DataSource;

importorg.apache.commons.dbcp.BasicDataSourceFactory;

public class DBManager {

privatestatic DataSource ds=null;

static{

//返回读取指定资源的输入流

InputStreamis=DBManager.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");

//创建一个无默认值的空属性列表

Propertiesp=new Properties();

try{

//从输入流中读取属性列表(键和元素对)

p.load(is);

//工厂模式

ds=BasicDataSourceFactory.createDataSource(p);

}catch(Exception e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

}

publicstatic Connection getConnection() throws SQLException{

returnds.getConnection();

}

publicstatic void release(Connection con,Statement st,ResultSet rs){

if(rs!=null){

try{

rs.close();

}catch(Exception e) {e.printStackTrace();}

rs = null;

}

if(st!=null){

try{

st.close();

}catch(Exception e) {e.printStackTrace();}

st= null;

}

if(con!=null){

try{

con.close();

}catch(Exception e) {e.printStackTrace();}

con= null;

}

}

publicstatic void update(String sql,Object[] params){

//

Connectioncon=null;

PreparedStatementst=null;

ResultSetrs=null;

try{

con=DBManager.getConnection();

st=con.prepareStatement(sql);

for(inti=0;i<params.length;i++){

st.setObject(i+1,params[i]);

}

st.executeUpdate();

}catch (SQLException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}finally{

DBManager.release(con,st, rs);

}

}

publicstatic Object find(String sql,Object[] params,ResultSetHandler rsh) throwsSQLException{

//

Connectioncon=null;

PreparedStatementst=null;

ResultSetrs=null;

try{

con=DBManager.getConnection();

st=con.prepareStatement(sql);

for(inti=0;i<params.length;i++){

st.setObject(i+1,params[i]);

}

rs=st.executeQuery();

//对结果集的处理.框架的开发者不知道如何处理,框架开发者制定一个规范

//只需要调用程序员传过来对结果集进行处理方法

returnrsh.handler(rs);

}finally{

DBManager.release(con,st, rs);

}

}

}

BeanListHAndle.java

package com.hbsi.utils;

import java.lang.reflect.Field;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

public class BeanListHandle implements ResultSetHandler {

//某种类型

private Class clazz;

//传递javaBean类对象Class对象

public BeanListHandle(Classclazz){

this.clazz=clazz;

}

@Override

public Object handler(ResultSet rs) {

List list=new ArrayList();

try {

while(rs.next()){

//读取一行

//封装到bean对象

Object bean=clazz.newInstance();

ResultSetMetaData meta=rs.getMetaData();

int count=meta.getColumnCount();

for(int i=1;i<=count;i++){

String columnName=meta.getColumnName(i);

Object value=rs.getObject(columnName);

Field f=clazz.getDeclaredField(columnName);

f.setAccessible(true);

f.set(bean, value);

}

//该bean对象加入list集合

list.add(bean);

}

} catch (Exception e) {

// TODO Auto-generatedcatch block

throw new RuntimeException(e);

}

return list;

}

}

UserDaoImpl.java

package com.hbsi.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Date;

import java.util.List;

import com.hbsi.domain.User;

import com.hbsi.utils.BeanHandler;

import com.hbsi.utils.BeanListHandle;

import com.hbsi.utils.DBManager;

public class UserDaoImpl {

publicvoid insert() throws SQLException{

// Connectioncon=null;

// PreparedStatementst=null;

// ResultSetrs=null;

//

// con=DBManager.getConnection();

// Stringsql = "insert into users(id,name,password,email,birthday)values(?,?,?,?,?)";

// st=con.prepareStatement(sql);

// st.setInt(1,6);

// st.setString(2,"xxxx");

// st.setString(3,"1111");

// st.setString(4,"aa@sina.com");

// st.setDate(5,newjava.sql.Date(new Date().getTime()));

// st.executeUpdate(sql);

Stringsql = "insert into users(id,name,password,email,birthday)values(?,?,?,?,?)";

Object[]params={9,"xxx","1111","xxx@126.com",new Date()};

DBManager.update(sql,params);

}

publicvoid delete() throws SQLException{

// Connection con=null;

// PreparedStatementst=null;

// ResultSetrs=null;

// con=DBManager.getConnection();

// Stringsql = "delete from users where id=?";

// st=con.prepareStatement(sql);

// st.setInt(1,1);

// st.executeUpdate();

Stringsql = "delete from users where id=?";

Object[]params={4};

DBManager.update(sql,params);

}

publicvoid update() throws SQLException{

// Connectioncon=null;

// PreparedStatementst=null;

// ResultSetrs=null;

// con=DBManager.getConnection();

// Stringsql="update users set name=? password=? where id=?";

// st.setString(1,"MAKE");

// st.setString(2,"111");

// st.setInt(3,5);

// st.executeUpdate();

Stringsql="update users set name=?,password=? where id=?";

Object[]params={"qqq","1111",5};

DBManager.update(sql,params);

}

//DBManager写一个方法update(Stringsql,Object[] param)

publicvoid find() throws SQLException{

// Connectioncon=null;

// PreparedStatementst=null;

// ResultSetrs=null;

// con=DBManager.getConnection();

// Stringsql="update users set name=? password=? where id=?";

// st.setString(1,"MAKE");

// st.setString(2,"111");

// st.setInt(3,5);

// st.executeUpdate();

Stringsql="select * from user where id=?";

Object[]params={1};

//MyResultsetHAndlerrsh=new MyResultsetHAndler();

BeanHandlerrsh=new BeanHandler(User.class);

Useruser=(User) DBManager.find(sql, params,rsh);

System.out.println(user.getId()+""+user.getName());

}

publicList findAll(){

Listlist=null;

Stringsql="select * from user";

Object[] params={};

BeanListHandlersh=new BeanListHandle(User.class);

try {

list= (List)DBManager.find(sql, params, rsh);

}catch (SQLException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

returnlist;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值