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);
}
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

 增加运行结果:

 

②数据库可以插入

查询运行结果:

删除运行结果:

修改运行结果:

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

 

涉及的小技巧:

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

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

 

涉及的知识:

forward转发   redirect重定向

1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.

3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说
forward:高.
redirect:低.

 

posted @ 2016-08-23 17:53  陈晓猛  阅读(719)  评论(0编辑  收藏  举报