16~25.spring+hibernate简单实例 .连接数据库并进行增删改查
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); }
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); } }
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; } }
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>
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); }
实现
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); } }
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>
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-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:低.