MyBatis和Spring整合+Spring扩展

2023-11-11

ctrl+shift+t搜索类
ctrl+o查看所有的属性和方法
ctrl+t查看继承体系
jar包版本需要一致#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. 理解整合的原理

Mybatis和Spring整合
思路
sqlSessionFactory sqlsession 数据源都交给Spring来管理
数据源交给Spring管理(采用第三方连接池DBCP)
BasicDataSource driverClassName+url+username+password
SqlSessionFactory交给Spring管理
SqlSessionFactoryBean dataSource+typeAliasesPackage+mapperLocations(引入sql映射文件)

1、传统方式的整合
dao层的实现类中 extends SqlSessionDaoSupport类

<!--配置dao  -->
<bean id="userdao" class="cn.dao.UserDaoImpl">
  配置属性sqlSessionFactory
</bean>
 
<!-- 配置service -->
<bean id="userService" class="cn.service.UserServiceImpl">
   <property name="userDao" ref="userdao"></property>
</bean>

2、接口方式的整合
可以不需要配置mapperLocations属性

<!-- 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>

<!-- 配置service -->
<bean id="userService" class="cn.service.UserServiceImpl">
   <property name="userMapper" ref="userMapper"></property>
</bean>

2. 掌握MyBatis和Spring的整合

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

  • 数据源交给Spring来管理 因为SqlSessionFactory对象的获取需要读取配置文件

    <!--环境配置-->   
    <environments default="development">
        <environment id="development">
        <!-- 事务管理器 -->
          <transactionManager type="JDBC"/>
          <!-- 数据源连接池配置 采用的是mybatis内置的连接池 其实还可以采用别的连接池-->
          <dataSource type="POOLED">
            <property name="driver" value="${mysql.driver}"/>
            <property name="url" value="${mysql.url}"/>
            <property name="username" value="${mysql.username}"/>
            <property name="password" value="${mysql.password}"/>
          </dataSource>
        </environment>
      </environments>
    <!-- 引入sql映射文件 -->
    <mappers>
    <package name="cn.kgc.dao"/>
    </mappers>
    
    
  • SqlSessionFactory交给Spring来管理

**整合步骤:**整合完以后 有两种方式可以获取到sqlSession传统的 还有接口 见2.1 2.1

  • 导包:导入MyBatis(+数据驱动包)和Spring的相关包以及MyBatis提供的整合包

    .jar mybatis-spring 从github上进行下载;spring-jdbc ; spring-tx事务

    导包的时候出来 yesToAll 表示覆盖

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

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

  • 在Spring中配置数据源(采用DBCP连接池 导jar包 commons-dbcp,commons-pool);jdbc操作数据的时候采用tomcat内置的,mybatis采用mybatis内置的

    dbcp给我们提供的BasicDataSource-org.apache.commons.dbcp实现了javax.sql.DataSource

复制全类名
(一个数据源不可能平白无故给你创建出来,还需要设置属性)
property name="" 里面的内容就是属性 不是随便起的
class value写了鼠标是可以点过去的

  • 在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映射文件 引入的是xml -->
    	<property name="mapperLocations">
    		<array>
    			<value>cn/kgc/smbms/dao/UserMapper.xml</value>
    			<!--可以写多个value-->
    	  		</array>
    	</property>
    	<!-- 如果你的一些额外配置 不想通过Spring来注入 还是希望采用MyBatis核心配置文件 -->
    	<!-- <property name="configLocation" value="classpath:mybatis-config.xml"></property> -->
    </bean>
    

(以上用的都是设置注入 需要有set方法)

//上面弄完以后 就可以获取到sqlSessionFactory
public static void main(String[] args) {
		ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("applicationContext.xml");
		SqlSessionFactory sqlSessionFactory = ca.getBean(SqlSessionFactory.class);
		System.out.println(sqlSessionFactory);
	}

额外配置的写法
applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xmlns:p="http://www.springframework.org/schema/p"
	   xmlns:context="http://www.springframework.org/schema/context"
	   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
	   http://www.springframework.org/schema/aop
	   http://www.springframework.org/schema/aop/spring-aop.xsd
	   http://www.springframework.org/schema/context
	   http://www.springframework.org/schema/context/spring-context.xsd">

	<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"/>
		
		<!-- 如果你的一些额外配置 不想通过Spring来注入 还是希望采用MyBatis核心配置文件 -->
		 <property name="configLocation" value="classpath:mybatis-config.xml"></property> 
	</bean>
	

	
