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