Hibernate
ORM - Object Relation Mapping 对象关系映射
Object对象,Java语言 是面向对象的,程序中操作的都是对象
Relation关系,使用主流数据库是关系型数据库
Mapping映射, 将对象与关系通过映射 联系起来
映射操作将在hibernate中实现
通过hibernate提供的API操作对象,由hibernate实现对关系的操作
安装Hibernate环境
1. jar: hibernate3.jar,lib/required目录下的jar
2. O: 封装Java中的对象,com.entity.User实体类
3. R: 创建测试数据库hibernate,测试数据库表user_tbl
4. *M: 配置映射关系,两种方式:1)xml 2)annotation注解
在User类中使用注解配置映射关系
使用的注解在javax.persistence包
@Entity 写在类声明的上方,表示为实体类
@Table 当前实体类所映射的数据库表
在属性的getter方法上,配置属性与字段的映射
@Id 声明为主键
@Column 配置字段的映射
@GenericGenerator 配置字段值的生成器
@GeneratedValue 配置字段值 生成的值 对应使用的策略
5. hibernate环境配置
添加hibernate.cfg.xml配置文件到src目录
配置property、mapping标签
6. *编写测试类,测试CRUD
1) 加载hibernate配置文件 Configuration
2) buildSessionFactory SessionFactory
3) openSession Session
4) CRUD (session: save()、get()|load()、update()、delete())
Transaction
5) close
Query + HQL查询
hql占位符采用 冒号+参数名 形式,如 :name
JUnit测试
编写一个类,继承TestCase
编写测试方法,方法名以test开头 或 方法添加@Test注解,使用assertXxx测试结果
User模块
实体 User类,添加Hibernate映射注解
UserDAO类,不处理业务逻辑,只负责数据相关的操作
请求
->UserAction类
->接受请求数据
->调用业务层代码 UserService,实现业务逻辑
->调用DAO操作数据
->业务层返回业务逻辑结果给Action
->生成相应结果
->响应
新建web工程 sh
搭建环境struts2,hibernate
com.entity.User
private String id;
private String username;
private String password;
com.user.action.UserAction
private User user;
public String reg();
com.user.service.UserService
public int reg(User user); // 1-注册成功,0-注册失败,2-用户名无效,3-密码无效,4-用户名已存在,5-...
com.user.dao.UserDAO
public void addUser(User user); // 向数据库添加user记录
public User queryByUsername(String username); // 精确查询,非like
com.util.HibernateUtil
index.jsp
-> 链接跳转 /user/reg.action
-> /WEB-INF/user/reg.jsp(注册表单)
-> 表单post提交 /user/userreg.action
-> UserAction reg()
调用 UserService reg()
调用 UserDAO addUser()
-> "regSuccess"|"regError"
-> /WEB-INF/user/regSuccess.jsp | /WEB-INF/user/reg.jsp
新建java工程,名为xml
使用dom4j实现 读取xml文件内容
1. 拷贝struts.xml文件到工程的src目录下
2. 编写com.xml.XmlTester类
2.1) public void readXml()
读取 所有package标签的name、namespace属性值
读取 package下的所有action标签的 name、class、method属性值
读取 action下的所有result标签的 name属性值 及 标签内容
<package name="default" namespace="/" extends="struts-default">
</package>
<package name="user" namespace="/user" extends="struts-default">
<action name="user*" class="com.user.action.UserAction" method="{1}">
<result name="regSuccess">/WEB-INF/user/regSuccess.jsp</result>
<result name="regError">/WEB-INF/user/reg.jsp</result>
</action>
<action name="*">
<result>/WEB-INF/user/{1}.jsp</result>
</action>
</package>
控制台输出格式如下:
Package : name = xxx, namespace = xxx, extends = xxx \r\n
Action : name = xxx, class = xxx, method = xxx \r\n (如果没有class、method,则不显示)
Result : name = xxx, value = xxx \r\n (如果没有name,则不显示)
Result : name = xxx, value = xxx \r\n (如果没有name,则不显示)
Action : name = xxx, class = xxx, method = xxx \r\n (如果没有class、method,则不显示)
Result : name = xxx, value = xxx \r\n (如果没有name,则不显示)
Result : name = xxx, value = xxx \r\n (如果没有name,则不显示)
Package : name = xxx, namespace = xxx, extends = xxx \r\n
Action : name = xxx, class = xxx, method = xxx \r\n (如果没有class、method,则不显示)
Result : name = xxx, value = xxx \r\n (如果没有name,则不显示)
Result : name = xxx, value = xxx \r\n (如果没有name,则不显示)
Action : name = xxx, class = xxx, method = xxx \r\n (如果没有class、method,则不显示)
Result : name = xxx, value = xxx \r\n (如果没有name,则不显示)
Result : name = xxx, value = xxx \r\n (如果没有name,则不显示)
2013-07-16
将struts.xml解析的结果,封装到自定义的 Package、Action、Result对象中
新建com.filter.MyController implements Filter
在过滤器的init方法中 调用 xml解析的方法,得到解析结果
在过滤器的doFilter中 根据请求地址,判断调用哪个package的哪个action类的哪个方法
得到方法调用结果,根据对应result 请求转发到指定页面
实体关系
User 1-n Message
Message n-1 User
message_tbl
id
title
content
userid -> user_tbl.id
@ManyToOne
@JoinColumn
@OneToMany(mappedBy="xxx")
@OneToOne
User 1-1 Profile
每一个user 只有 对应 一个档案
从一个档案 只能得到对应 唯一的user
User
private Profile profile;
Profile
private User user;
OneToOne Many->One 唯一外键 @JoinColumn(name="xx", unique=true)
主键外键 @OneToOne(optional=false)
@PrimaryKeyJoinColumn
profile_tbl
userid -> user_tbl.id
@ManyToMany
User n-n Role
User 1-n Role
Role 1-n User
user_tbl
role_tbl
user_role_tbl
userid roleid
001 01
002 01
001 02