</beans>



mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<package name="cn.pojo" />
	</typeAliases>
	<!-- 引入映射文件 路径是可以点过去的 -->
	<mappers>
		<package name="cn.dao"/>
	</mappers>
</configuration>

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

测试方法同上

2.1 传统方式的整合[了解,它和Hibernate与Spring整合思路基本一致]

读取配置文件 获取sqlSessionFactory对象

sqlSessionFactory接口 ,实现类SqlSessionFactoryBean
属性1、typeAliases : Class<?>[] 不推荐 建议使用typeAliasesPackage : String 类型别名
2、 mapperLocations : Resource[]
3、 DataSource datasource
4、 configLocation 引入额外的配置 一般有这个 就不要前面的两个了

DataSource 接口,实现类BasicDataSource 属性 driverClassName,url,username,password

1、传统方式的整合
sqlSession接口 ,实现类SqlSessionTemplate 属性 构造方法sqlSessionFactory

SqlSessionDaoSupport 属性 sqlSessionFactory


最开始的方法1:
有的时候 不要看见接口 看见对应的xml文件 就是接口方式开发 这里采用的是传统方式开发
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xmlns:p="http://www.springframework.org/schema/p"
	   xmlns:context="http://www.springframework.org/schema/context"
	   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
	   http://www.springframework.org/schema/aop
	   http://www.springframework.org/schema/aop/spring-aop.xsd
	   http://www.springframework.org/schema/context
	   http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- 数据源交给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>
	
	<!-- SqlSession交给Spring管理 -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory"></constructor-arg>
	</bean> 
	
	<!--配置dao  -->
	<bean id="userdao" class="cn.dao.UserDaoImpl">
	   <property name="sqlSessionTemplate" ref="sqlSession"></property>
	</bean>
	
	<!-- 配置service -->
	<bean id="userService" class="cn.service.UserServiceImpl">
	   <property name="userDao" ref="userdao"></property>
	</bean>
	
</beans>

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:用于在内存中区分具体SQL映射文件的 -->
<mapper namespace="userMapper">
<select id="getUserList" resultType="cn.pojo.User">
		select 
			*
		from 
			smbms_user
	</select>
	

</mapper>

在这里插入图片描述

ca.getBean()这个方法从spring容器中获取xx对象
有的时候报错可能不是配置文件的错 是这个方法的错
规范写法
UserService userService = ca.getBean("userService",UserService.class);

我要是写一个RolrServiceImplimplements UserService  上面方法就比较规范

在这里插入图片描述
最开始的方法2:
在上面基础上进行修改

准备dao接口+实现类,实现类中继承SqlSessionDaoSupport this.SqlSession.xxx方法执行sql语句

public class UserDaoImpl  extends SqlSessionDaoSupport implements UserDao{
	
	public List<User> getUserList()throws Exception {
		return  this.getSqlSession().selectList("usermapper.getUserList");
	}
}


配置文件只需要改变他们
<!-- SqlSession交给Spring管理 -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory"></constructor-arg>
	</bean> 
	
	<!--配置dao  -->
	<bean id="userdao" class="cn.dao.UserDaoImpl">
	   <property name="sqlSessionTemplate" ref="sqlSession"></property>
	</bean>
	
	<!-- 配置service -->
	<bean id="userServivce" class="cn.service.UserServiceImpl">
	   <property name="userDao" ref="userdao"></property>
	</bean>

改成:
	<!--配置dao  -->
	<bean id="userdao" class="cn.dao.UserDaoImpl">
	   <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
	</bean>
	
	<!-- 配置service -->
	<bean id="userService" class="cn.service.UserServiceImpl">
	   <property name="userDao" ref="userdao"></property>
	</bean>

2.2 接口方式的整合[掌握]

读取配置文件 获取sqlSessionFactory对象

