反射实现JDBC封装
来源:互联网 发布:两个域名指向一个主机 编辑:程序博客网 时间:2024/04/29 05:36
对于hibernate虽然是开源的,但是在实际的使用中,有的开发者还是不愿意放心的使用,首先对于一般的开发者来说对Hibernate的代码量不能完全的解读,如果所做的项目会对Hibernate的代码进行修改,那能不能很快的修改呢?虽然说很大可能是不会修改Hibernate的源代码的,小弟我使用java的反射机制,使用JDBC封装了自己的Hibernate,实现的功能很简单,增加、删除、修改、查询,当然肯定是不能和Hibernate相比的,但是在项目中还是很好用哟。建议没有了解反射机制,可以了解下先。主要的是一个接口(BaseDao),一个基本接口实现(BaseDaoImpl)。
BaseDao的中的代码如下:
package dao;
public interface BaseDao {
public int save(Object o) throws Exception;
public int delete(Object o) throws Exception;
public int update(Object o,String whereStr) throws Exception;
public Object query(Object o) throws Exception;
}
BaseDaoImpl实现代码如下:
package dao.impl;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import dao.BaseDao;
public class BaseDaoImpl implements BaseDao {
public Connection connection() {
Connection connection = null;
try {
// System.out.println("init:"+init());
Class.forName("com.mysql.jdbc.Driver");// 加载mysq驱动
String url = "jdbc:mysql://localhost:3306/test?user=root&password=root&useUnicode=true&characterEncoding=gbk";
// String url=init();
try {
connection = DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
return connection;
}
public int save(Object o) throws Exception {
int reNumber = -1;
String sql = "";
Class<?> baseDao = o.getClass();
List<Object> params = new ArrayList<Object>();
Field[] fields = baseDao.getDeclaredFields();// 返回Field数组
for (int i = 0; i < fields.length; i++) {
Method m = (Method) o.getClass().getMethod(
"get" + getMethodName(fields[i].getName()));
Object val = m.invoke(o);// 调用get方法。
if (val != null) {
sql += fields[i].getName() + ",";
params.add(val);
}
}
if ((!sql.equals("")) && sql != "") {
sql = sql.substring(0, sql.length() - 1);
String table = o.getClass().getName();
String parasStr = "";
for (int i = 0; i < params.size(); i++) {
parasStr += "?,";
}
parasStr = parasStr.substring(0, parasStr.length() - 1);
sql = "insert into " + "t_"
+ table.substring(table.indexOf(".") + 1, table.length())
+ "(" + sql + ") values (" + parasStr + ")";
System.out.println(sql);
Connection conn = connection();
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < params.size(); i++) {
ps.setObject(i + 1, params.get(i));
}
reNumber=ps.executeUpdate();
close(conn, ps, null);
}
return reNumber;
}
public int delete(Object o) throws Exception {
int reNumber = -1;
String sql = "";
Class<?> baseDao = o.getClass();
List<Object> params = new ArrayList<Object>();
Field[] fields = baseDao.getDeclaredFields();// 返回Field数组
for (int i = 0; i < fields.length; i++) {
Method m = (Method) o.getClass().getMethod(
"get" + getMethodName(fields[i].getName()));
Object val = m.invoke(o);// 调用get方法。
if (val != null) {
sql += fields[i].getName() + "=?,";
params.add(val);
}
}
if ((!sql.equals("")) && sql != "") {
sql = sql.substring(0, sql.length() - 1);
String table = o.getClass().getName();
sql = "delete from " + "t_"
+ table.substring(table.indexOf(".") + 1, table.length())
+ " where " + sql ;
System.out.println(sql);
Connection conn = connection();
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < params.size(); i++) {
ps.setObject(i + 1, params.get(i));
}
reNumber=ps.executeUpdate();
close(conn, ps, null);
}
return reNumber;
}
public int update(Object o,String whereStr) throws Exception {
int reNumber = -1;
String sql = "";
Class<?> baseDao = o.getClass();
List<Object> params = new ArrayList<Object>();
Field[] fields = baseDao.getDeclaredFields();// 返回Field数组
for (int i = 0; i < fields.length; i++) {
Method m = (Method) o.getClass().getMethod(
"get" + getMethodName(fields[i].getName()));
Object val = m.invoke(o);// 调用get方法。
if (val != null) {
sql += fields[i].getName() + "=?,";
params.add(val);
}
}
if ((!sql.equals("")) && sql != "") {
sql = sql.substring(0, sql.length() - 1);
String table = o.getClass().getName();
sql = "update " + "t_"
+ table.substring(table.indexOf(".") + 1, table.length())
+ " set " + sql +" where "+whereStr;
System.out.println(sql);
Connection conn = connection();
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < params.size(); i++) {
ps.setObject(i + 1, params.get(i));
}
reNumber=ps.executeUpdate();
close(conn, ps, null);
}
return reNumber;
}
public Object query(Object o) throws Exception {
String sql = "";
String queryString="";
Class<?> baseDao = o.getClass();
List<Object> params = new ArrayList<Object>();
Field[] fields = baseDao.getDeclaredFields();// 返回Field数组
for (int i = 0; i < fields.length; i++) {
Method m = (Method) o.getClass().getMethod(
"get" + getMethodName(fields[i].getName()));
Object val = m.invoke(o);// 调用get方法。
queryString+=fields[i].getName()+",";
if (val != null) {
sql += fields[i].getName() + "=?,";
params.add(val);
}
}
if ((!sql.equals("")) && sql != "") {
sql = sql.substring(0, sql.length() - 1);
queryString=queryString.substring(0,queryString.length()-1);
String table = o.getClass().getName();
sql = "select " +queryString+ " from t_"
+ table.substring(table.indexOf(".") + 1, table.length())
+ " where "+sql ;
System.out.println(sql);
Connection conn = connection();
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < params.size(); i++) {
ps.setObject(i + 1, params.get(i));
}
ResultSet rs=ps.executeQuery();
while(rs.next()){
for (int i = 0; i < fields.length; i++) {
Method m = (Method) o.getClass().getMethod(
"set" + getMethodName(fields[i].getName()),fields[i].getType());
m.invoke(o,rs.getObject(fields[i].getName()));// 调用get方法。
}
}
close(conn, ps, rs);
}
return o;
}
// 把一个字符串的第一个字母大写、效率是最高的
private static String getMethodName(String fildeName) throws Exception {
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
public void close(Connection conn, PreparedStatement ps, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
}
}
现在介绍下怎样使用这个基本的接口方法,首先在数据库中建立一张表:
在项目中bean类:
package bean;
public class User {
private Integer id;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String password;
}
然后写UserDao接口:
package dao;
public interface UserDao extends BaseDao {
}
实现UserDao接口UserDaoImpl,UserDaoImpl中的save、delete、query、update是固定的所有实现类都这样写
package dao.impl;
import bean.User;
import dao.UserDao;
public class UserDaoImpl implements UserDao {
@Override
public int save(Object o) throws Exception {
new BaseDaoImpl().save(o);
return 0;
}
@Override
public int delete(Object o) throws Exception {
return new BaseDaoImpl().delete(o);
}
@Override
public int update(Object o,String whereStr) throws Exception {
return new BaseDaoImpl().update(o,whereStr);
}
@Override
public Object query(Object o) throws Exception {
return new BaseDaoImpl().query(o);
}
public static void main(String[] args) throws Exception{
User u=new User();
UserDaoImpl user=new UserDaoImpl();
u.setUsername("111");
u.setPassword("222");
user.save(u);
}
}
这样可以测试保存方法了。
http://files.cnblogs.com/sunwubin/test0300_.zip 实现代码
原文地址:http://www.cnblogs.com/sunwubin/p/3187603.html
- 反射实现JDBC封装
- 反射封装JDBC——hibernate DDL 实现原理
- 使用反射技术封装JDBC
- 运用反射机制的JDBC封装
- jdbc中查询封装——反射
- 反射实现适配器的封装
- Java jdbc 封装反射类(仅有增删改)
- JDBC:利用反射封装增删改查操作
- 反射实现JDBC表单访问万能类
- 利用反射,实现类的封装
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- jdbc 反射
- JDBC封装
- jdbc 封装
- JDBC封装
- Win32DLL,MFC常规DLL和MFC拓展DLL 的简单学习总结
- IIS发生意外错误0x8ffe2740
- EXCEL:为一个EXCEL文件创建多个工作表
- DEVICE_ATTR的使用
- vim 编辑 运行 shell 文件
- 反射实现JDBC封装
- 格雷戈里T.豪根的《有效的工作分解结构》免费阅读
- Android实战技巧:多线程AsyncTask(版本不同,有点差异)
- 加载rt3070sta.ko出现insmod: can't insert 'rt3070sta.ko': invalid module format问题
- POJ 1815 Friendship 最小割
- Android中OnkeyDown事件和OnBackPressed方法区别、兼容、使用
- Nginx学习(12)—核心结构(1)
- 学习计划
- 深入理解全局编录服务器GC