JDBC增删改查模版编写与案例 --->张国亮总结心得第二季

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());

}

}

你可能感兴趣的:(JDBC增删改查模版编写与案例 --->张国亮总结心得第二季)