sqlSessionFactory接口 ,实现类SqlSessionFactoryBean
属性typeAliases : Class<?>[] 不推荐 建议使用typeAliasesPackage : String 类型别名
mapperLocations : Resource[]
DataSource datasource
configLocation 引入额外的配置 一般有这个 就不要前面的两个了

DataSource 接口,实现类BasicDataSource 属性 driverClassName,url,username,password

2、接口方式开发
MapperFactoryBean---->产生对应接口 属性mapperInterface+sqlSessionFactory 只会生成一个接口

MapperScannerConfigurer---->产生对应接口 属性basePackage
生成多个


接口开发 方法1:

public interface UserMapper {

	List<User> getUserList()throws Exception;
}

User.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:用于在内存中区分具体SQL映射文件的 -->
<mapper namespace="cn.dao.UserMapper">
<select id="getUserList" resultType="cn.pojo.User">
		select 
			*
		from 
			smbms_user
	</select>
</mapper>
sqlSession.getMapper(接口.class);

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xmlns:p="http://www.springframework.org/schema/p"
	   xmlns:context="http://www.springframework.org/schema/context"
	   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
	   http://www.springframework.org/schema/aop
	   http://www.springframework.org/schema/aop/spring-aop.xsd
	   http://www.springframework.org/schema/context
	   http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- 数据源交给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>
	
		<!--配置dao  -->
	<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
	     <!-- 指定好接口全类名 -->
	   <property name="mapperInterface" value="cn.dao.UserMapper"></property>
	   <!--因为MapperFactoryBean 继承了SqlSessionDaoSupport类 所以可以采用下方注入  -->
	   <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
	</bean>
	
	<!-- 配置service -->
	<bean id="userService" class="cn.service.UserServiceImpl">
	   <property name="userMapper" ref="userMapper"></property>
	</bean>
	
	
</beans>
测试:

    public static void main(String[] args) throws Exception {
    		ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("applicationCOntext.xml");
    		UserMapper userMapper = ca.getBean(UserMapper.class);
    		List<User> list = userMapper.getList();
    		for (User user : list) {
    			System.out.println(user);
    		}
    	}
未来如果还有其他mapper 那么用起来就不方便了 下面是改进也就是下面的接口开发2   	取代了<!--配置dao  -->的过程+	<!-- 引入Sql映射文件 -->的过程



<!-- 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>

接口开发 方法2:

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

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xmlns:p="http://www.springframework.org/schema/p"
	   xmlns:context="http://www.springframework.org/schema/context"
	   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
	   http://www.springframework.org/schema/aop
	   http://www.springframework.org/schema/aop/spring-aop.xsd
	   http://www.springframework.org/schema/context
	   http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- 数据源交给Spring管理(采用第三方连接池DBCP) -->
	<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName" value="java:comp/env/jdbc-mysql"/>
	</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>
	
	
	<!-- 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>

<!-- 配置service -->
	<bean id="userService" class="cn.service.UserServiceImpl">
	   <property name="userMapper" ref="userMapper"></property>
	</bean>
	
</beans>

##############################################################
db.properties

# MySQL Config
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql:///smbms
mysql.username=root
mysql.password=root

整合的时候可以这样写·

<!-- 引入外部的数据源文件  需要一个声明在开头 spring-context.xsd-->
	<context:property-placeholder location="classpath:db.properties"/>
	<!--1.将数据源交给spring进行管理 采用dbcp连接池  -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	<property name="driverClassName" value="${mysql.driver}"/>
	<property name="url" value="${mysql.url}"/>
	<property name="username" value="${mysql.username}"/>
	<property name="password" value="${mysql.password}"/>
	</bean>

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

aop主要功能
日志记录,性能统计,安全控制,事务处理,异常处理等等。

AOP动态的织入一些功能 而不影响你现在的代码
事务是写在业务逻辑层的service
出现异常以后 会报错 但是他还会提交成功,这就需要事务
会报错 但是不会提交成功

声明式事务需要一个额外的命名空间tx

xmlns:tx="http://www.springframework.org/schema/tx"
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx.xsd">

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
	
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 声明式事务的规则配置 -->
	<!-- transaction-manager的具体位置 上面的id值不用写 在配置他的会自动出来 -->
<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.service..*.*(..))" id="txPointCut"/>
		<!-- 引用事务通知 -->
	<aop:advisor advice-ref="tx-advice" pointcut-ref="txPointCut"/>
