对于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