美文网首页
SpringMVC/Hibernate项目实践三

SpringMVC/Hibernate项目实践三

作者: CupricNitrate | 来源:发表于2019-08-02 11:42 被阅读0次

    SpringMVC/Hibernate项目实践一
    SpringMVC/Hibernate项目实践二
    SpringMVC/Hibernate项目实践三

    源码地址

    第三步,引入Hibernate实现SSH集成配置,完成登录模块

    项目结构.png
    • 创建model包,创建实体类UserModel.java
    /**
     * 用户实体类
     */
    @Entity
    @Table(name = "t_user")
    public class UserModel {
    
        // 实体主键(自增长)
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        protected Long id = 0L;
    
        // 性别(枚举值)
        public enum Gender {
            男, 女;
        }
    
        // 用户名称(不可以为空)
        @Column(length = 100, nullable = false)
        private String name;
    
        // 用户性别(不可以为空) 枚举类型
        @Column(nullable = false)
        @Enumerated(EnumType.ORDINAL)
        private Gender gender = Gender.男;
    
        // 用户登录密码(不可以为空)
        @Column(length = 100, nullable = false)
        private String password;
    
        // 再次输入登录密码
        @Transient // 不作为数据库持久化字段
        private String passwordAgain;
    
        // 用户登录密码(不可以为空)
        @Column(length = 200, nullable = false)
        private String email;
    
        // 生日
        @Column
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private Date birthday;
    
        // 职业(一个用户只能从事一个职业)
        @Column
        private String profession;
    
        // 爱好(一个用户可以拥有多个爱好)
        private String[] hobby;
    
        /**
         * hobby 转换为,分隔的字符串
         * @return 字符串
         */
        public String getHobbyString() {
            if (hobby != null && hobby.length > 0) {
                String hobbyStr = Arrays.toString(hobby);
                return hobbyStr.substring(1, hobbyStr.length() - 1);
            }
            return "";
        }
    
        getter和setter...
    }
    
    • 在resources中创建application.properties,用来放置一些参数配置信息。
    #数据库连接相关
    jdbc.driver = com.mysql.jdbc.Driver
    jdbc.url = jdbc:mysql://localhost:3306/shixun?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 //你的数据库URL
    jdbc.username = root                                                                //你的数据库帐号
    jdbc.password = 1234                                                                //你的数据库密码
    
    #hibernate的配置项
    hibernate.dialect = org.hibernate.dialect.MySQLDialect
    hibernate.show_sql = true
    hibernate.format_sql = true
    hibernate.hbm2ddl.auto = update
    
    • 修改applicationContext.xml在其中加入Hibernate相关内容。
    <!--扫描配置文件(这里指向的是之前配置的那个config.properties) -->
        <context:property-placeholder location="classpath*:/application.properties" />
    
        <!--配置数据源 -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
              destroy-method="close">
            <property name="driverClass" value="${jdbc.driver}" />  <!--数据库连接驱动 -->
            <property name="jdbcUrl" value="${jdbc.url}" />     <!--数据库地址 -->
            <property name="user" value="${jdbc.username}" />   <!--用户名 -->
            <property name="password" value="${jdbc.password}" />   <!--密码 -->
            <property name="maxPoolSize" value="40" />      <!--最大连接数 -->
            <property name="minPoolSize" value="1" />       <!--最小连接数 -->
            <property name="initialPoolSize" value="10" />      <!--初始化连接池内的数据库连接 -->
            <property name="maxIdleTime" value="20" />  <!--最大空闲时间 -->
        </bean>
    
        <!--配置session工厂 -->
        <bean id="sessionFactory"
              class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="packagesToScan" value="online.shixun.project.model" />
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <!--hibernate根据实体自动生成数据库表 -->
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>   <!--指定数据库方言 -->
                    <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>     <!--在控制台显示执行的数据库操作语句 -->
                    <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>     <!--在控制台显示执行的数据库操作语句(格式) -->
                </props>
            </property>
        </bean>
    
        <!-- 事务管理器配置 -->
        <bean id="transactionManager"
              class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>
    
        <tx:annotation-driven transaction-manager="transactionManager"/>
    
    • 创建dao包,在其中新建类UserDao.java
    ...
    import org.springframework.transaction.annotation.Transactional;
    ...
    /**
     * 数据库访问类
     */
    @Repository
    public class UserDao {
    
        // 利用 Spring 的配置文件直接生成 Hibernate 的 sessionFactory
        @Autowired
        private SessionFactory sessionFactory;
    
        /**
         * 获取 Hibernate 的 Session
         * @return 返回 Session 之后就可以通过它来做各种增删改查了
         */
        private Session getCurrentSession() {
          //使用了getCurrentSession()的public函数都要加上@Transactional被事务管理,实体类加上后类就被管理了。
            return this.sessionFactory.getCurrentSession();
        }
    
        /**
         * 新增用户
         * @param entity 用户对象
         * @return 新增的用户信息在数据表中的ID
         */
        public Long save(UserModel entity) {
            return (Long)getCurrentSession().save(entity);
        }
    }
    
    • 编辑UserService.java,在其中创建方法完成对于UserDao的调用。
      ps:要在Service层添加事务!
    @Service
    @Transactional
    public class UserService {
    
        @Autowired
        private UserDao userDao;
    
        /*public String test(){
            return "hello";
        }*/
    
        public long saveUser(UserModel user){
            return userDao.save(user);
        }
    
    }
    
    • 编写UserController.java,调整hello方法,完成 对于UserService的调用。
    @Controller
    public class UserController {
    
        @Autowired
        private UserService userService;
    
    @RequestMapping(value = "hello")
        public String hello(){
        //return userService.test();
        UserModel user = new UserModel();
        user.setName("肖晟鹏");
        user.setPassword("1234");
        user.setEmail("727901974@qq.com");
        user.setGender(UserModel.Gender.男);
        user.setBirthday(new Date());
        user.setProfession("学生");
        // 保存用户信息
        userService.saveUser(user);
        return "hello";
        }
    }
    

    ps:Hibernate自动建表后插入中文报错

    ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Incorrect string value: '\xE6\xB2\x88\xE9\x9B\xAA...' for column 'username' at row 1。
    

    可能是你的数据库默认字符集不是utf-8,然后识别不了中文。
    修改方法:

    1. 修改数据库中的字符集
    2. 重写MySQL5InnoDBDialect,在创建表时自动字符类型设置为utf8:
    public class MySQL5InnoDBUTF8Dialect extends MySQL5InnoDBDialect {
        @Override
        public String getTableTypeString(){
            return "ENGINE=InnoDB DEFAULT CHARSET=UTF8";
        }
    }
    

    然后在修改.properties

    #hibernate的配置项
    hibernate.dialect = online.shixun.project.common.MySQL5InnoDBUTF8Dialect
    #hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
    
    • 创建数据库shixun,无需创建数据表。

    • 至此,Spring MVC+Spring+Hibernate三大框架已经集成完毕。

    • 编辑UserDao.java,增添一个为登录提供支持的从数据库中获取用户信息的方法。

     /**
         * 通过用户名获取用户对象
         * @param name 用户名
         * @return 用户对象
         */
    @Transactional(readOnly = true)
        public UserModel getUserByName(String name){
           UserModel user = (UserModel) getCurrentSession()
                    .createQuery("from UserModel where name=:name")
                    .setParameter("name", name)
                    .uniqueResult();
            return user;
        }
    
    • 编辑UserService.java增添一个实现登录逻辑的方法。
        /**
         * 登录验证的业务逻辑方法
         *
         * @param userModel
         * @return
         */
        public boolean login(UserModel userModel) {
            UserModel user = userDao.getUserByName(userModel.getName());
            // 判断登录是否成功
            if (user != null && userModel.getPassword().equals(user.getPassword())) {
                // 登录成功
                return true;
            }
            // 登录失败
            return false;
        }
    
    • 编辑UserController.java,增添两个跟登录相关的方法,去掉之前的hello方法,删除hello.jsp
    @Controller
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        /**
         * 负责将客户端请求转发到login.jsp,供客户端看登录页面
         */
        @RequestMapping(value = "")
        public String toLogin(){
            return "login";
        }
    
        /**
         * 负责处理客户端的登录请求
         */
        @RequestMapping(value = "login")
        public String doLogin(UserModel user, Model model){
            // 调用service方法实现登录验证
            boolean result = userService.login(user);
            // 判断登录是否
            if(result){
                return "index";
            }else{
                model.addAttribute("loginErrorMessage", "用户名或密码错误,登录失败!");
                return "login";
            }
        }
    }
    
    • 然后导入login,jsp和index.jsp与其相关文件,就可以了。(可以从我的源码中提取,也可以自己写一写,这些是关于前端的内容,我这里就不贴贴了嗷)。

    到此我们就已经完成了SSH框架的集成,然后,开始您的项目吧。

    相关文章

      网友评论

          本文标题:SpringMVC/Hibernate项目实践三

          本文链接:https://www.haomeiwen.com/subject/lpzkdctx.html