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扩展 的相关文章

  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 专业三复习

    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是