第七章-spring整合mybatis
分类: ssm 专栏: ssm框架课 标签: spring整合mybatis
2022-12-10 16:36:49 1763浏览
spring框架整合mybatis
1.基本整合方式
主要的核心步骤如下:
1.1引入jar包

1.2编写spring配置文件
<?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">
<!--配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url">
<value><![CDATA[jdbc:mysql://127.0.0.1:3306/cvs_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull]]></value>
</property>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--配置sqlsession factory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations">
<list>
<value>classpath:mapper/*.xml</value>
</list>
</property>
</bean>
<!--配置sqlsessionTemplate-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
<!--配置dao-->
<bean id="sysUserMapper" class="com.spring_study.part3.mapper.impl.SysUserMapperImpl">
<property name="sqlSession" ref="sqlSessionTemplate"/>
</bean>
</beans>1.3编写dao层实现类
public class SysUserMapperImpl implements SysUserMapper {
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List<SysUser> getAll() {
return sqlSession.selectList("com.spring_study.part3.mapper.SysUserMapper.getAll");
}
}
利用SqlSessionDaoSupport简化代码:
public class SysUserMapperImpl extends SqlSessionDaoSupport implements SysUserMapper {
/* private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}*/
@Override
public List<SysUser> getAll() {
return getSqlSession().selectList("com.spring_study.part3.mapper.SysUserMapper.getAll");
}
} <bean id="sysUserMapper" class="com.spring_study.part3.mapper.impl.SysUserMapperImpl">
<!--<property name="sqlSession" ref="sqlSessionTemplate"/>-->
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>那现在我不想写dao的实现类怎么办。
- MapperFactoryBean的方式生成代理对象
<bean class="org.mybatis.spring.mapper.MapperFactoryBean" id="userInfoMapper">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<property name="mapperInterface" value="com.jf3q.sm_part7.dao.UserInfoMapper"/>
</bean>
<bean class="com.jf3q.sm_part7.service.impl.UserInfoServiceImpl" id="userInfoService">
<property name="userInfoMapper" ref="userInfoMapper"/>
</bean>- MapperScannerConfigurer扫描的方式就是咱们这提倡的最终的方式
1.4最终版spring配置
<?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">
<!--配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url">
<value><![CDATA[jdbc:mysql://127.0.0.1:3306/cvs_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull]]></value>
</property>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--配置sqlsession factory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--配置别名映射-->
<property name="typeAliasesPackage" value="com.spring_study.part3.domain"/>
<!--这个配置文件可以不写-->
<!-- <property name="configLocation" value="classpath:mybatis-config.xml"/>-->
<!--如果我们的映射文件和dao层类放在同一目录下的话这部可以省略不写-->
<property name="mapperLocations">
<list>
<value>classpath:mapper/*.xml</value>
</list>
</property>
</bean>
<!--配置dao-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>-->
<property name="basePackage" value="com.spring_study.part3.mapper"/>
</bean>
</beans>2.映射器整合方式
不需要dao层的实现类,直接用MapperFactoryBean注入即可
<bean id="sysUserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.spring_study.part3.mapper.SysUserMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>简化代码:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>-->
<property name="basePackage" value="com.spring_study.part3.mapper"/>
</bean>3.声明式事务
3.1配置xml的方式
先导入命名空间。

<!--1.定义事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--2.设置事务属性-->
<tx:advice transaction-manager="transactionManager" id="txAdvice">
<tx:attributes>
<!--带get前缀的方法不用事务管理-->
<tx:method name="get*" read-only="true"/>
<!--除了get前缀以外的,也就是非查询类的方法都交给事务管理-->
<!--默认不配rollback-for的话是运行时异常才回滚,如果是那种sql异常 io异常之类的就不回滚了,
所以这里配置下所有异常都回滚-->
<tx:method name="*" rollback-for="java.lang.Exception"/>
</tx:attributes>
</tx:advice>
<!--3.定义事务切面-->
<aop:config >
<aop:pointcut id="serviceMethod" expression="execution(* com.spring_study.part3.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>3.2基于注解的方式
1.applicationContext配置文件
<!--1.定义事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>上面的事务属性和事务切面就不用配置了
2.加注解@Transactional(rollbackFor = Exception.class)
@Service
@Transactional(rollbackFor = Exception.class)
public class SysUserServiceImpl implements SysUserService {
@Autowired
SysUserMapper sysUserMapper;
@Override
@Transactional(readOnly = true)
public List<SysUser> getList() {
return sysUserMapper.getAll();
}
4.整合servlet
需要定义一个spring获取bean的工具类
public class SpringUtils {
private static ApplicationContext app = null;
static {
app = new ClassPathXmlApplicationContext("applicationContext.xml");
}
public static <T> T getBean (Class<T> tClass){
return app.getBean(tClass);
}
}servlet代码如下:
@WebServlet("/getuser")
public class UserInfoServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
UserInfoService userInfoService = SpringUtils.getBean(UserInfoService.class);
List<UserInfo> userInfoList = userInfoService.findAll();
req.setAttribute("userInfoList",userInfoList);
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}
前端jso页面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>展示所有的用户</title>
</head>
<body>
<c:if test="${userInfoList == null}">
<c:redirect url="/getuser" />
</c:if>
<table border="1px">
<th>账号</th>
<th>真实姓名</th>
<th>密码</th>
<c:forEach items="${userInfoList}" var="user">
<tr>
<td>${user.account}</td>
<td>${user.realName}</td>
<td>${user.password}</td>
</tr>
</c:forEach>
</table>
</body>
</html>补充
数据源配置destroy-method="close"的作用
将销毁连接的方法关掉,不让它断开连接,只是把Connection对象放到连接池里反复使用,这样才真正发挥了连接池的作用

好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
暂无评论,快来写一下吧
展开评论
您可能感兴趣的博客
他的专栏
他感兴趣的技术

新业务
springboot学习
ssm框架课
vue学习
【带小白】java基础速成