16~25.spring+hibernate简单实例 .连接数据库并进行增删改查

时间:2023-11-24 22:38:26

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 :工具类

16~25.spring+hibernate简单实例  .连接数据库并进行增删改查

16~25.spring+hibernate简单实例  .连接数据库并进行增删改查

敲完这些代码,我出现的一个疑惑:既然数据库操作都是由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

springAnnotation-hibernate.xml

③springmvc的配置

springAnnotation-servlet.xml

 增加运行结果:

16~25.spring+hibernate简单实例  .连接数据库并进行增删改查

②数据库可以插入

16~25.spring+hibernate简单实例  .连接数据库并进行增删改查

16~25.spring+hibernate简单实例  .连接数据库并进行增删改查

查询运行结果:

16~25.spring+hibernate简单实例  .连接数据库并进行增删改查

删除运行结果:

16~25.spring+hibernate简单实例  .连接数据库并进行增删改查

修改运行结果:

查询一条-->修改一条-->重新查询一条 的过程

16~25.spring+hibernate简单实例  .连接数据库并进行增删改查

16~25.spring+hibernate简单实例  .连接数据库并进行增删改查

涉及的小技巧:

建议在链接的时候使用javascript(0),#的链接是重新请求,用javascript void(0)则比较好些

程序一定要有输入有输出,如 删除 要有是否删除成功的结果

涉及的知识:

forward转发   redirect重定向

1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL. 2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据. 3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等. 4.从效率来说
forward:高.
redirect:低.