6.SSH框架整合
ssh:spring+spring-mvc+hibernate
6.1 整合的场所 :web.xml
跟 5.ssm框架 整合类似,可以对照学习,通过监听器配置hibernate,通过servlet配置mvc
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--默认访问的页面,可以不用设置-->
<welcome-file-list>
<welcome-file>/views/login.jsp</welcome-file>
</welcome-file-list>
<!--上下文配置路径-->
<context-param>
<param-name>contextConfigLocation</param-name>
<!--hibernate的配置文件-->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<!--上下文加载监听器,主要用于监听上下文参数配置,这里主要用来监听hibernate的配置文件-->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--这是对spring mvc的整合配置-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--上下文配置路径-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<!--字符编码过滤器-->
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!--编码格式-->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<!--强制编码-->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
6.2 mvc和hibernate的配置文件:
6.2.1 spring-mvc.xml:( resources文件夹下)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--加载配置文件,加载进来就可以通过@Value注解来获取属性的值-->
<context:property-placeholder location="classpath:config.properties" />
<!--视图解析器:在控制器返回视图的时候生效-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
<!--字符串消息转换器-->
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter" />
<!--JSON消息转换器-->
<bean id="jsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!--开启MVC注解驱动-->
<mvc:annotation-driven>
<!--消息转换器-->
<mvc:message-converters>
<ref bean="stringHttpMessageConverter" />
<ref bean="jsonHttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
<!--扫描控制器所在的包-->
<context:component-scan base-package="com.dream.ssh.controller" />
<mvc:default-servlet-handler />
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<!--内存中可用大小:3 * 1024 * 1024 = 3145728 = 3M-->
<property name="maxInMemorySize" value="3145728" />
<!--设置临时存储目录,当上传文件大小超过内存中可使用大小时将产生临时文件-->
<property name="uploadTempDir" value="/upload"/>
<!--10 * 1024 * 1024 = 1048576 = 10M -->
<!--最大上传大小-->
<property name="maxUploadSize" value="1048576" />
<!--单个文件大小-->
<property name="maxUploadSizePerFile" value="1048576" />
</bean>
<!--组件扫描-->
</beans>
6.2.2 applicationContext.xml:( resources文件夹下)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--********************************************配置Spring***************************************-->
<!-- 自动扫描 -->
<context:component-scan base-package="com.dream.ssh">
<!-- 扫描时跳过 @Controller 注解的JAVA类(控制器) -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--********************************************配置hibernate********************************************-->
<!--扫描配置文件(这里指向的是之前配置的那个config.properties)-->
<context:property-placeholder location="classpath:/config.properties" />
<!--Druid数据源配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}" />
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--配置session工厂-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.dream.ssh.pojo" />
<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"/>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
config.properties:
#database connection config
jdbc.url=
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=
jdbc.password=
#hibernate config
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.show_sql = true
hibernate.format_sql = true
hibernate.hbm2ddl.auto = update
6.3 Dao层使用hibernate进行持久化操作
pojo:
注:set和get方法需添加,属性和表字段不区分大小写,但若是不相同,还需要使用注解@Column进行解释。
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
/**
* 用户User实体类
*/
@Entity
@Table(name = "t_user")
public class User{
//用户id
@Id
private String yhid;
//用户姓名
private String yhxm;
//用户口令
private String yhkl;
//用户性别
private String yhxb;
//用户部门
private String yhbm;
//排序号
private Long pxh;
//是否禁用
private String sfjy;
}
dao层实现类:
注:使用Repository注解标识
/**
* 用户持久层的对象
*/
@Repository
public class UserDaoImpl implements UserDao {
HibernateTemplate hibernateTemplate;
/**
* 注入 hibernateTemplate对象
* @param hibernateTemplate 对象
*/
@Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
}
常用示例1(新增):
@Override
public int insert(User user) {
if (hibernateTemplate.save(user)!=null){
return 1;
} else {
return 0;
}
}
常用示例2(删除和批量删除):
/**
* 批量删除
* @param ids 用户id的字符串集合
* @return 1 =成功
*/
@Override
public Integer batchDelete(String[] ids) {
List<User> users = new ArrayList<>();
for (int i = 0; i < ids.length; i++) {
User user = new User();
user.setYhid(ids[i]);
users.add(user);
}
hibernateTemplate.deleteAll(users);
return 1;
}
/**
* 删除
* @param username 用户id
* @return 1 = 成功
*/
@Override
public Integer delete(String username) {
User user = new User();
user.setYhid(username);
hibernateTemplate.delete(user);
return 1;
}
常用示例3(修改):
注:一个业务层方法中,需要同时调用查询和修改,无法直接使用hibernateTemplate.update方法,session中的持久化对象会出现多个,引发冲突报出异常,可以使用hibernateTemplate.merge(user);将需要修改的对象复制到持久化对象中。
/**
* 修改
* @param user 用户实体
* @return 1 =成功
*/
@Override
public int update(User user) {
hibernateTemplate.update(user);
return 1;
}
常见示例4(查询)
/**
* 根据id查询用户信息
* @param username 用户id
* @return 用户信息对象
*/
@Override
public User selectById(String username) {
User user = (User) hibernateTemplate.get(User.class, username);
return user;
}
/**
* 根据条件查询(模糊查询+分页+排序)
* @param name 用户名或者id
* @param depart 用户所属部门
* @param start 开始的条数
* @param limit 获取的数据量
* @return
*/
@Override
public List<User> select(String name, String depart, Integer start, Integer limit) {
return hibernateTemplate.execute(session -> {
Criteria criteria = session.createCriteria(User.class);
if (StringUtils.trimObj(name)!=""){
criteria.add(Restrictions.or(
Restrictions.like("yhid",name,MatchMode.ANYWHERE),
Restrictions.like("yhxm",name,MatchMode.ANYWHERE)
));
}
if (StringUtils.trimObj(depart)!=""){
criteria.add(Restrictions.eq("yhbm",depart));
}
List<User> list = criteria.addOrder(Order.asc("pxh")).setFirstResult(start).setMaxResults(limit).list();
return list;
});
}
/**
* 得到条件下的用户数量(结合上一个分页的方法使用)
* @param name 用户名或id
* @param depart 用户部门
* @return 数量
*/
@Override
public Integer getTotal(String name, String depart) {
return hibernateTemplate.execute(session -> {
Criteria criteria = session.createCriteria(User.class);
if (!StringUtils.trimObj(name).equals("")){
criteria.add(Restrictions.or(
Restrictions.like("yhid",name,MatchMode.ANYWHERE),
Restrictions.like("yhxm",name,MatchMode.ANYWHERE)
));
}
if (!StringUtils.trimObj(depart).equals("")){
criteria.add(Restrictions.eq("yhbm",depart));
}
Long total = (Long)criteria.setProjection(Projections.rowCount()).uniqueResult();
return total.intValue();
});
}