元数据与jdbc框架

来源:互联网 发布:java如何编译运行 编辑:程序博客网 时间:2024/05/07 05:39


元数据- DataBaseMetaData

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

Connection.getDatabaseMetaData()

DataBaseMetaData对象

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

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

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

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

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

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

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

private static Connection conn;

public static void main(String[] args){

try {

DatabaseMetaData meta =(DatabaseMetaData) conn.C0p3Demo.getMetaData();

           System.out.println(data.getDatabaseProductName()+"----"+data.getDatabaseProductVersion()+

"-----"+data.getURL());

}catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

C3p0Demo1.closeDB(conn, null, null);

}

}

结果:

MySQL----5.1.44-community-----jdbc:mysql://localhost:3306/javaweb

元数据- ParameterMetaData 

 PreparedStatement . getParameterMetaData() 

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

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

ParameterMetaData对象

getParameterCount() 

获得指定参数的个数

getParameterType(int param) 

获得指定参数的sql类型

事例:

private static Connection conn;

private static PreparedStatement ps;

public static void main(String[] args){

try {

conn=C3p0Demo1.getConnection();

String sql = "select * from admin where name= ? and password = ?";

ps = conn.prepareStatement(sql);

ParameterMetaData pmd = ps.getParameterMetaData();//返回的是参数的元数据;

System.out.println(pmd.getParameterCount());//参数多少

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

C3p0Demo1.closeDB(conn, null, null);

}

}

结果:2

元数据- ResultSetMetaData 

ResultSet. getMetaData() 

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

ResultSetMetaData对象

getColumnCount() 

返回resultset对象的列数

getColumnName(int column) 

获得指定列的名称

 getColumnTypeName(int column)

获得指定列的类型 

事例:

   private static Connection conn;

private static PreparedStatement ps;

    private static ResultSet rs;

public static void main(String[] args){

try {

conn=C3p0Demo1.getConnection();

String sql = "select * from admin";

ps = conn.prepareStatement(sql);

rs = ps.executeQuery();

ResultSetMetaData rsm=rs.getMetaData();

System.out.println(rsm.getColumnCount());

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

System.out.println(rsm.getColumnName(i));

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

C3p0Demo1.closeDB(conn, null, null);

}

}

使用元数据简化JDBC代码

操作:

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

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

package com.csdn.tool;import java.beans.PropertyVetoException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import com.mchange.v2.c3p0.ComboPooledDataSource;public class C3p0Demo1 {                private static ComboPooledDataSource ds=null;                                static{                ds = new ComboPooledDataSource();                try {                 ds = new ComboPooledDataSource("mysql");/*ds.setDriverClass("com.mysql.jdbc.Driver");ds.setJdbcUrl("jdbc:mysql://localhost:3306/javaweb");ds.setUser("root");ds.setPassword("root");ds.setInitialPoolSize(10);ds.setMaxPoolSize(40);ds.setMinPoolSize(5);*/} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}                                }                public static Connection getConnection() throws SQLException{                return ds.getConnection();                }                public static void closeDB(Connection con,Statement st,ResultSet rs){             if(rs!=null){             try {             rs.close();             } catch (SQLException e) {             // TODO Auto-generated catch block             e.printStackTrace();             }             }             if(st!=null){             try {             st.close();             } catch (SQLException e) {             // TODO Auto-generated catch block             e.printStackTrace();             }             }             if(con!=null){             try {             con.close();             } catch (SQLException e) {             // TODO Auto-generated catch block             e.printStackTrace();             }             }                        }                public static void update(String sql,Object[] params){             Connection conn = null;             PreparedStatement ps = null;                         try {             conn = C3p0Demo1.getConnection();             ps = conn.prepareStatement(sql);             for(int i=0;i<params.length;i++){             ps.setObject(i+1, params[i]);             }             ps.executeUpdate();             } catch (SQLException e) {             // TODO Auto-generated catch block             e.printStackTrace();             }finally{             C3p0Demo1.closeDB(conn, ps, null);             }                        }             public static Object query(String sql,Object[] params,ResultSetHandler rh){              Connection conn = null;              PreparedStatement ps = null;              ResultSet rs =null;                            try {conn = C3p0Demo1.getConnection();ps = conn.prepareStatement(sql);for(int i=0;i<params.length;i++){ps.setObject(i+1, params[i]);}rs = ps.executeQuery();return rh.handler(rs);} catch (SQLException e) {// TODO Auto-generated catch blockthrow new RuntimeException();}finally{C3p0Demo1.closeDB(conn, ps, rs);}                           }              }package com.csdn.tools;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import org.junit.Test;import com.csdn.bean.Users;import com.csdn.tool.BeanHandler;import com.csdn.tool.C3p0Demo1;public class Demo2 {    @Testpublic void update(){String sql="update admin set name=?,password=? where id =?";Object[] params = {"qq","123",10};C3p0Demo1.update(sql, params);}    @Test    public void insert(){String sql="insert into admin(id,name,password) values(?,?,?)";Object[] params = {13,"123","123"};C3p0Demo1.update(sql, params);}    @Test    public void delete(){String sql="delete from admin where id=13";Object[] params = {13,"123","123"};C3p0Demo1.update(sql, params);}    @Test    public void find(){String sql="select id,name,password from admin where id=?";Object[] params = {3};Users  user =(Users)C3p0Demo1.query(sql, params, new BeanHandler(Users.class));System.out.println(user.getId()+"--"+user.getName()+"--"+user.getPassword());}}package com.csdn.tool;import java.sql.ResultSet;/* *  * 结果集的处理 * */public interface ResultSetHandler {               public Object handler(ResultSet rs);}//bean文件package com.csdn.bean;public class Users {         private int id;         private String name;         private String password;                  public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}         }package com.csdn.tool;import java.lang.reflect.Field;import java.sql.ResultSet;import java.sql.ResultSetMetaData;public class BeanHandler implements ResultSetHandler{private Class clazz;public BeanHandler(Class clazz){this.clazz=clazz;}@Overridepublic Object handler(ResultSet rs) {//把结果集封装到bean里;try{if(!rs.next()){return null;}Object bean = clazz.newInstance();//实例化一个bean对象ResultSetMetaData rsmd = rs.getMetaData();     int count =  rsmd.getColumnCount();        for(int i=0;i<count;i++){String  columnName = rsmd.getColumnName(i+1);//得到结果集的每一列的字段名Object obj =rs.getObject(columnName);Field f = bean.getClass().getDeclaredField(columnName);//反射bean上与列名相对应的属性f.setAccessible(true);f.set(bean, obj);   }   return bean;}catch(Exception e){       throw new RuntimeException();}}}


原创粉丝点击