jdbc玩出hibernate的感觉Word格式文档下载.docx
《jdbc玩出hibernate的感觉Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《jdbc玩出hibernate的感觉Word格式文档下载.docx(17页珍藏版)》请在冰点文库上搜索。
![jdbc玩出hibernate的感觉Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/8d632292-bb45-44cc-92b1-34d167b125d4/8d632292-bb45-44cc-92b1-34d167b125d41.gif)
class="
identity"
/>
9.
/id>
10.
/class>
11.
com.uniits.privilege.dao.entity.UserEntity"
12.
userId"
13.
14.
15.
16.
com.uniits.privilege.dao.entity.FunctionEntity"
17.
functionId"
18.
19.
20.
21.<
/jdbc-mapping>
2.在项目启动时,加载所有的实体类并与配置文件jdbc.hbm.xml进行比对,判断jdbc.hbm.xml中定义的类、属性、类型在每一个实体类中是否存在
1.
private
static
final
Log
log
=
LogFactory.getLog(ValidConfig.class);
2.
3.private
String
ELEMENT_NODE_CLASS
"
class"
;
5.private
ELEMENT_NODE_ID
id"
7.private
ELEMENT_ATTR_NAME
name"
9.private
ELEMENT_ATTR_PRIMITIVE
type"
11.private
ELEMENT_NODE_GENERATOR
generator"
13.private
ELEMENT_ATTR_GENERATOR
15.private
ValidConfig(){
17.}
19./**
*
加在jdbc.hbm.xml配置文件并解析
21.
22.
@throws
AppException
23.
*/
24.public
void
loadXml(String
path)
throws
{
25.
//
加在XML所在路径
26.
XMLFactory
factory
XMLFactory.getInstance(path);
27.
获取根元素下的子节点
28.
Element
rootElement
factory.getRootElement();
29.
获取节点集合
30.
List<
Element>
eles
rootElement.elements(ELEMENT_NODE_CLASS);
31.
try
32.
iteratorNodes(eles);
33.
}
catch
(Exception
e)
34.
throw
new
AppException(e);
35.
36.}
37.
38./**
39.
遍历所有节点
40.
@param
elements
41.
Exception
42.
43.public
iteratorNodes(List<
elements)
Exception{
44.
if(elements.isEmpty()){
45.
return
46.
47.
for
(Element
ele
:
48.
clazz
ele.attributeValue(ELEMENT_ATTR_NAME);
49.
eleId
ele.element(ELEMENT_NODE_ID);
50.
pk
eleId.attributeValue(ELEMENT_ATTR_NAME);
51.
type
eleId.attributeValue(ELEMENT_ATTR_PRIMITIVE);
52.
53.
验证节点信息
54.
Object
clazzInstance
validInfo(clazz,
pk,
type);
55.
56.
遍历到element的generator节点并获取其指定的主键生成方式
57.
eleId.element(ELEMENT_NODE_GENERATOR);
58.
generator_class
generator.attributeValue(ELEMENT_ATTR_GENERATOR);
59.
XMLElementEntity
entity
XMLElementEntity();
60.
entity.setClazzName(clazzInstance);
61.
entity.setGenerator(generator_class);
62.
entity.setPkName(pk);
63.
entity.setPrimitive(type);
64.
以类名称做为KEY
,保存对象信息
65.
Constants.entityInfo.put(clazzInstance,
entity);
66.
67.
68.
69.
70.}
71.
72./**
73.
验证配置文件信息是否正确
74.
定义的类、属性及数据类型是否正确
75.
76.
primaryKey
77.
78.
@return
79.
80.
81.public
validInfo(String
clazz,
primaryKey,
type)
82.
83.
Class.forName(clazz).newInstance();
84.
valid
Fields
85.
if
(!
validField(clazzInstance,
type))
86.
AppException("
[jdbc.hbm.xml]
can'
t
cast
fieldType
with
+
+"
in
clazz);
87.
88.
split("
@"
)
:
class@十进制哈希值,取类名
89.
clazzInstance.toString().split("
)[0];
90.
(ClassNotFoundException
91.
find
92.
93.}
94.
95./**
96.
验证属性
97.
比对类中的元素所对应的数据类型是否与jdbc.hbm.xml配置文件中所对应的数据类型一致
98.
99.
100.
101.
102.
103.
104.public
boolean
validField(Object
primitivType)
105.
106.
在当前指定类中查找相应属性
【以下必须传一个已经实例化的对象,才能查询类中的所有
属性】
107.
Field
field
clazz.getClass().getDeclaredField(primaryKey);
108.
获取元素数据类型
109.
MethodUtil.changeWrapClass(field.getType());
110.
(primitivType.equals(fieldType))
111.
true;
112.
113.
(NoSuchFieldException
114.
115.
116.
false;
117.}
3.封装baseDAO,进行统一操作,此处就摘取部分操作对象的代码
当需要保存一个实体对象的时
1.public
int
executeUpdate(String
sql,
entity)
验证基本数据类型
(MethodUtil.isWrapClass(entity.getClass()))
executeUpdate(sql,
Object[]
});
result
0;
pstm
null;
this.conn
ConnectionManager.getInstance().getConnection();
getPreparedStatementViaEntity(this.conn,
pstm.executeUpdate();
e;
finally
closeConnection();
result;
这里首先会判断参数entity是否是一个基本数据类型还是常用的数据类型,比如String,Date等
当传递参数的时候可能只有一个参数,比如id,而这个id可能是基本数据类型,也可能是常用数据类型所以要在这做一个判断,如果不是常用数据类型则当实体类
当entity是一个常用数据类型的时候,调用另一个方法
params)
conn
getPreparedStatementViaParams(conn,
params);
13.}
这里就直接对sql语句中带有的?
进行了赋值操作
1.pstm
这一步获取PrepareStatement对象,通过名字可以看出此处要操作的对象是实体类,而不是普通的参数数组
PreparedStatement
getPreparedStatementViaEntity(Connection
conn,
(null
conn)
conn;
conn.prepareStatement(sql);
Object>
params
ReflectUtil.reflectEntity(entity);
size
params.size();
(int
i
size;
i++)
pstm.setObject(i
1,
params.get(i));
pstm;
代码中ReflectUtil.reflectEntity(entity)是反射一个实体类,主要是获取类中的属性,进行赋值操作
把ReflectUtil的完整代码贴出来
1./**
运用反射机制获取实体类中所对应的属性信息
[in]
属性信息
public
reflectEntity(Object
获得实体类的所有属性
Field[]
fields
entity.getClass().getDeclaredFields();
获取当天类对应的配置文件实体信息
getClassName(entity);
获取当前类主键
clazz.getPkName();
获取主键生成方式
clazz.getGenerator();
iteratorFields(fields,
entity,
generator);
24.
params;
Method
getMethod(Object
parameterType,
fieldName)
NoSuchMethodException
method
methodName
("
boolean"
.equals(parameterType.toString()))
getMethodName(fieldName,
Constants.BOOLEAN_METHOD);
else
Constants.GET_METHOD);
36.
entity.getClass().getMethod(methodName);
38.
(SecurityException
(NoSuchMethodException
43.
method;
/**
根据类型获取方法名
注释:
set为setXX()方法、get为getXX()方法、is则因为基本数据类型为boolean的时候,isXX()代替getXX()
fileName
名称
获取方法类型(set
or
get
is)
getMethodName(final
fileName,
type){
fileName.substring(0,
1).t