</aop:config>
	
	<!-- ++++++++++++++++++以上为新增内容+++++++++++++++++++++++++++++++++++++++ -->
	
	<!-- 0.实现数据源信息外部引入 -->
	<context:property-placeholder location="classpath:db.properties"/>
	
	<!-- 1.将数据源交给Spring来管理 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${jdbc.driver}"/>
		<property name="url" value="${jdbc.url}"/>
		<property name="username" value="${jdbc.username}"/>
		<property name="password" value="${jdbc.password}"/>
	</bean>

	<!-- 2.SqlSessionFactory对象的创建交给Spring来管理 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"></property>
		<!-- 类型别名 -->
		<property name="typeAliasesPackage" value="cn.pojo"/>
		
	</bean>
	
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 会自动扫描dao包和子包下的同名同包绑定的接口和XML 用于产生Mapper接口对象 -->
		<property name="basePackage" value="cn.dao"/>
	</bean>
	
	<!-- 配置service -->
	<bean id="userService" class="cn.service.UserServiceImpl">
	   <property name="userMapper" ref="userMapper"></property>
	</bean>
</beans>

声明式事务还可以使用注解方式

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
	
	
	<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
	
	<!-- 实现数据源信息外部引入 -->
	<context:property-placeholder location="classpath:db.properties"/>
	
	<!-- 1.将数据源交给Spring来管理 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${jdbc.driver}"/>
		<property name="url" value="${jdbc.url}"/>
		<property name="username" value="${jdbc.username}"/>
		<property name="password" value="${jdbc.password}"/>
	</bean>

	<!-- 2.SqlSessionFactory对象的创建交给Spring来管理 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"></property>
		<!-- 类型别名 -->
		<property name="typeAliasesPackage" value="cn.pojo"/>
		
	</bean>
	
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 会自动扫描dao包和子包下的同名同包绑定的接口和XML 用于产生Mapper接口对象 -->
		<property name="basePackage" value="cn.dao"/>
	</bean>
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->	
	<!-- 启用IOC注解扫描 -->
	<context:component-scan base-package="cn.service"></context:component-scan>
	
	<!-- 声明式事务 -->
	<!-- 1.配置事务管理器 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 启用注解annotaiton式声明式事务 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
	
</beans>

有了ioc注解以后 这个代码就不需要写了,此外采用注解方式,事务还要加上transaction注解 有的时候配置文件会因为位置问题报错
在这里插入图片描述

@Service("userService")
public class UserServiceImpl implements UserService {
	@Resource
	private UserMapper userMapper;

	//如果未来都是事务 可以统一把他加到类上面
	@Transactional
	@Override
	public boolean addUser(User user) throws Exception {
		int row = userMapper.add(user);
		//int i = 1 / 0;
		return row > 0;
	}
//写了注解以后set就不需要了
	/*public UserMapper getUserMapper() {
		return userMapper;
	}

	@Transactional(readOnly=true)
	public void setUserMapper(UserMapper userMapper) {
		this.userMapper = userMapper;
	}
*/
}

在这里插入图片描述

4. Spring的扩展

ctrl+t查看继承体系 如果所继承的父类里面没有对应的属性 可以去另外他的上面查找
在这里插入图片描述

<!-- 实现数据源信息外部引入1 -->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:db.properties"></property>
	</bean>
<!-- 实现数据源信息外部引入2 -->
	<context:property-placeholder location="classpath:db.properties"/>
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"/>

在这里插入图片描述
JndiObjectFactoryBean里面没有合适的属性 我们去他的父类里面找
在这里插入图片描述

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
	

	<!-- JNDI实际上用的是里面tomcat jdbc的连接池 -->
	<!-- 实现数据源信息外部引入 JNDI-->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:db.properties"></property>
	</bean>
	
	<!-- 1.将数据源交给Spring来管理  java:comp/env/为固定前缀-->
	<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName" value="java:comp/env/jdbc-mysql"></property>
	</bean>

	<!-- 2.SqlSessionFactory对象的创建交给Spring来管理 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource"></property>
		<!-- 类型别名 -->
		<property name="typeAliasesPackage" value="cn.pojo"/>
		
	</bean>
	
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 会自动扫描dao包和子包下的同名同包绑定的接口和XML 用于产生Mapper接口对象 -->
		<property name="basePackage" value="cn.dao"/>
	</bean>
	
	<!-- 配置service -->
	<bean id="userService" class="cn.service.UserServiceImpl">
	   <property name="userMapper" ref="userMapper"></property>
	</bean>
