使用Java泛型和反射技术将Mysql记录集转换为Javabean集合

这篇博客介绍了如何利用Java的泛型和反射技术将MySQL查询结果集转换为JavaBean集合。通过创建Mysql操作类,实现了连接数据库、预编译SQL模板以及将查询结果自动映射到JavaBean对象的功能。博主强调了结果集的列名必须与JavaBean的属性名、数量和类型完全一致,并提供了详细的代码示例和操作步骤。
 

实现原理:
* 获取结果集的元数据,得到各列的列名称
* 使用反射,创建参数clazz的对象,调用对象与列名称相对应的所有的set方法
* 【注意】请确保结果集的列名称和Javabean的属性名称、个数和类型完全相同
* 如果属性名称和数据库字段名称不同,可以在sql查询语句中使用  AS 关键字为列起别名

代码,附我的Mysql操作类:

 
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
 * Mysql使SQl
 * Javabean
 * 
 * @author 
 * 
 */
public class Mysql {
    private static Mysql mysql;
    private Connection conn;
    private Statement stmt;
    private Map<String,PreparedStatement> pstmt;
    private Mysql() {
    }
    private Mysql(String url, String username, String password) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(url, username, password);
            stmt = conn.createStatement();
            pstmt = new HashMap<String, PreparedStatement>();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 使
     * 
     * @param mysql
     *            jdbc:mysql://localhost/table_name
     *            database_name
     * @param username
     *            mysqlroot
     * @param password
     *            mysql
     * @return 
     */
    public static synchronized Mysql getInstance(String url, String username,
            String password) {
        if (mysql == null) {
            mysql = new Mysql(url, username, password);
        }
        return mysql;
    }
    
