封装ORM框架

使用JDBC封装ORM框架

只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有五种:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal。

JDBC怎么操作数据库?
1、加载驱动类
Class.forName(drivename);
2、建立连接
Connection conn = DriverManager.getConnection(url,username,password);
3、创建语句集
PreparedStatement pstm = conn.prepareStatement(sql);
4、执行
ResultSet rs = pstm.executeQuery();
5、获取结果集
while(rs.next()){
System.out.println(rs.getLong(“id”));
System.out.println(rs.getString(“name”));
}
6、关闭连接
rs.close();
pstm.close();
conn.close();

思考
1、没有mybatis是半自动ORM框架,需要程序员去关注SQL,且需要学配置文件(Mapping.xml)
2、Hibernate是全自动ORM框架,不需要程序员关注SQL
3、Spring JDBC是全手动,既需要程序员关注SQL,又需要去写配置文件
三者的优劣,灵活性Spring JDBC最高,mybatis次之;Hibernate开发效率最高,mybatis次之。在可以牺牲小部分灵活性,且对开发效率影响不大得前提下,mybatis成为了程序员的追捧之物。

如何封装
在JDBC操作操作数据库的步骤,你可以思考,1-2步的操作是固定的,3语句集也是必须的,4执行也是必要的操作,这几步都是不可避免的操作。而第五步获取处理结果集,我们可以将它封装成ORM,下面代码演示:

    List result = new ArrayList();//声明一个Object的list
    int len = rs.getMetaData().getColumnCount();//获取字段的总数
    while(rs.next()){
        Class clazz = Member.class;//找一个我们要匹配的实体类
        Object obj  = clazz.newInstance();//通过反射机制把实体类创建出来
        for (int i = 1;i <= len;i++){
            String columnName = rs.getMetaData().getColumnName(i);//获得字段名
            Field field = clazz.getDeclaredField(columnName);//获取实体类声明的字段
            field.setAccessible(true);//取消了Java的权限控制检查
            Object type = field.getType();//获得字段类型
            if (type == Integer.class){//类型判断,如果是int
                field.set(obj,rs.getInt(columnName));//往字段里塞值
            }else if (type == String.class){
                field.set(obj,rs.getString(columnName));
            }
        }
        result.add(obj);//将实体类添加到list
        System.out.println(JSON.toJSON(obj));//以json格式将实体类输出
    }
 
  

数据库表
数据库名:test 表名:user 字段如下:
在这里插入图片描述

完整代码如下

实体类:

package com.xxxxf.spring.jdbc;

public class User{

    Integer id ;
    String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

测试类:

package com.xxxxf.spring.jdbc;
import com.alibaba.fastjson.JSON;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class JdbcTest {

    public static void main(String[] args) throws Exception {
        //原生的JDBC如何操作

//        可以将1-2封装成了DataSource,放入了连接池,目的是为了提高程序的响应速度
        //1、加载驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2、建立连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");

        //3、创建语句集
        PreparedStatement pstm = conn.prepareStatement("select * from user");
        //4、执行
        ResultSet rs = pstm.executeQuery();

//        将5封装做成ORM的过程(Object relation Mapping对象关系映射)
//        自动变成我们显而易见的普通的我们写的java对象(实体类)
        //5、获取结果集

        int len = rs.getMetaData().getColumnCount();
        List<Object> result = new ArrayList<Object>();
        while(rs.next()){

            Class clazz = User.class;
            Object obj  = clazz.newInstance();
            for (int i = 1;i <= len;i++){
                String columnName = rs.getMetaData().getColumnName(i);
                Field field = clazz.getDeclaredField(columnName);
                field.setAccessible(true);
                Object type = field.getType();
                if (type == Integer.class){//类型判断
                    field.set(obj,rs.getInt(columnName));
                }else if (type == String.class){
                    field.set(obj,rs.getString(columnName));
                }
            }
//            System.out.println(rs.getLong("id"));
//            System.out.println(rs.getString("name"));
            result.add(obj);
            System.out.println(JSON.toJSON(obj));
        }
        //6、关闭连接
        rs.close();
        pstm.close();
        conn.close();
    }
}

到此为止,通过不到100行代码,我们封装了一个ORM框架,是不是很nice呢?后期我会通过Spring JDBC再封装一个类似Hibernate、mybatis的ORM框架

你可能感兴趣的:(封装框架)