• 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:低.
  • 相关阅读:
    Leetcode 15 3Sum
    Leetcode 383 Ransom Note
    用i个点组成高度为不超过j的二叉树的数量。
    配对问题 小于10 1.3.5
    字符矩阵的旋转 镜面对称 1.2.2
    字符串统计 连续的某个字符的数量 1.1.4
    USACO twofive 没理解
    1002 All Roads Lead to Rome
    USACO 5.5.1 求矩形并的周长
    USACO 5.5.2 字符串的最小表示法
  • 原文地址:https://www.cnblogs.com/chenxiaomeng/p/5800377.html
Copyright © 2020-2023  润新知