69 MyBatis和Spring整合

69 MyBatis和Spring整合

JavaSE基础内容
Java语法阶段

​ Java是什么。HelloWorld

​ 程序是来源于并超脱于现实生活的,它其实是用来帮助我们处理数据。(CRUD) ,变量它是我们程序在处理数据时最基础的最单一的一种方式。数据类型,运算符。

选择结构 键盘录入

循环结构

循环进阶(多重循环和断点调试)

数组

Java面向对象阶段

类和对象(我们以后编写程序 要尽可能学会进行封装)

封装,继承和多态

抽象和接口

异常

Java高级特性

集合(高级存储方式)

实用类

IO流

多线程

网络编程

XML

数据库阶段
MySQL

Java和数据连接 JDBC

DAO模式

前端阶段:三剑客 HTML5 CSS3 JS
JavaWeb阶段:

服务器

动态页面技术JSP

第三方组件

分页实现

分层架构

EL和JSTL

过滤器 监听器

Ajax

Linux

Java框架阶段:SSM框架

MyBatis 简化DAO层实现

Spring 使用IoC和AOP简化我们对象的生命周期管理和冗余功能的解耦。

1.理解整合的原理

利用Spring的IoC和AOP特性整合

IoC:控制反转,DI依赖注入,以前我们自己维护一个对象的生命周期,现在交给Spring IoC容器管理。

MyBatis:

导包

编写核心配置文件:数据源配置,其他额外配置。(用于加载SqlSessionFactory对象)

编写POJO和SQL映射文件

使用API

SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(核心配置文件)
SqlSession SqlSession = ssf.openSession();
//.....
sqlSession.close();

2.掌握MyBatis和Spring的账号

整合思路:SqlSessionFactory对象 由Spring IoC来帮你创建,SqlSession对象由IoC来帮你创建。

​ 数据源交给Spring来处理

​ SqlSessionFactory交给Spring来管理

整合步骤:

导包:导入MyBatis和Spring的相关包以及MyBatis提供的整合包

编写MyBatis和Spring的核心配置文件 以及其他的一些日志等配置文件。

将MyBatis环境准备好(POJO.Mapper文件等)

在Spring中配置数据源(采用DBCP连接池)

在Spring中配置SqlSessionFactory(采用整合包中的SqlSessionFactoryBean)

<!-- 数据源交给Spring管理(采用第三方连接池DBCP) --
><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
<property name="url" value="jdbc:mysql:///smbms"/>    <property name="username" value="root"/>  
<property name="password" value="root"/>
</bean>



​<!-- SqlSessionFactory交给Spring管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    
<!-- 注入数据源 -->   
<property name="dataSource" ref="dataSource"/>   
<!-- 类型别名 -->   
<property name="typeAliasesPackage" value="cn.kgc.smbms.pojo"/>  
<!-- 引入Sql映射文件 -->    
<property name="mapperLocations">     
<array>            <value>cn/kgc/smbms/dao/UserMapper.xml</value>        </array>    
</property>   
<!-- 如果你的一些额外配置 不想通过Spring来注入 还是希望采用MyBatis核心配置文件 -->  
<!-- <property name="configLocation" value="classpath:mybatis-config.xml">
</property> -->
</bean>
2.1 传统方式的整合[了解,它和Hibernate与Spring整合思路基本一致]
sqlSession.selectList("Mapper文件的namespace名和对应SQL语句的标识");
sqlSession.selectOne();

SqlSessiom对象的获取(SqlSessionTemplate)

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"></constructor-arg>
</bean>

这样我们就可以在每一个DAO中去准备一个属性,然后注入好SqlSession,就可以使用了。

public class UserDaoImpl implements UserDao {

	// DAO注入一下即可
	private SqlSessionTemplate sqlSession;
	
	@Override
	public List<User> getList() throws Exception {
		return sqlSession.selectList("userdao.getList");
	}

	public SqlSessionTemplate getSqlSession() {
		return sqlSession;
	}

	public void setSqlSession(SqlSessionTemplate sqlSession) {
		this.sqlSession = sqlSession;
	}

}


但是每次都要在不同的DAO中准备一个额外的属性,感觉非常麻烦,所以我们可以使用SqlSessionDaoSupport类来简化。

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

	@Override
	public List<User> getList() throws Exception {
		return getSqlSession().selectList("userdao.getList");
	}

}
<bean id="userDao" class="cn.kgc.smbms.dao.UserDaoImpl">
		<property name="sqlSessionFactory" ref="sqlSessionFactory">
		</property>
	</bean>
2.2 接口方式的整合[掌握]
sqlSession.getMapper(接口.class);
<!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
	指定好接口全类名
	<property name="mapperInterface" value="cn.kgc.smbms.mapperdao.UserMapper"></property>
	因为MapperFactoryBean 继承了SqlSessionDaoSupport类 所以可以采用下方注入
	<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean> -->

