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,然后识别不了中文。
修改方法:
- 修改数据库中的字符集
- 重写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框架的集成,然后,开始您的项目吧。
网友评论