反射实现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


0 0
原创粉丝点击