模拟实现MyBites中通过SQL反射实体类对象功能

话不多说,直接上干货!

package cn.test;

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.Timestamp;

import org.junit.Test;

import cn.core.domain.User;

public class UseMyBites {

    /**
     * 模拟MyBites根据sql动态创建对象.
     * @throws Exception
     */
    @Test
    public void simulation() throws Exception{
        //className应该是传参或者是读取配置文件读出来的一个指定类型,这里为了测试直接先写死了。
        String className="cn.core.domain.User";
        //加载驱动,下面是jdbc的一段代码
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn=DriverManager.getConnection("jdbc:mysql://192.168.1.68/base", "root", "root");
        String sql="select * from base_user where user_id=?";
        PreparedStatement ps=conn.prepareStatement(sql);
        ps.setString(1, "00a8ea6b8b524205bc0af1c3249abe54");
        ResultSet rs=ps.executeQuery();
        //循环获取每行数据
        while (rs.next()) {
            //每一行就表示一个对象,通过反射将实体类创建出来
            Object object=Class.forName(className).newInstance();
            //通过ResultSetMetaData这个对象获取查询语句的原始列名,列总数以及列的类型
            ResultSetMetaData data=rs.getMetaData();
            //获取列总数
            int count=data.getColumnCount();
            //循环得到列名和列类型
            for (int i = 1; i <= count; i++) {
                String column=data.getColumnName(i);//获取列名
                String typeName=data.getColumnTypeName(i);//获取列类型
                String setMethodName=bulidSetMethod(column);//获取具体实体类中的set方法名
                //根据列类型去获取列数据,具体参考数据库的类型将和rs.getXXX对应上去取值即可
                if("VARCHAR".equals(typeName)){
                    String value=rs.getString(column);//取值
                    //通过方法名进行反射得到具体的方法对象
                    Method method=object.getClass().getMethod(setMethodName,String.class);
                    //执行这个方法并对应的字段去赋值
                    method.invoke(object, value);
                }else if("DATETIME".equals(typeName)){//操作同上,只不过类型换成了时间类型
                    Timestamp value=rs.getTimestamp(column);
                    Method method=object.getClass().getMethod(setMethodName,Timestamp.class);
                    method.invoke(object, value);
                }
                //将数据库的类型都列出来,剩余的和上述差不多就不一一写出来了....
            }
            //下面这块就到了我们实际运用的过程了   这块可以根据业务需要 返回会单个object或者是list
            User user=(User)object;
            System.out.println(user);
        }

    }

    /**
     * 将列名转换成对应的set方法名.
     * @param columnName 列名
     * @return set方法名
     */
    public String bulidSetMethod(String columnName){
        String c1="set";
        String c2=columnName.substring(0,1).toUpperCase();
        String c3=columnName.substring(1);
        return c1+c2+c3;
    }

}

OK,java中所有的持久化框架底层全是jdbc去实现的,那么通过jdbc模拟一个MyBites主要是通过java反射的机制去实现的,通过反射sql的列名得到具体的set方法名,通过执行set方法给字段注入具体的值,所以框架本身并不难,只要想通了其中的点,其实实现起来也就几行代码而已。

时间: 2024-11-07 08:41:56

模拟实现MyBites中通过SQL反射实体类对象功能的相关文章

NSDictionary转化为实体类对象

方法一: 使用objective-c NSObject自带的方法 setValuesForKeysWithDictionary:dict 作用是: 如果NSDictionary中的key和实体类对象的属性名相同,  那么把该key的value 设置到实体类对应的属性 - (instancetype)initWithDict:(NSDictionary *)dict { if (self = [super init]) { [self setValuesForKeysWithDictionary:

LINQ to SQL 建立实体类

使用LINQ to SQL时,需要首先建立用于映射数据库对象的模型,也就是实体类.在运行时,LINQ to SQL 根据LINQ表达式或查询运算符生成SQL语句,发送到数据库进行操作.数据库返回后,LINQ to SQL负责将结果转换成实体类对象. 建立实体类的方法有很多,例如LINQ to SQL设计器,手动编码建立,使用XML文件映射,使用命令行工具SqlMetal生成等.其中最方便的就是LINQ to SQL设计器. 1.使用LINQ to SQL设计器建立实体类 在一个示例用的Demo控

LINQ to SQL 建立实体类 (转)

http://www.cnblogs.com/DebugLZQ/archive/2012/11/14/2770449.html 使用LINQ to SQL时,需要首先建立用于映射数据库对象的模型,也就是实体类.在运行时,LINQ to SQL 根据LINQ表达式或查询运算符生成SQL语句,发送到数据库进行操作.数据库返回后,LINQ to SQL负责将结果转换成实体类对象. 建立实体类的方法有很多,例如LINQ to SQL设计器,手动编码建立,使用XML文件映射,使用命令行工具SqlMetal

mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_只能标签

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.cnsdhzzl.dao.StudentDao&q

KO ------- 表中字段名和实体类属性名不一致

-----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就会为空 (一)问题复现 1.先创建数据库 mybatis_db, 再创建表 t_user,并插入若干数据 注意:user_id 为主键,且为自动增长 2.创建实体类 User.java: package com.siwuxie095.entity; // 实体类 public class User

eclipse从数据库逆向生成Hibernate实体类(eclipse中反向生成hibernate实体类+jpa注释)

eclipse从数据库逆向生成Hibernate实体类 做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再"自己"建立一变VO.意思是,在项目设计时,要么根据需求分析建立实体类,由正向生成数据库表:要么就先进行数据库表设计,再逆向生成实体类.没有说进行完任意一方的设计后再去花时间去自己匹配建立另一方的设计. 原因是: 1. 1.5倍工作量,浪费时间.(时间对公司来说很重要) 2. 无法

数据库中信息存放到 实体类中

把数据库中信息存放到 实体类中,实体类设置值 Tb_pay tb_pay = payDAO.find(userid,Integer.parseInt(strno)); txtMoney.setText(String.valueOf(tb_pay.getMoney()));// 显示金额 txtTime.setText(tb_pay.getTime());// 显示时间 spType.setSelection(tb_pay.getType()-1);// 显示类别 txtHA.setText(tb

idea中如何快速创建实体类

在idea中创建实体类可以不从src下直接创建,而是直接从db中直接生成实体类. 真实开发中创建多个实体类,就不用一个个的去创建了,直接导入自动生成,多说无益,直接上图 1.选中右侧Datebase选项 2.选中加号 点击Data Source   选择你使用的数据库 3.输入你要导入实体类的数据库名称以及用户名和密码,点击MySQL 4.选择Download ver.5.1.40 开始下载 5.加载成功后,会出现你选择数据库中的所有表 6.选择需要导入的实体类 7.选择导入到项目中的位置 8.

JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法

原文:JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法 在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法. 这2种方式都可以实现不用persistence.xml文件,免去每个Entity都要在persistence.xml文件中配置的烦恼,但是这种方式Entity实体类的主键字段注解@ID要放到 getXXX()方法上,否则不认. 方式1: 修改