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,然后識別不了中文。
修改方法:
- 修改數(shù)據(jù)庫中的字符集
- 重寫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框架的集成,然后,開始您的項目吧。