zoukankan      html  css  js  c++  java
  • 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:低.
  • 相关阅读:
    softmax和cross_entropy
    python初始化list列表(1维、2维)
    奥卡姆剃刀 (Occam Razor)
    何谓超参数?
    面试干货!21个必知数据科学面试题和答案
    计算广告算法到底要做什么?
    推荐系统的常用算法
    推荐系统常见面试题2
    推荐系统算法面试题
    mysql-面试题
  • 原文地址:https://www.cnblogs.com/chenxiaomeng/p/5800377.html
Copyright © 2011-2022 走看看