    /**
     * sqlsqlmapkey
     * 
     * @param sql
     *            sql
     * @return sql
     */
    public void setPstmt(String key,String sql) {
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            pstmt.put(key, ps);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * mapsql使使
     * 使setPstmt()sql
     * 
     * @param stmt
     *            mapsqlkeysql
     * @param arr
     *            使
     * @return 
     */
    public ResultSet Query(String stmt, Object... arr) {
        try {
            for (Entry<String, PreparedStatement> en : this.pstmt.entrySet()) {
                if (en.getKey().equals(stmt)) {
                    PreparedStatement ps = en.getValue();
                    for (int i = 0; i < arr.length; i++) {
                        ps.setObject(i + 1, arr[i]);
                    }
                    return ps.executeQuery();
                }
            }
            return this.stmt.executeQuery(stmt);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * mapsql使使
     * 使setPstmt()sql
     * 
     * @param pstmt
     *            getPstmt()
     * @param arr
     *            Object
     * @return 
     */
    public int Update(String stmt, Object... arr) {
        try {
            for (Entry<String, PreparedStatement> en : this.pstmt.entrySet()) {
                if (en.getKey().equals(stmt)) {
                    PreparedStatement ps = en.getValue();
                    for (int i = 0; i < arr.length; i++) {
                        ps.setObject(i + 1, arr[i]);
                    }
                    return ps.executeUpdate();
                }
            }
            return this.stmt.executeUpdate(stmt);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }
    /**
     * mysql
     */
    public void close() {
        if (stmt != null) {
            try {
                stmt.close();
                stmt = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
                conn = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        mysql = null;
    }
    
    /**
     * 
     * getList()rsclose()
     * @param rs 
     */
    public static void showResult(ResultSet rs) {
        try {
            //
            ResultSetMetaData rsmd = rs.getMetaData();
            //
            int lie=rsmd.getColumnCount();
            //
            for (int i = 1; i <= lie; i++) {
                System.out.print(rsmd.getColumnName(i)+"\t");
            }
            System.out.println();
            //
            int hang =0;
            while (rs.next()) {
                hang++;
                //
                for (int x = 1; x <= lie; x++) {
                    System.out.print(rs.getString(x)+"\t");
                }
                System.out.println();
            }
            //
            System.out.println(lie+""+hang+"");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
     
    /**
     * Java
     * mysqlJavabeanList
     * 
     * 
     * 
     * 使clazzset
     * Javabean
     * sql使  AS 
     * showResult()rsclose()
     * 
     * @param rs Javabean
     * @param clazz JavabeanUser.class使
     *              class
     * @return JavabeanList
     */
    public static <T> List<T>  getList(ResultSet rs,Class<T> clazz) {
        List<T> al =null;
        try {
            ResultSetMetaData rsmd = rs.getMetaData();
            int lie=rsmd.getColumnCount();
            al = new ArrayList<T>();
            while (rs.next()) {
                T t = null;
                try {
                    t = clazz.newInstance();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                for (int j = 0; j < lie; j++) {
//              System.out.println("set"+rsmd.getColumnName(j+1)+""+rs.getObject(j+1));
                    invokeX(t, "set"+rsmd.getColumnName(j+1), rs.getObject(j+1));
                }
                al.add(t);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        return al;
    }
    
    /**
     * 
     * @param o 
     * @param name 
     * @param oo 使null
     * @return null
     */
    private static Object invokeX(Object o,String name,Object...oo) {
        Class clazz =o.getClass();
        Method[] mm=clazz.getDeclaredMethods();
        for (Method method : mm) {
            if (method.getName().equalsIgnoreCase(name)) {
                try {
                    return method.invoke(o, oo);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}
 使用了这个Mysql操作类,再写Dao层真是太简单了~

 
package com.kxrjkf.user.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.ResourceBundle;
import com.kxrjkf.user.dao.UserDao;
import com.kxrjkf.user.domin.User;
import com.kxrjkf.user.utils.Mysql;
public class UserDaoImpl implements UserDao {
    private static Mysql mysql = null;
    static {
        ResourceBundle rb = ResourceBundle.getBundle("config");
        mysql = Mysql.getInstance(rb.getString("url"),
                rb.getString("username"), rb.getString("password"));
        String biao = rb.getString("biao");
        
        // addsql
        mysql.setPstmt("addstmt""insert into " + biao + " VALUES(null,?,?,?) ;");
        
        // deletesql
        mysql.setPstmt("delstmt""DELETE FROM " + biao + " where id=? ;");
        
        // editsql
        mysql.setPstmt("upstmt""UPDATE " + biao
                + " SET name=?,phone=?,`like`=? where id=? ;");
        
        // findIdsql
        mysql.setPstmt("findIdstmt","select * from " + biao + " where id=? ;" );
        
        // getListsql
        mysql.setPstmt("liststmt""select * from " + biao + " ;");
        
        // getListsql
        mysql.setPstmt("fenyestmt","select * from " + biao + " limit ?,? ;" );
        
        // getZongsql
        mysql.setPstmt("zongstmt""select count(*) from " + biao + " ;");
    }
    /**
     * 
     * @param user 
     */
    public void add(User user) {
        mysql.Update("addstmt", user.getName(), user.getPhone(),
                user.getLike());
    }
    /**
     * 
     * @param id id
     */
    public void delete(int id) {
        mysql.Update("delstmt", id);
    }
    /**
     * 
     * @param id id
     * @param user 
     */
    public void update(int id, User user) {
        mysql.Update("upstmt", user.getName(), user.getPhone(),
                user.getLike(), id);
    }
    /**
     * id
     * @param id id
     * @return null
     */
    public User findId(int id) {
        List<User> u = mysql.getList(mysql.Query("findIdstmt", id),
                User.class);
        User user = null;
        if (u.size() != 0) {
            user = u.get(0);
        }
        return user;
    }
    /**
     * 
     * @return List
     */
    public List<User> getList() {
        return mysql.getList(mysql.Query("liststmt"), User.class);
    }
    /**
     * 
     * @param qishi 
     * @param tiaoshu 
     * @return 
     */
    public List<User> getList(int qishi, int tiaoshu) {
        return mysql.getList(mysql.Query("fenyestmt", qishi, tiaoshu),
                User.class);
    }
    /**
     * 
     * @return 
     */
    public int getZong() {
        
        ResultSet rs = mysql.Query("zongstmt");
        try {
            rs.next();
            return rs.getInt(1);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }
    //
//  public static void main(String[] args) {
//       new UserDaoImpl().add(new User("", "3333", ""));
//       new UserDaoImpl().delete(5);
        // new UserDaoImpl().update(1, new User("", "8888888", ""));
        // System.out.println(new UserDaoImpl().findId(3));
//       for (User u : new UserDaoImpl().getList(1,2)) {
//       System.out.println(u);
//       }
//      UserDaoImpl udi = new UserDaoImpl();
//      System.out.println(udi.getZong());
//  }
}
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值