SpringMVC/Hibernate项目实践三

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

源码地址

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

SpringMVC/Hibernate项目实践三_第1张图片
项目结构.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相关内容。

    

    
    
          
             
           
           
              
               
              
          
    

    
    
        
        
        
            
                ${hibernate.hbm2ddl.auto} 
                ${hibernate.dialect}   
                ${hibernate.show_sql}     
                ${hibernate.format_sql}     
            
        
    

    
    
        
    

    
  • 创建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("[email protected]");
    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项目实践三)