MyBatis和Spring整合

MyBatis和Spring整合

JavaSE基础内容

Java语法阶段

  • Java是什么,HelloWorld
  • 程序是来源于并超脱于现实生活的,它其实是用来帮助我们处理数据。(CRUD),变量它是我们程序在处理数据时最基础的最单一的一种方式。数据类型、运算符。
  • 选择结构 键盘录入
  • 循环结构
  • 循环进阶(多重循环和断点调试)
  • 数组

Java面向对象阶段

  • 类和对象(我们以后编写程序 要尽可能学会进行封装)
  • 封装、继承和多态
  • 抽象和接口
  • 异常

Java高级特性

  • 集合(高级存储方式)
  • 实用类
  • IO流
  • 多线程
  • 网络编程
  • XML

数据库阶段

  • MySQL
  • Java和数据连接 JDBC
  • DAO模式

前端阶段:三剑客 HTML5 CSS3 JS

JavaWeb阶段:

  • 服务器
  • 动态页面技术 JSP
  • 第三方组件
  • 分页实现
  • 分层架构
  • EL和JSTL
  • Servlet
  • 过滤器 监听器
  • 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();
  • SqlSession对象的获取(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 JNDI数据源配置

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自动注入

[外链图片转存失败(img-tlowMBnJ-1564897670849)(assets/1564892081079.png)]

我们以前纯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-service.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,同时加载多个资源配置文件
  • 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、付费专栏及课程。

余额充值