1.概念
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
hibernate对象:
① configuration (Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象)
②sessionFactory(一个数据库对应一个sessionFactory对象)
③session (针对操作数据库的对象)
④transition (Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务)
⑤query (Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。
⑥Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
代码实现:
面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。 初期也许都是new对象去调用下一层,比如你在业务层new一个DAO类的对象,调用DAO类方法访问数据库,这样写是不对的,因为在业务层中是不应该含有具体对象,最多只能有引用,如果有具体对象存在,就耦合了。当那个对象不存在,我还要修改业务的代码,这不符合逻辑。
com.公司名.系统名.模块名
代码目录结构
Action : 负责页面逻辑,将调用service的结果返回到页面中
Service : 接口定义
---impl 接口的实现,负责业务逻辑
Domain 对应数据库表的pojo
Dao : 只负责连接数据库,从数据库中查询结果,包装成对象后返回
util :工具类
敲完这些代码,我出现的一个疑惑:既然数据库操作都是由dao层来做的,那么service层的作用是什么?
看了几个帖子加上我自己的理解大概得到答案是这样(不知道对不对,但是做一个记录):
dao是数据访问层。DAO(Data Access Object) 数据访问对象是第一个面向对象的接口.负责访问数据。
service是业务层。负责所有的业务逻辑处理。作为指导dao访问什么数据,或者是调用封装的不使用数据库的工具类。如
附件上传,dao可能只把附件的路径啊,名称啊之类的存储到数据库中,但是真正的把文件上传的ftp还是要在service层写的。
model属于数据实体模型。和数据库的数据字段是基本对应的,model也可以增加一些数据库没有的虚拟字段,帮助处理业务。
这样分层的好处是降低程序耦合度,为了把数据库DB的操作和业务操作分离开来,就是解耦,使用接口,可以方便修改和维护。
1.DAO层
接口dao
package com.tgb.web.controller.dao; import java.util.List; import com.tgb.web.controller.entity.User; public interface IUserDAO { public void addUser(User user); public List<User> getAllUser(); public boolean delUser(String id); public User getUser(String id); public boolean updateUser(User user);
}
IUserDAO.java
package com.tgb.web.controller.dao; import java.util.List; import org.hibernate.Query;
import org.hibernate.SessionFactory; import com.tgb.web.controller.entity.User; public class UserDAO implements IUserDAO { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
} public void addUser(User user) {
sessionFactory.getCurrentSession().save(user);
} public List<User> getAllUser() {
String hql = "from User";
Query query = sessionFactory.getCurrentSession().createQuery(hql); return query.list();
} public boolean delUser(String id) {
String hql = "delete User u where u.id=?";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setString(0, id);
// >0表示返回成功
return (query.executeUpdate() > 0);
} public User getUser(String id) {
String hql = "from User u where u.id=?";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setString(0, id); return (User) query.uniqueResult();
} public boolean updateUser(User user) {
String hql = "update User u set u.userName=?,u.age=? where u.id=?";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setString(0, user.getUserName());
query.setString(1, user.getAge());
query.setString(2, user.getId()); return (query.executeUpdate() > 0);
} }
UserDAO.java
2.Entity层
package com.tgb.web.controller.entity; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity
@Table(name="T_USER")
public class User { @Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(length=32)
private String id; @Column(length=32)
private String userName; @Column(length=32)
private String age; public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} }
user.java
3.hibernate
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory>
<mapping class="com.tgb.web.controller.entity.User"/>
</session-factory>
</hibernate-configuration>
hibernate.cfg.test.xml
4.service层
接口 IUserManager
package com.tgb.web.controller.service; import java.util.List; import com.tgb.web.controller.entity.User; public interface IUserManager { public void addUser(User user); public List<User> getAllUser(); public boolean delUser(String id); public User getUser(String id); public boolean updateUser(User user);
}
IUserManager.java
实现
package com.tgb.web.controller.service; import java.util.List; import com.tgb.web.controller.dao.IUserDAO;
import com.tgb.web.controller.entity.User; public class UserManager implements IUserManager { private IUserDAO userDao; public void setUserDao(IUserDAO userDao) {
this.userDao = userDao;
} public void addUser(User user) {
userDao.addUser(user);
} public List<User> getAllUser() {
return userDao.getAllUser();
} public boolean delUser(String id) {
return userDao.delUser(id);
} public User getUser(String id) {
return userDao.getUser(id);
} public boolean updateUser(User user) {
return userDao.updateUser(user);
} }
UserManager.java
5.spring配置设置基层,服务层,dao层的不同配置再综合到 springAnnotation-core中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [
<!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">
]> <beans>
<bean id="userDao" class="com.tgb.web.controller.dao.UserDAO">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <bean id="userManagerBase" class="com.tgb.web.controller.service.UserManager">
<property name="userDao" ref="userDao"></property>
</bean> <bean id="userManager" parent="transactionBese">
<property name="target" ref="userManagerBase"></property>
</bean> </beans>
springAnnotation-import.xml
6.config层
①各个import的综合
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [
<!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">
]> <beans> <import resource="classpath*:com/tgb/web/controller/spring/springAnnotation-import.xml"/>
</beans>
springAnnotation-core.xml
②数据库的配置springAnnotation-hibernate.xml
③springmvc的配置
增加运行结果:
①
②数据库可以插入
查询运行结果:
删除运行结果:
修改运行结果:
查询一条-->修改一条-->重新查询一条 的过程
涉及的小技巧:
建议在链接的时候使用javascript(0),#的链接是重新请求,用javascript void(0)则比较好些
程序一定要有输入有输出,如 删除 要有是否删除成功的结果
涉及的知识:
forward转发 redirect重定向
1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL. 2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据. 3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等. 4.从效率来说
forward:高.
redirect:低.