SpringMVC/Hibernate項目實踐三

SpringMVC/Hibernate項目實踐一
SpringMVC/Hibernate項目實踐二
SpringMVC/Hibernate項目實踐三

源碼地址

第三步,引入Hibernate實現(xiàn)SSH集成配置,完成登錄模塊

項目結(jié)構(gòu).png
  • 創(chuàng)建model包,創(chuàng)建實體類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 // 不作為數(shù)據(jù)庫持久化字段
    private String passwordAgain;

    // 用戶登錄密碼(不可以為空)
    @Column(length = 200, nullable = false)
    private String email;

    // 生日
    @Column
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    // 職業(yè)(一個用戶只能從事一個職業(yè))
    @Column
    private String profession;

    // 愛好(一個用戶可以擁有多個愛好)
    private String[] hobby;

    /**
     * hobby 轉(zhuǎn)換為,分隔的字符串
     * @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中創(chuàng)建application.properties,用來放置一些參數(shù)配置信息。
#數(shù)據(jù)庫連接相關(guān)
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/shixun?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 //你的數(shù)據(jù)庫URL
jdbc.username = root                                                                //你的數(shù)據(jù)庫帳號
jdbc.password = 1234                                                                //你的數(shù)據(jù)庫密碼

#hibernate的配置項
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.show_sql = true
hibernate.format_sql = true
hibernate.hbm2ddl.auto = update
  • 修改applicationContext.xml在其中加入Hibernate相關(guān)內(nèi)容。
<!--掃描配置文件(這里指向的是之前配置的那個config.properties) -->
    <context:property-placeholder location="classpath*:/application.properties" />

    <!--配置數(shù)據(jù)源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close">
        <property name="driverClass" value="${jdbc.driver}" />  <!--數(shù)據(jù)庫連接驅(qū)動 -->
        <property name="jdbcUrl" value="${jdbc.url}" />     <!--數(shù)據(jù)庫地址 -->
        <property name="user" value="${jdbc.username}" />   <!--用戶名 -->
        <property name="password" value="${jdbc.password}" />   <!--密碼 -->
        <property name="maxPoolSize" value="40" />      <!--最大連接數(shù) -->
        <property name="minPoolSize" value="1" />       <!--最小連接數(shù) -->
        <property name="initialPoolSize" value="10" />      <!--初始化連接池內(nèi)的數(shù)據(jù)庫連接 -->
        <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根據(jù)實體自動生成數(shù)據(jù)庫表 -->
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>   <!--指定數(shù)據(jù)庫方言 -->
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>     <!--在控制臺顯示執(zhí)行的數(shù)據(jù)庫操作語句 -->
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>     <!--在控制臺顯示執(zhí)行的數(shù)據(jù)庫操作語句(格式) -->
            </props>
        </property>
    </bean>

    <!-- 事務(wù)管理器配置 -->
    <bean id="transactionManager"
          class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
  • 創(chuàng)建dao包,在其中新建類UserDao.java
...
import org.springframework.transaction.annotation.Transactional;
...
/**
 * 數(shù)據(jù)庫訪問類
 */
@Repository
public class UserDao {

    // 利用 Spring 的配置文件直接生成 Hibernate 的 sessionFactory
    @Autowired
    private SessionFactory sessionFactory;

    /**
     * 獲取 Hibernate 的 Session
     * @return 返回 Session 之后就可以通過它來做各種增刪改查了
     */
    private Session getCurrentSession() {
      //使用了getCurrentSession()的public函數(shù)都要加上@Transactional被事務(wù)管理,實體類加上后類就被管理了。
        return this.sessionFactory.getCurrentSession();
    }

    /**
     * 新增用戶
     * @param entity 用戶對象
     * @return 新增的用戶信息在數(shù)據(jù)表中的ID
     */
    public Long save(UserModel entity) {
        return (Long)getCurrentSession().save(entity);
    }
}
  • 編輯UserService.java,在其中創(chuàng)建方法完成對于UserDao的調(diào)用。
    ps:要在Service層添加事務(wù)!
@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,調(diào)整hello方法,完成 對于UserService的調(diào)用。
@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("學(xué)生");
    // 保存用戶信息
    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。

可能是你的數(shù)據(jù)庫默認字符集不是utf-8,然后識別不了中文。
修改方法:

  1. 修改數(shù)據(jù)庫中的字符集
  2. 重寫MySQL5InnoDBDialect,在創(chuàng)建表時自動字符類型設(shè)置為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
  • 創(chuàng)建數(shù)據(jù)庫shixun,無需創(chuàng)建數(shù)據(jù)表。

  • 至此,Spring MVC+Spring+Hibernate三大框架已經(jīng)集成完畢。

  • 編輯UserDao.java,增添一個為登錄提供支持的從數(shù)據(jù)庫中獲取用戶信息的方法。

 /**
     * 通過用戶名獲取用戶對象
     * @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增添一個實現(xiàn)登錄邏輯的方法。
    /**
     * 登錄驗證的業(yè)務(wù)邏輯方法
     *
     * @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,增添兩個跟登錄相關(guān)的方法,去掉之前的hello方法,刪除hello.jsp
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 負責(zé)將客戶端請求轉(zhuǎn)發(fā)到login.jsp,供客戶端看登錄頁面
     */
    @RequestMapping(value = "")
    public String toLogin(){
        return "login";
    }

    /**
     * 負責(zé)處理客戶端的登錄請求
     */
    @RequestMapping(value = "login")
    public String doLogin(UserModel user, Model model){
        // 調(diào)用service方法實現(xiàn)登錄驗證
        boolean result = userService.login(user);
        // 判斷登錄是否
        if(result){
            return "index";
        }else{
            model.addAttribute("loginErrorMessage", "用戶名或密碼錯誤,登錄失敗!");
            return "login";
        }
    }
}
  • 然后導(dǎo)入login,jsp和index.jsp與其相關(guān)文件,就可以了。(可以從我的源碼中提取,也可以自己寫一寫,這些是關(guān)于前端的內(nèi)容,我這里就不貼貼了嗷)。

到此我們就已經(jīng)完成了SSH框架的集成,然后,開始您的項目吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容