手写ORM

ORM原理

对象-关系映射(Object/Relation Mapping,简称ORM),日常开发中我们都在用的比如Hibernate,Mybatis。
废话不多说,直接上代码

1、建表
在这里插入图片描述
2、建实体对应上表

public class TsRole {
	private String id ;
	private String code ;
	private String createTime ;
	private String name ;
	private String note ;
	private String operUsername ;
	//自行补充set/get
}

3、建数据库连接

//获取数据库连接
public class GetConnection {

    private static final String driverClassName = "com.mysql.jdbc.Driver";

    public static Connection getConnect(){
        Connection connection = null;
        String url = "";
        // 用户名和密码
        String username = "";
        String password = "";
        try {
            Class.forName(driverClassName);
            connection = DriverManager.getConnection(url,username,password);
        }catch (Exception e){
            e.printStackTrace();
        }
        return connection;
    }
}

4、查询操作

public interface QueryRunner {
	//此处只是提供了一个查询列表的接口做demo
    <T> List<T> queryAsList(String sql, Class<T> t);
}

上面接口的实现

public class QueryRunnerImpl implements QueryRunner {

    @Override
    public <T> List<T> queryAsList(String sql, Class<T> t) {
        Connection connection = GetConnection.getConnect();
        Field[] fields = t.getDeclaredFields(); //对象所有的属性
        List<T> list = new ArrayList<>();//用于存储返回结果
        try {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                Object object = t.newInstance();
                for (Field field : fields) {
                    field.setAccessible(true);
                    /**
                     * 下面对数据库中的字段和实体对象的属性做了映射,
                     * 实体属性是驼峰格式,表字段aa_bb格式,做匹配   
                     */
                    Object value = resultSet.getObject(field.getName().replaceAll("[A-Z]", "_$0").toLowerCase());
                    field.set(object, value);//给对象的属性赋值
                }
                list.add((T) object);
            }
            connection.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }
}

最后做一个测试

public class Test {

    public static void main(String[] args) {
        String sql = "select * from ts_role";
        List<TsRole> list = new QueryRunnerImpl().queryAsList(sql,TsRole.class);
        for (TsRole tsRole:list){
            System.out.println(tsRole.toString());
        }
    }
}

结果
在这里插入图片描述
总结:
我们通过反射把数据库中的字段与数据字段对应起来,对应规则可以自己定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值