SSM:SpringMVC+Spring+MyBatis
1. SSM整合思想
原理:java经典三层架构整合的关键所在:利用MyBatis-Spring项目(mybatis-spring-1.3.0.jar)使得Spring与Mybatis的整合
2. Spring与Mybatis的如何整合?
1、导入spring库、mybatis-spring-1.3.0.jar(MyBatis-Spring项目)、mybatis-3.4.1.jar2、配置beans.xml
a、数据源
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123
beans.xml
<context:property-placeholder location="classpath:jdbc.properties"/>
<context:component-scan base-package="com.gec.service" />
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close" p:driverClassName="${jdbc.driver}"
p:url="${jdbc.url}" p:username="${jdbc.username}"
p:password="${jdbc.password}" />
b、 将SqlSessionFactroy工厂对象注入到Spring容器所管理
<!-- 将SqlSessionFactroy工厂对象注入到Spring容器所管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 扫描sql配置文件:mapper需要的xml文件 -->
<property name="mapperLocations" value="classpath:com/gec/mapper/*.xml" />
</bean>
c、Mapper文件所对应的接口对象配置成bean管理
<!-- Mapper文件所对应的接口对象配置成bean管理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.gec.dao" />
<property name="annotationClass" value="org.springframework.stereotype.Repository"/>
</bean>
3、利用逆向工具生成pojo、mapper映射xml和接口,注意:需要在类前面加上@Repository注解
UserMapper.java
@Repository
public interface UserMapper {
int deleteByPrimaryKey(Integer id);
int insert(User record);
int insertSelective(User record);
User selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
}
4、编写一个业务bean,注意:需要在beans.xml扫描并在类前面加@ Service注解,依赖项userMapper前面加@Autowired自动配置bean的注解
UserService .java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public int insertUser(User user) {
return userMapper.insert(user);
}
}
4、测试用例
MainTest.java
public class MainTest {
public static void main(String[] args)
{
//获取spring的IOC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
UserService userService=(UserService) ctx.getBean("userService");
User user=new User();
user.setName("张学友");
user.setAge(56);
user.setSex("男");
userService.insertUser(user);
}
}
3. 如何spring整合mybatis基础上加事务管理
1、在beans.xml文件 配置spring事务管理器<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" />
<!--启动注解实现事务管理-->
<tx:annotation-driven transaction-manager="transactionManager" />
2、在方法添加@Transactional注解
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public int insertUser(User user) {
return userMapper.insert(user);
}
}
4. 整合Spring+mybatis+springmvc框架
1、在web.xml文件
图解如下:
(1)ContextLoaderListener:上下文监听器,会生成上下文的root WebApplication(父IOC容器)
a、配置业务层的beanb、数据源
c、事务管理
d、dao层的bean、与mybatis整合
(2)DispatcherServlet:前端控制器
根据springmvc-config.xml生成WebApplication(子ioc容器)
a、配置表现层的bean
b、springmvc相关的核心组件
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>day0110_ssm</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- contextConfigLocation参数用来指定Spring的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-service.xml,classpath:spring/spring-dao.xml</param-value>
</context-param>
<!-- 定义Spring MVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 让Spring MVC的前端控制器拦截所有请求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2、在springmvc-config.xml文件配置与springmvc核心组件相关的信息
springmvc-config.xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.gec.controller"/>
<mvc:annotation-driven />
<mvc:default-servlet-handler />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
3、在spring-service.xml文件配置数据源、业务层的bean、事务管理
spring-service.xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<context:property-placeholder location="classpath:jdbc.properties" />
<context:component-scan base-package="com.gec.service" />
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driver}" p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" />
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"
/>
<!--启动注解实现事务管理-->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
4、在spring-dao.xml文件
整合mybatis框架
spring-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 将SqlSessionFactroy工厂对象注入到Spring容器所管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 扫描sql配置文件:mapper需要的xml文件 -->
<property name="mapperLocations" value="classpath:com/gec/mapper/*.xml" />
</bean>
<!-- Mapper文件所对应的接口对象配置成bean管理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.gec.dao" />
<property name="annotationClass" value="org.springframework.stereotype.Repository"/>
</bean>
</beans>
5. SSM加入分页
分页作用:实现按区域查询数据分页的主要参数:
1、当前页: pageindex
2、每页显示记录数: pageSize
3、总记录条数: totalRecordSum(通过count的sql语句获取)
4、总页数: totalPageNum=(totalRecordSum+pageSize-1)/pageSize
5、开始位置: sqlstartLimitPos =(pageIndex-1)*pageSize
PageModel.java
public class PageModel {
private int pageIndex;
private int pageSize=5;
private int totalRecordSum;
private int totalPageNum;
public int getPageIndex() {
this.pageIndex=this.pageIndex<=1?1:this.pageIndex;
this.pageIndex=this.pageIndex>=getTotalPageNum()?getTotalPageNum():this.pageIndex;
return pageIndex;
}
public void setPageIndex(int pageIndex) {
this.pageIndex = pageIndex;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRecordSum() {
return totalRecordSum;
}
public void setTotalRecordSum(int totalRecordSum) {
this.totalRecordSum = totalRecordSum;
}
public int getTotalPageNum() {
if(getTotalRecordSum()==0) {
return 0;
}
this.totalPageNum = this.totalRecordSum%this.pageSize==0?this.totalRecordSum/this.pageSize: (this.totalRecordSum/this.pageSize)+1;
return totalPageNum;
}
public int getStartLimitPos() {
return (getPageIndex()-1)*getPageSize();
}
}
编写查询总记录sql定制方法
<select id="queryBookInfoCount" resultType="int">
select count(*) from tb_book
<where>
<if test="bookName!=null and bookName!=''">
and book_name like concat(#{bookName},'%')
</if>
<if test="bookAuthor!=null and bookAuthor!=''">
and book_author like concat(#{bookAuthor},'%');
</if>
<if test="fromBookDate!=null">
<![CDATA[ and book_date>=#{fromBookDate}]]>
</if>
<if test="toBookDate!=null">
<![CDATA[ and book_date<=#{toBookDate}]]>
</if>
<if test="fromPrice!=null">
<![CDATA[ and book_price>=#{fromPrice}]]>
</if>
<if test="toPrice!=null">
<![CDATA[ and book_price<=#{toPrice}]]>
</if>
</where>
</select>
针对mysql的数据库的区域查询
select * from tb_book where xxxx limit 开始位置,记录条数
<select id="queryBookInfoList" resultMap="BaseResultMap">
select * from tb_book
<where>
<if test="bookName!=null and bookName!=''">
and book_name like concat(#{bookName},'%')
</if>
<if test="bookAuthor!=null and bookAuthor!=''">
and book_author like concat(#{bookAuthor},'%');
</if>
<if test="fromBookDate!=null">
<![CDATA[ and book_date>=#{fromBookDate}]]>
</if>
<if test="toBookDate!=null">
<![CDATA[ and book_date<=#{toBookDate}]]>
</if>
<if test="fromPrice!=null">
<![CDATA[ and book_price>=#{fromPrice}]]>
</if>
<if test="toPrice!=null">
<![CDATA[ and book_price<=#{toPrice}]]>
</if>
</where>
limit #{startLimitPos},#{pageSize}
</select>