我们用原生的jdbc写代码时非常的繁琐,让我们先回顾原生的jdbc吧
1.加载驱动
方式一class.forName("oracle.jdbc.driver.OracleDrivaer")
方式二 DriverManager.registerDriver(new OracleDrivaer());
方式三 当jdk1.6 jdbc4.0会自动注册驱动类
2,建立连接
方式一Connection conn = DriverManager.getConnection
(JDBC_URL, USERNAME, PASSWORD);
String sql="SELECT * FROM EMP ";
方式二使用db.properties文件 Properties类的load方法加载
方式三 使用c3p0连接池 ComboPooledDataSource类 和c3p0-config.xml文件
3.创建prepareStatement对象
ps = conn.prepareStatement(sql);
4.执行sql语句
ps.setInt(1,strart);
rs = ps.executeQuery();
5,处理结果集
while(rs.next()){}
以及流的关闭....
回顾完毕,进入正题.下面是我完全版的封装,只要传入对象即可
封装一个简单的插入功能
public <T> boolean save(T entity) {//接口实现save方法返回Boolean值,传入一个对象即可
PreparedStatement ps=null;
Connection conn=null;
//使用StringBuffer对sql语句进行拼接
StringBuffer sb=new StringBuffer("INSERT INTO ");
//得到反射对象
Class<?> cls = entity.getClass();
//得到sql的表名(这种封装必须表名和类名一致,属性名和列名一致)
String name = cls.getSimpleName();
//得到所有列名
Field[] fields = cls.getDeclaredFields();
sb.append(name).append(" (");
for (int i = 0; i < fields.length; i++) {
sb.append(fields[i].getName()).append(",");
}
//这里我是使用oracle数据库使用序列S_TEST_ID.nextval,如果使用mysql id不用插入
//只要把上面的i=0,改成i=1,下面S_TEST_ID.nextval去掉即可
sb.replace(sb.length()-1,sb.length(),")").append(" VALUES (S_TEST_ID.nextval,");
for (int i = 0; i <fields.length-1 ; i++) {
if(i==fields.length-2){
sb.append("?)");
}else{
sb.append("?,");
}
}
//拼接完毕得到得到sql语句
String sql = sb.toString();
try {
//使用自己封装的工具类来得到连接
conn=DBUtil.getConn();
//执行sql语句
ps = conn.prepareStatement(sql);
for (int i = 1; i < fields.length; i++) {
//打破访问权限
fields[i].setAccessible(true);
//对占位符进行赋值
//fields[i].get(entity)得到对象的值
ps.setObject(i,fields[i].get(entity));
}
int i = ps.executeUpdate();
//判断是否插入成功
if(i>0){
return true;
}
} catch (SQLException | IllegalAccessException e) {
e.printStackTrace();
}
return false;
}
封装一个简单的查找功能
while(rs.next()){
//实例化对象
T t = cls.newInstance();
for (Field field : fields) {
//打破访问权限
field.setAccessible(true);
//得到结果 oracle有类型转换问题,mysql没有
Object values = rs.getObject(field.getName());
//如果使用mysql
field.set(t,values);
//针对oracle类型转换
changeType(field,t,values);
}
private <T> void changeType(Field field, T t, Object values) throws IllegalAccessException {
String str = values.toString();
String name = field.getType().getName();
if(name.equals("java.lang.String")){
field.set(t,str);
}else if(name.equals("java.lang.Integer")){
field.set(t,Integer.parseInt(str));
}else if(name.equals("java.lang.Double")){
field.set(t,Double.parseDouble(str));
}
}
本人mysql 和oracle测试都是没问题的,希望我的分享对大家有帮助,只要能熟悉的理解反射机制那么其实都不难
Object | **get**(Object obj) 返回指定对象上此 Field 表示的字段的值。 |
---|---|
void | **set**(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。 |
---|---|