</beans>

**注意:**必须经由Tomcat服务器之后,Spring才可以使用到JNDI资源。测试的时候可以这样测试


import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.pojo.User;
import cn.service.UserService;

@WebServlet(name = "jndi", urlPatterns = "/jndi")
public class JNDIServlet extends HttpServlet{
	
	
	//localhost:8080/spring/jndi
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("applicationContext.xml");
	    UserService userService = ca.getBean("userService",UserService.class);
	  //  UserService userService = ca.getBean(UserService.class);
		try {
			List<User> list = userService.getUserList();
			System.out.println(list.get(0).getPhone());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		super.doGet(req, resp);
	}

}

借助Tomcat
在这里插入图片描述

   <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"/>

proxy代理

4.2 Spring的bean作用域

在这里插入图片描述

request线程级别的
红线圈住的仅适用于WebApplicationContext环境

// 如果想更改默认的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要配置好非自动注入。
在这里插入图片描述在这里插入图片描述

`在上述中
表示此xml文件中的所有bean元素 会采用自动注入
<beans default-autowire="default">
</beans>
针对别的 如果不用用自动注入 设置为no
<beans default-autowire="byName">
	<bean id="" class="" autowire="no"/>
</beans>
4.4 Spring文件拆分(掌握)

在这里插入图片描述

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

拆分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

未来如果ssm整合的时候,在web.xml中需要加载多个配置文件时,可以用applicationContext-*
拆分后,加载配置文件的策略:

方案一:拆分后获取多个配置文件(使用spring重载资源API 同时加载多个资源文件)可变参
在这里插入图片描述
在这里插入图片描述

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

<import resource="applicationContext-dao.xml"/>
<import resource="applicationContext-service.xml"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis和Spring整合+Spring扩展 的相关文章

  • Google App Engine 数据存储写入:如何远程启用/禁用只读模式?

    在阅读备份时GAE 的数据存储 https developers google com appengine docs adminconsole datastoreadmin where 我们强烈建议您在备份或恢复期间将应用程序设置为只读模式
  • Java中如何合并两个数组?

    它不是连接而是合并两个数组 使它们成为名称值对的数组 firstarray a aa aaa secondarray b bb bbb result a b aa bb aaa bbb 最好的方法是什么 in Java public sta
  • Spring MVC - 自动查找验证器

    假设我有一个像这样的示例实体类 public class Address 和相应的验证器 Component public AddressValidator implements Validator Override public bool
  • Java中如何对对象数组进行排序?

    我的数组不包含任何字符串 但它包含对象引用 每个对象引用都通过 toString 方法返回名称 id 作者和发布者 public String toString return name n id n author n publisher n
  • Mediaplayer 播放几次后停止播放

    我有一个按钮 按下它会播放一个随机声音剪辑 然后播放另一个声音剪辑 然后通过一个媒体播放器播放另一个声音剪辑 但是多次按下该按钮 15 20 次 后 所有音频都会停止 我在播放最后一个音频剪辑后释放媒体播放器 所以我不认为这是原因 有什么指
  • 如何访问EmbeddedSolrServer实例的管理界面?

    在我的网络应用程序中 我正在运行org apache solr client solrj embedded EmbeddedSolrServer出于调试目的 我想访问管理界面 这就是我实例化服务器的方式 new EmbeddedSolrSe
  • 在 Spring Webflux 中执行阻塞 JDBC 调用

    我使用 Spring Webflux 和 Spring data jpa 使用 PostgreSql 作为后端数据库 我不想在进行数据库调用时阻塞主线程 例如find and save 为了实现同样的目标 我有一个主调度程序Controll
  • 在 Java 中生成 LaTeX 输出 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有用于从 Java 生成 LaTeX 输出的 Java 库 渲染乳胶 JLatex数学 https
  • Spring 中的声明式或编程式事务

    在Spring中我们应该使用什么类型的事务管理策略 声明式还是程序式 哪一种更好 在什么情况下应该使用它 你能给出任何适当的例子或教程吗 还想知道在spring写数据库代码时最新应该使用什么东西 HibernateTemplate 的替代方
  • Java 套接字 - 读和写

    问题 客户端没有收到任何消息 这是客户端和服务器的完整代码 CLIENT public class Client extends Socket public Client String hostName int port throws Un
  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • 在实现接口的类上强制使用单例模式

    我最好用一个例子来解释这个问题 我有一个接口模型可用于访问数据 模型可以有不同的实现 可以以各种格式表示数据 例如 XMl txt 格式等 Model不关心格式 可以说这样的一个实现是myxml模型 现在我想强迫myxml模型以及其他所有实
  • Java MYSQL/JDBC 查询从缓存的连接返回过时的数据

    我一直在 Stackoverflow 中寻找答案 但似乎找不到不涉及 Hibernate 或其他数据库包装器的答案 我直接通过 Tomcat 6 Java EE 应用程序中的 MYSQL 5 18 JDBC 驱动程序使用 JDBC 我正在缓
  • Java/Hibernate - 异常:内部连接池已达到其最大大小,当前没有可用的连接

    我第一次在大学项目中使用 Hibernate 而且我还是个新手 我想我遵循了我的教授和我阅读的一些教程给出的所有指示 但我不断收到标题中的异常 Exception in thread main org hibernate Hibernate
  • 从 Java 应用程序读取的文件是否会调用系统调用?

    我的理解是 请求文件系统路径 例如 aFile 的用户应用程序将调用文件系统并获取所请求文件的虚拟地址 然后应用程序将尝试以该地址作为参数 即作为 CPU 指令 进行读 写操作 执行读取命令时 内存管理单元会将该地址转换为物理地址 并查看页
  • Java 9:AES-GCM 性能

    我进行了一个简单的测试来测量AES GCM https en wikipedia org wiki Galois Counter Mode表现在Java 9 通过在循环中加密字节缓冲区 结果有些令人困惑 本机 硬件 加速似乎有效 但并非总是
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie
  • ImageIO.read(...) - 非常慢,有更好的方法吗?

    我正在加载大量将在我的应用程序中使用的图标 我计划在服务器启动时从 jar 中加载所有这些 然而 由于数百张图像加起来刚刚超过 9MB 执行此任务仍然需要 30 秒多的时间 我现在正在一个单独的线程中执行此操作 但这让我想知道我是否在代码中
  • 为什么我们不能在函数式接口中重载抽象方法? (爪哇)

    所以我熟悉java中的函数式接口 以及它们与lambda表达式的使用 一个函数式接口只能包含一个抽象方法 当从 lambda 表达式使用这一孤独方法时 您不需要指定其名称 因为接口中只有一个抽象方法 编译器知道这就是您正在引用的方法 Exa

随机推荐

  • 专业三复习

    mysql复习 C Users 86131 gt mysql uroot proot C Users 86131 gt mysql uroot proot mysql gt show databases Database informati
  • [MySQL]获取某个字段中某个字符的个数

    例 获取account name字段中 的个数 select length account name length REPLACE account name from user
  • 【LeetCode算法系列题解】第6~10题

    CONTENTS LeetCode 6 N 字形变换 中等 LeetCode 7 整数反转 中等 LeetCode 8 字符串转换整数 atoi 中等 LeetCode 9 回文数 简单 LeetCode 10 正则表达式匹配 困难 Lee
  • RabbitMQ-TTL消息存活时间

    文章目录 TTL是什么 TTL的测试 小结 TTL是什么 TTL全称Time To Live 存活时间 过期时间 当消息到达存活时间后 还没有被消费 会被自动清除 RabbitMQ可以对消息设置过期时间 也可以对整个队列 Queue 设置过
  • MapReduce的基本工作原理

    MapReduce的基本模型和处理思想 三个层面上的基本构思 1 如果对付大数据处理 分而治之 对相互之间不具有计算依赖关系的大数据 实现并行最自然的办法就是采取分而治之的策略 2 上升到抽象模型 Mapper与Reduce MPI等并行计
  • 那些配置服务器踩的坑

    最近在配置内网 无外网的服务器 纯纯记录一下踩得坑 希望看到的人不要再走这条弯路 任务 对接在目标服务器部署目标sdk 第一天 由于服务器是十分保密的 且通过层层套娃才能传到
  • spark任务执行过程中经常性的failed但是任务并没有失败最后总能跑完

    1 现象场景 在spark执行程序中会看到很多的failed但是过程能正常执行完 spark任务执行过程中经常性的failed但是任务并没有失败最后总能跑完 查看如下 ExecutorLostFailure executor 11 exit
  • 数字盲打怎么练_键盘上的数字键怎么练才能盲打?

    展开全部 副键盘的数字键练习 保证数32313133353236313431303231363533e4b893e5b19e31333431363663字锁定键指示灯亮 如果没有亮 需要按一次 Num Lock 键 使小键盘区为数字输入状态
  • 2020.9.17课堂笔记(Hive数据库常用DDL操作)

    数据库基本操作database 数据库模式定义语言DDL Data Definition Language 是用于描述数据库中要存储的现实世界实体的语言 create database if not exists 数据库名 创建数据库 sh
  • java如何合并_Java中如何把两个数组合并为一个

    在Java中 如何把两个String 合并为一个 看起来是一个很简单的问题 但是如何才能把代码写得高效简洁 却还是值得思考的 这里介绍四种方法 请参考选用 一 apache commons 这是最简单的办法 在apache commons中
  • numpy找非零元素并计数 numpy.nonzero 和 numpy.count_nonzero

    numpy nonzero a Return the indices of the elements that are non zero 示例 x np array 3 0 0 0 4 0 5 6 0 np nonzero x array
  • OCR图像识别技术的JAVA实现(一)

    转自 https blog csdn net weistin article details 78839804 OCR图像识别技术的JAVA实现 最近有个需求需要用图像识别 学习记录一下 目前网络上的开源的图像识别技术有很多 例如 OCRE
  • win10系统下 VS2019点云库PCL1.12.0的安装与配置

    目录 版本信息 安装教程 环境变量设置 VS中PCL的配置 使用 PCL的简单demo PCL简介 点云库全称是Point Cloud Library PCL 是一个独立的 大规模的 开放的2D 3D图像和点云处理项目 PCL根据BSD许可
  • 微信errcode大全

    errArr 1 gt errMsg system error errDesc 系统繁忙 此时请开发者稍候再试 40009 gt errMsg Invalid image size errDesc 图片大小为0或者超过1M 40097 gt
  • oracle open resetlogs

    oracle数据库在使用alter database open resetlogs后 oracle会重置日志序列号 而且会重置 联机重做日志内容 这样做是为了防止不完全恢复后日志序列会发生冲突 所以在执行完resetlogs后 需要重新备份
  • Win7专业版 下安装ArcGIS 9.3总结

    这几天在Win7专业版下安装ArcGIS 9 3 简直逼疯我了 废话不多说 进入正题 边说遇见问题边说步骤和解决方法 1 下载破解文件 下载地址http download csdn net source 3117196 有以下文件夹 图1
  • 【目标检测】24、VarifocalNet: An IoU-Aware Dense Object Detector

    文章目录 一 背景 二 动机 三 方法 3 1 IACS IoU Aware Classification Score 3 2 Varifocal loss 3 3 Star Shaped Box Feature Representatio
  • ios-swift-导入Alamofire出坑

    前言 在最近的swift项目中要用到网络请求 就用到了Alamofire网络库 是AFNetworking库的swift版本 将Alamofire利用Cocoapods导入到项目里面 总是下载不了新的版本 下载不了新的版本就是报错 我用的x
  • Jenkins 配置邮件通知

    1 安装邮件插件 通过系统管理 管理插件 可选插件 选择Email Extension Plugin插件进行安装 2 系统配置 系统管理 系统设置
  • MyBatis和Spring整合+Spring扩展

    ctrl shift t搜索类 ctrl o查看所有的属性和方法 ctrl t查看继承体系 jar包版本需要一致 MyBatis和Spring整合 在配置文件中 不要写空格 空格也会被解析 JavaSE基础内容 Java语法阶段 Java是