java jdbc封装的好处_封装jdbc让你轻松理解Java反射机制

9f484cd98cd7dead6c91e01570dcac10.png

2.BasicDao.java

static{

try {

Class.forName("com.mysql.jdbc.Driver");

} catch (Exception e) {

e.printStackTrace();

}

}

public Connection getConnection() throws SQLException{

String url = "jdbc:mysql://127.0.0.1:3306/dbparam?autoReconnect=true&useUnicode=true&characterEncoding=UTF8";

String user = "root";

String password = "123456";

return DriverManager.getConnection(url, user, password);

}

public void close(ResultSet rs, Statement st, Connection conn){

if(rs!=null){

try {rs.close();} catch (SQLException e) {e.printStackTrace();}

}

if(st!=null){

try {st.close();} catch (SQLException e) {e.printStackTrace();}

}

if(conn!=null){

try {conn.close();} catch (SQLException e) {e.printStackTrace();}

}

}

public String getMethodName(String fieldName){

byte[] buffer = fieldName.getBytes();

buffer[0] = (byte)(buffer[0]-32);

String name = new String(buffer);

return "get"+name;

}

public String setMethodName(String fieldName){

byte[] buffer = fieldName.getBytes();

buffer[0] = (byte)(buffer[0]-32);

String name = new String(buffer);

return "set"+name;

}

3.GetEntity.java

/**

* T为实体对象,可以是由属性和setter/getter组成的实体类,这里要求属性名和查询的数据库字段名相同(顺序可以不一致)

* @author zhzhair

* @param

*/

public class GetEntity extends BasicDao{

/**

* @todo 获取实体对象,T为实体类,sql为sql语句字符串,param为sql中传的参数

* @return T

*/

public T getEntity(Class clazz, String sql, Object[] param) {

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

try {

Field[] fields = clazz.getDeclaredFields();//实体类(POJO)的属性数组(Declared表示按照顺序)

conn = getConnection();

ps = conn.prepareStatement(sql);

for (int i = 0; i < param.length; i++) {

ps.setObject(i+1, param[i]);

}

rs = ps.executeQuery();

if (rs.next()) {

T entity = clazz.newInstance();//创建实例(给实体类分配内存)

ResultSetMetaData rsmd = rs.getMetaData();//获取数据库表的元数据信息

for (int i = 1; i <= rsmd.getColumnCount(); i++) {

String columnName = rsmd.getColumnName(i);//数据库表的字段名(按照顺序)

for (Field f : fields) {

if (columnName.equalsIgnoreCase(f.getName())) {

Object columnValue = rs.getObject(columnName);//根据属性名获取值

String methodName = setMethodName(f.getName());//实体的属性名首字母必须小写,获取get方法名

Method method = clazz.getMethod(methodName,f.getType());//根据get方法名和属性的类型返回get方法

method.invoke(entity, columnValue);//唤醒get方法(让get方法生效)

}

}

}

return entity;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

close(rs, ps, conn);

}

return null;

}

/**

* @todo 获取实体对象的列表,sql为sql语句字符串,param为sql中传的参数

* @return List

*/

public List getEntityList(Class clazz, String sql, Object[] param) {

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

List entities = new ArrayList();

try {

Field[] fields = clazz.getDeclaredFields();//bean属性的数组(按照顺序)

conn = getConnection();

ps = conn.prepareStatement(sql);

for (int i = 0; i < param.length; i++) {

ps.setObject(i+1, param[i]);

}

rs = ps.executeQuery();

while (rs.next()) {

T entity = clazz.newInstance();

ResultSetMetaData rsmd = rs.getMetaData();

for (int i = 1; i <= rsmd.getColumnCount(); i++) {

String columnName = rsmd.getColumnName(i);

for (Field f : fields) {

if (columnName.equalsIgnoreCase(f.getName())) {

Object columnValue = rs.getObject(columnName);

String methodName = setMethodName(f.getName());

Method method = clazz.getMethod(methodName,f.getType());//根据get方法名和属性的类型返回get方法

method.invoke(entity, columnValue);//唤醒get方法(让get方法生效)

}

}

}

entities.add(entity);

}

return entities;

} catch (Exception e) {

e.printStackTrace();

} finally {

close(rs, ps, conn);

}

return null;

}

}

封装jdbc让你轻松理解Java反射机制

标签:password   statement   目录结构   invoke   实例   技术分享   auto   ase   ret

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://www.cnblogs.com/zhzhair-coding/p/6937099.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值