ORM原则

本文介绍了ORM的概念,如何通过ParameterMetaData、ResultSetMetaData和BeanInfo实现参数个数校验、字段映射和bean属性获取。通过实例演示了JDBC操作的封装,提升开发效率。
摘要由CSDN通过智能技术生成

1、ORM: 对象关系映射

        指的让关系型数据库中的表与项目中的javaBean类进行映射.

目的: 封装了原始的jdbc操作数据库的细节,使用起来更加简单方便.

2、ORM原则:

        1.执行sql语句时,需要知道sql语句的参数个数,也就是?有几个,

        通过参数元数据对象获取

        2. 表中的字段名称,,以及表中的字段类型,通过结果集元数据对象获取

        映射关系(表中的字段-----bean中的属性)

        3.javaBean类里面的属性名称和属性类型
        通过内省机制获取
        映射关系(bean中的属性----表中的字段)

3、主要API

        3.1、ParameterMetaData:参数元数据对象,通过预编译对象PreparedStatemnet.getParameterMapData()获取

                主要方法

                  getParameterCount():统计sql语句问号的个数

        3.2、ResultSetMetaData 结果集元数据对象 ,通过ResultSet.getMetaData();获取

                主要方法

                        getColumnName(int index):获取字段名称
                        getColumnTypeName(i):获取字段类型名称
                        getColumnClassName(i):获取字段所属的类

         3.3、BeanInfo 获取ean的描述信息,通过Introspector.getBeanInfo(User.class);获取。

                主要方法

                getPropertyDescriptors():获取描述器对象
        3.4、PropertyDescriptor 描述器对象

                主要方法

               getName():获取bean属性名称

                getWriteMethod():获取写方法

                getWriteMethod().getName():获取方法名

                getPropertyType();:获取字节码对象

                注意:class属性没有set方法

        

测设类

package lession1;

import com.sun.xml.internal.txw2.TXW;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import utils.JDBCUtils2;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.*;

public class Demo1 {
    @Test
    public void testX2222(){
        Son s = new Son();
        User u =(User)s;
    }
    //1.定义资源对象
    Connection con= null;
    PreparedStatement stmt =null;
    ResultSet rs = null;
    @Before
    public void testBefore(){
        con= JDBCUtils2.getCon();
    }
    /**
     * 参数的元数据对象,获取sql语句参数个数(?)
     *  PreparedStatement获取参数的元数据对象.
     *  作用: 校验sql语句, 执行sql.
     */
    @Test
    public void testX() throws Exception{
        String sql = "select * from tab_user where uid=?";
        stmt = con.prepareStatement(sql);//预编译对象包含sql
        ParameterMetaData pd= stmt.getParameterMetaData();//参数的元数据对象
        int parameterCount = pd.getParameterCount();//参数的个数
        System.out.println(parameterCount);
    }

    /***
     * 通过结果集元数据对象获取字段的名称,字段的类型,列的总数
     * 结果集元数据对象: 通过结果集获取
     */
    @Test
    public void testX2() throws Exception{
        String sql = "select * from tab_user";
        stmt = con.prepareStatement(sql);//预编译对象包含sql
        rs = stmt.executeQuery();//结果集
        ResultSetMetaData metaData = rs.getMetaData();//结果集元数据对象
        int columnCount = metaData.getColumnCount();//获取多少列
        System.out.println("总的列数:"+columnCount);
        //遍历结果集: 获取字段名称,字段类型
        while(rs.next()){//跳转到下一行
         //遍历列的函数: 遍历每一行的字段和字段类型,以及获取字段的值
            for (int i = 1; i <=columnCount ; i++) {
                String columnName = metaData.getColumnName(i);
                System.out.print("字段名称:"+columnName);
                String type1 = metaData.getColumnTypeName(i);
                String type2 = metaData.getColumnClassName(i);
                System.out.println(", 类型:"+type1+", "+type2);
            }
            System.out.println();
        }

    }
    @Test
    public void testX3() throws Exception{//Information
        //1.获取user这个bean的描述信息:info, 包含User类里面的所有信息
        BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
        //2.获取bean的属性名称,以及属性对应的读/写方法
        PropertyDescriptor[] pd = beanInfo.getPropertyDescriptors();
        //3.bean的属性名称, bean的类型
        for (PropertyDescriptor p : pd) {
            String name = p.getName();//user类的:属性名称
            String methodName=null;
            if(!name.equalsIgnoreCase("class")){
               Method wm= p.getWriteMethod();//set写方法
                methodName = wm.getName();
            }
            Class clz =  p.getPropertyType();
            String simpleName = clz.getSimpleName();//.String
            System.out.println("属性名称: "+name+",类型:"+simpleName+",写方法:"+methodName);
        }
    }
    @After
    public void closeResources(){
        JDBCUtils2.closeResources(rs,stmt,con);
    }
}

 Bean对象

package lession1;

import java.io.Serializable;

public class User implements Serializable {
    private String uid;
    private String username;
    private String password;
    private String address;

    public User(){
    }

    public String getUid(){
        return uid;
    }

    public void setUid(String uid){
        this.uid = uid;
    }

    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;
    }

    public String getAddress(){
        return address;
    }

    public void setAddress(String address){
        this.address = address;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值