1. 元数据- DataBaseMetaData
元数据:数据库、表、列的定义信息。
Connection.getDatabaseMetaData()
DataBaseMetaData对象
getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。
getDriverVersion():返回驱动程序的版本号。
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
2.元数据- ParameterMetaData
l PreparedStatement . getParameterMetaData()
• 获得代表PreparedStatement元数据的ParameterMetaData对象。
• Select * from user where name=? And password=?
l ParameterMetaData对象
• getParameterCount()
• 获得指定参数的个数
• getParameterType(int param)
• 获得指定参数的sql类型
3.元数据- ResultSetMetaData
l ResultSet. getMetaData()
获得代表ResultSet对象元数据的ResultSetMetaData对象。
l ResultSetMetaData对象
• getColumnCount() :返回resultset对象的列数
• getColumnName(int column) :获得指定列的名称
• getColumnTypeName(int column):获得指定列的类型
4.重点内容:使用元数据简化JDBC代码
l 业务背景:系统中所有实体对象都涉及到基本的CRUD操作:
所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
5. 以上知识点的案例分析
DatabaseMetaData类
package com.csdn.demo; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.SQLException; import com.csdn.uil.DBManager_c3p0; public class Demo3 { private static Connection con = null; public static void main(String[] args) { try { con = DBManager_c3p0.getCon(); DatabaseMetaData dbmd = con.getMetaData(); System.out.println(dbmd.getURL()); System.out.println(dbmd.getDriverName()); System.out.println(dbmd.getDriverVersion()); System.out.println(dbmd.getDatabaseProductName()); System.out.println(dbmd.getDatabaseProductVersion()); } catch (SQLException e) { e.printStackTrace(); } } }
ParameterMetaData类
package com.csdn.demo; import java.sql.Connection; import java.sql.ParameterMetaData; import java.sql.PreparedStatement; import java.sql.SQLException; import com.csdn.uil.DBManager_c3p0; public class Demo4 { /** * @param args * mysql驱动对于ParameterMetaData类的某些方法不支持,就是访问属性的某些方法,oracle支持 */ private static Connection con = null; private static PreparedStatement ps = null; public static void main(String[] args) { try { con = DBManager_c3p0.getCon(); String sql = "select * from user where id = ?"; ps = con.prepareStatement(sql); ParameterMetaData pm = ps.getParameterMetaData(); System.out.println(pm.getParameterCount()); } catch (SQLException e) { e.printStackTrace(); } } }
ResultSetMetaData类
package com.csdn.demo; import java.sql.Connection; import java.sql.ParameterMetaData; import java.sql.PreparedStatement; import java.sql.ResultSetMetaData; import java.sql.SQLException; import com.csdn.uil.DBManager_c3p0; public class Demo5 { /** * @param args */ private static Connection con = null; private static PreparedStatement ps = null; public static void main(String[] args) { try { con = DBManager_c3p0.getCon(); String sql = "select * from user where id = ?"; ps = con.prepareStatement(sql); ResultSetMetaData rs = ps.getMetaData(); System.out.println(rs.getColumnClassName(1)); System.out.println(rs.getCatalogName(1)); int count = rs.getColumnCount(); for(int i=0;i<count;i++){ System.out.println(rs.getColumnName(1)); System.out.println(rs.getColumnType(1)); System.out.println(rs.getColumnTypeName(1)); } } catch (SQLException e) { e.printStackTrace(); } } }
DBManager_c3p0(连接池)类
package com.csdn.uil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DBManager_c3p0 { private static ComboPooledDataSource ds = null; static{ //这里要注意的是:xml配置文件的名字一定要是c3p0-config.xml,可以doc参考帮助,帮助中有命名,如果名字写错了会无法加载驱动,空指针的错 ds = new ComboPooledDataSource("mysql"); /*try { ds =new ComboPooledDataSource(); ds.setDriverClass("com.mysql.jdbc.Driver"); //自己写的时候一定要区分com.mysql.jdbc和jdbc:mysql:的顺序区别,写错之后会出无法加载driver驱动的错 ds.setJdbcUrl("jdbc:mysql://localhost:3306/login"); ds.setUser("root"); ds.setPassword("root"); ds.setInitialPoolSize(10); ds.setMaxPoolSize(20); ds.setMinPoolSize(5); } catch (PropertyVetoException e) { e.printStackTrace(); }*/ } public static Connection getCon() throws SQLException{ return ds.getConnection(); } public static void closeDB(Connection con,PreparedStatement ps,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ps!=null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(con!=null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } //CUD增删改模版 public static void update(String sql,Object[] params){ Connection con = null; PreparedStatement ps = null; try { con = DBManager_c3p0.getCon(); ps = con.prepareStatement(sql); for(int i=0;i<params.length;i++){ ps.setObject(i+1,params[i]); } int i = ps.executeUpdate(); if(i>0){ System.out.println("成功了!!"); } } catch (SQLException e) { e.printStackTrace(); }finally{ DBManager_c3p0.closeDB(con,ps,null); } } public static Object query(String sql,Object[] params,ResultSetHandler rsh){ Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = DBManager_c3p0.getCon(); ps = con.prepareStatement(sql); for(int i=0;i<params.length;i++){ ps.setObject(i+1,params[i]); } rs = ps.executeQuery(); return rsh.handler(rs); } catch (SQLException e) { throw new RuntimeException(e); }finally{ DBManager_c3p0.closeDB(con,ps,null); } } }
操作实现类:BeanHandler类
package com.csdn.uil; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.lang.reflect.Field ; publicclass BeanHandler implements ResultSetHandler { private Class clazz; public BeanHandler(Class clazz) { super(); this.clazz = clazz; } @Override public Object handler(ResultSet rs) { try { if(!rs.next()){ returnnull; } Object bean = clazz.newInstance(); ResultSetMetaData rm = rs.getMetaData(); int count = rm.getColumnCount(); for(int i=0;i<count;i++){ String columnName = rm.getColumnName(i+1); Object value = rs.getObject(columnName); Field f = bean.getClass().getDeclaredField(columnName); f.setAccessible(true); f.set(bean,value); } return bean; } catch (Exception e) { thrownew RuntimeException(); } } }
实现类:Model类
package com.csdn.model; import org.junit.Test; import com.csdn.domain.users; import com.csdn.uil.BeanHandler; import com.csdn.uil.DBManager_c3p0; public class Model { @Test public void insert(){ String sql = "insert into user (username,password) values(?,?)"; Object[] params = {"aa","aa"}; DBManager_c3p0.update(sql, params); } @Test public void delete(){ String sql = "delete from user where id = ?"; Object[] params = {18}; DBManager_c3p0.update(sql, params); } @Test public void update(){ String sql = "update user set username = ?,password = ? where id = ?"; Object[] params = {"bb","bb",17}; DBManager_c3p0.update(sql, params); } @Test public void find(){ String sql = "select id,username,password from user where id = ?"; Object[] params = {1}; users users = (users)DBManager_c3p0.query(sql, params, new BeanHandler(users.class)); System.out.println(users.getId()+";"+users.getUsername()+";"+users.getPassword()); } }