<!-- Mapper扫描器 可以帮你自动生成上方的MapperBean对象  它生成的MapperBean会自动以对应的接口的小驼峰来命名bean的id -->	
<!-- Mapper接口和XML必须同名同包 否则扫描失败 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<!-- 配置接口扫描位置 -->
	<property name="basePackage" value="cn.kgc.smbms.mapperdao"></property>
	<!-- 不需要注入SqlSessionFactory对象了 它是默认按照类型查找 -->
</bean>

Mapper接口的配置替代掉了以前的DAO.(MapperFactoryBean)

但是一个个的接口配置非常麻烦,所以可以使用扫描(MapperScannerConfigurer).

3.掌握声明式事务的使用(AOP)

<!-- 配置声明式事务(AOP) -->
<!-- 配置事务管理器(相当于我们前面自己编写的增强处理类) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 声明式事务的规则配置 -->
<tx:advice id="tx-advice" transaction-manager="transactionManager">
	<tx:attributes>
		<!-- 
			下方的规则表示 如果查找到add系列的方法 则开启事务管理...
			如果查找到get系列的方法 则不开启事务管理
			而如果查找到的方法不符合这些系列 则默认开始事务管理
		 -->
		<tx:method name="add*"/>
		<tx:method name="update*"/>
		<tx:method name="delete*"/>
		<!-- 查询方法不需要事务管理 -->
		<tx:method name="get*" read-only="true"/>
		<tx:method name="*"/>
	</tx:attributes>
</tx:advice>

<!-- 配置AOP -->
<aop:config>
	<aop:pointcut expression="execution(* cn.kgc.smbms.service..*.*(..))" id="txPointCut"/>
	<!-- 引用事务通知 -->
	<aop:advisor advice-ref="tx-advice" pointcut-ref="txPointCut"/>
</aop:config>
<!-- 配置声明式事务(AOP) -->
<!-- 配置事务管理器(相当于我们前面自己编写的增强处理类) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
	
<!-- 启用注解式声明式事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

4. Spring的扩展

4.1 JDNI配置

JNDI(Java Naming and Directory Interface)Java命名和目录接口

我们可以使用JNDI来实现对于资源的共享,之前我们学习JNDI就是为了使用Tomcat内置的连接池(DBCP)。

<Resource 
		name="jdbc-mysql"
    	type="javax.sql.DataSource"
    	auth="Container" 
    	driverClassName="com.mysql.jdbc.Driver" 
    	url="jdbc:mysql:///smbms?useUnicode=true&amp;characterEncoding=utf-8"
    	username="root" 
    	password="root"
    	maxActive="100" 
    	maxIdle="30" 
    	maxWait="10000"/>

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName" value="java:comp/env/jdbc-mysql"/>
	</bean>

注意经由Tomcat服务器之后,Spring才可以使用到JNDI资源。

4.2 Spring的bean作用域
// 如果想更改默认的bean作用域 就在对应的bean的配置上添加scope="prototype"
<bean id="userService" class="" scope="prototype"></bean>
@Service
@Scope("prototype")
public class UserServiceImpl impl....

4.3 Spring自动注入

在这里插入图片描述

在这里插入图片描述

我们以前纯XML形式开发,需要自行配置service,dao的bean组件,然后自己进行依赖注入,而现在如果采用了自动注入,那么你就不需要再去配置依赖注入了,只需要配置好bean组件即可。

自动注入有几种选项:

byName 按照属性名称来自动注入信息

byType 按照属性类型来自动注入信息

constructor 构造自动注入
在这里插入图片描述

注意:如果开启了全部的自动注入,需要保证 那些不需要的bean要配置
<beans default-autowire="byName">
	<bean id="" class="" autowire="no"/>
</beans>

4.4 Spring文件拆分(掌握)

我们在项目开发中,未来配置越来越多,有些时候,如果所有的配置都放在一起。不方便我们进行维护,同样也不方便团队开发,所以当配置内容到达一定程度之后,我们可以对配置文件进行拆分。

拆分1:按照分层架构拆分

​ applicationContext-controller.xml

​ applicationContext-servive.xml

​ applicationContext-dao.xml

​ applicationContext-basic.xml

拆分2:按照模板拆分

applicationContext-user.xml

applicationContext-role.xml

applicationContext-provider.xml

applicationContext-basic.xml

拆分后,加载配置文件的策略:

1.在某个配置文件中 引入其他的拆分后的配置,然后加载单一的配置文件即可

<import resource="applicationContext-dao.xml"/>
<import resource="applicationContext-service.xml"/>
  1. 使用Spring的重载的加载资源API,同时加载多个资源配置文件

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值