zoukankan      html  css  js  c++  java
  • Spring+Mybatis整合

    导入spring相关jar包

    aspectjweaver.jar
    spring-aop-4.3.25.RELEASE.jar
    spring-aspects-4.3.25.RELEASE.jar
    spring-beans-4.3.25.RELEASE.jar
    spring-context-4.3.25.RELEASE.jar
    spring-context-support-4.3.25.RELEASE.jar
    spring-core-4.3.24.RELEASE.jar
    spring-expression-4.3.24.RELEASE.jar
    spring-jdbc-4.3.24.RELEASE.jar
    spring-orm-4.3.24.RELEASE.jar
    spring-oxm-4.3.24.RELEASE.jar
    spring-tx-4.3.24.RELEASE.jar
    

    Mybatis核心jar包

    mybatis-3.5.2.jar
    

    JDBC包

    mysql-connector-java-5.1.47.jar
    

    日志包

    commons-logging-1.2.jar
    log4j-1.2.17.jar
    log4j-api-2.11.2.jar
    log4j-core-2.11.2.jar
    

    分页插件:PageHelper

    jsqlparser-2.1.jar
    pagehelper-5.1.10.jar
    

    spring-mybatis整合包

    mybatis-spring-1.3.3.jar
    

    编写代码

    编写配置文件

    jdbc配置文件

    # 第一行不要写代码,不同的环境下可能导致无法解析
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://127.0.0.1:3306/stmng?useUnicode=true&characterEncoding=utf8&useSSL=true
    jdbc.username=root
    jdbc.password=root
    

    log4J配置文件

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # MyBatis logging configuration...
    log4j.logger.org.mybatis.example.BlogMapper=TRACE
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
    

    Mybatis配置文件

    核心配置文件

    <?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">
      <!-- mybatis 核心配置文件  数据持久化层配置信息 -->
    <configuration>
    	
    	<!-- 配置分页插件 -->
    	<plugins>
    		<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    	</plugins>
    	
    	<mappers>
    		<mapper resource="mapper/UserMapper.xml"/>
    	</mappers>
    </configuration>
    

    映射文件:

    <?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">
     <!-- orm 映射文件  -->
     <!-- 此时映射文件的 namespace的值是  mapper 接口的全路径 -->
    <mapper namespace="com.sxt.mapper.UserMapper">
    	<select id="selectAll" resultType="com.sxt.pojo.User" >
    		select id as id, user_name as userName, password as password,real_name as realName from user
    	</select>
    </mapper>
    

    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"
    	xmlns:aop="http://www.springframework.org/schema/aop"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    	xmlns:oxm="http://www.springframework.org/schema/oxm"
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xsi:schemaLocation="http://www.springframework.org/schema/oxm https://www.springframework.org/schema/oxm/spring-oxm.xsd
    		http://www.springframework.org/schema/jdbc https://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
    		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
    		http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd
    		http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd">
    	<!-- 引入jdbc配置文件 -->
    	<context:property-placeholder location="classpath:jdbc.properties" system-properties-mode="FALLBACK" />
    	<!-- 
    		整合Mybatis  数据库操作的框架
    			1. 配置数据源
    			2. 创建SqlSessionFactoryBuilder
    			3. 创建SqlSessionFactory
    			4. 创建SqlSession
    			5. 根据SqlSession 创建  Mapper 代理类对象   // 生成 mapper的代理类对象
    	 -->
    	<!-- 配置数据源 -->
    	<bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName" value="${jdbc.driver}"></property>
    		<property name="url" value="${jdbc.url}"></property>
    		<property name="username" value="${jdbc.username}"></property>
    		<property name="password" value="${jdbc.password}"></property>
    	</bean>
    	<!-- 
    		创建SqlSessionFactory
    			1. 资源配置文件 mybatis 核心配置文件
    			2. mapper 映射文件
    			3. 数据源
    			4. 事务管理器
    	 -->
    	 <!-- 配置数据库事务管理器 -->
    	 <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	 	<property name="dataSource" ref="dataSource"></property>
    	 </bean>
    	<!-- sqlSessionFactory -->
    	<bean id="sqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean"  >
            <!-- 注入数据源 -->
            <property name="dataSource" ref="dataSource"></property>
            <!-- 配置mybatis的核心配置文件 -->
    		<property name="configLocation" value="mybatis-config.xml"></property>
    	</bean>
    	<!-- 生成mapper的代理类对象  -->
    	<bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<!-- 设置需要生成代理类的mapper接口的包名 
    			当mapper接口包有多个时,可以使用逗号(,)或者使用 换行符号 分割 -->
    		<property name="basePackage" value="com.sxt.mapper" ></property>
    		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    	</bean>
    	
    	<!-- 配置service对象 -->
    	<bean id="userService"  class="com.sxt.service.impl.UserServiceImpl" autowire="byType"></bean>
    	<!-- 配置controller对象 -->
    	<bean id="userController" class="com.sxt.controller.UserController" autowire="byType"></bean>
    
    </beans>
    

    配置方式二

    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"
    	xmlns:aop="http://www.springframework.org/schema/aop"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    	xmlns:oxm="http://www.springframework.org/schema/oxm"
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xsi:schemaLocation="http://www.springframework.org/schema/oxm https://www.springframework.org/schema/oxm/spring-oxm.xsd
    		http://www.springframework.org/schema/jdbc https://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
    		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
    		http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd
    		http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd">
    	<!-- 引入jdbc配置文件 -->
    	<context:property-placeholder location="classpath:jdbc.properties" system-properties-mode="FALLBACK" />
    	<!-- 
    		整合Mybatis  数据库操作的框架
    			1. 配置数据源
    			2. 创建SqlSessionFactoryBuilder
    			3. 创建SqlSessionFactory
    			4. 创建SqlSession
    			5. 根据SqlSession 创建  Mapper 代理类对象   // 生成 mapper的代理类对象
    	 -->
    	<!-- 配置数据源 -->
    	<bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName" value="${jdbc.driver}"></property>
    		<property name="url" value="${jdbc.url}"></property>
    		<property name="username" value="${jdbc.username}"></property>
    		<property name="password" value="${jdbc.password}"></property>
    	</bean>
    	<!-- 
    		创建SqlSessionFactory
    			1. 资源配置文件  mybatis 核心配置文件
    			2. mapper 映射文件
    			3. 数据源
    			4. 事务管理器
    	 -->
    	 <!-- 配置数据库事务管理器 -->
    	 <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	 	<property name="dataSource" ref="dataSource"></property>
    	 </bean>
    	<!-- sqlSessionFactory -->
    	<bean id="sqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean"  >
    		<!-- 配置数据源 -->
    		<property name="dataSource" ref="dataSource"></property>
    		<!-- 配置包的别名 -->
    		<property name="typeAliasesPackage" value="com.sxt.pojo"></property>
    		<!-- 配置插件 -->
    		<property name="plugins" >
    			<array>
                    <!-- 配置分页插件 -->
    				<bean class="com.github.pagehelper.PageInterceptor"></bean>
    			</array>
    		</property>
    		<!-- 配置映射文件 -->
    		<property name="mapperLocations">
    			<array>
    				<value>classpath*:mapper/*Mapper.xml</value>
    			</array>
    		</property>
    	</bean>
    	<!-- 生成mapper的代理类对象  -->
    	<bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<!-- 设置需要生成代理类的mapper接口的包名  -->
    		<property name="basePackage" value="com.sxt.mapper," ></property>
    		<!-- 
    			当没有注入sqlSessionFactory时,spring默认自动装配
    			为什么spring提供出来  进行配置?
    			当一个项目中,存在多个数据源时,不同的数据源就有不同的SqlSessionFactory,而使用配置的方式,就是指定sqlSessionFactory.
    			不配置的方式,只支持单数据源
    		 -->
    		<!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> -->
    	</bean>
    	
    	<!-- 配置service 对象 -->
    	<bean id="userService"  class="com.sxt.service.impl.UserServiceImpl" autowire="byType"></bean>
    	<!-- 配置controller 对象 -->
    	<bean id="userController" class="com.sxt.controller.UserController" autowire="byType"></bean>
    
    </beans>
    

    mybatis映射文件

    <?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">
     <!-- orm 映射文件  -->
     <!-- 此时映射文件的 namespace的值是  mapper 接口的全路径 -->
    <mapper namespace="com.sxt.mapper.UserMapper">
    	<select id="selectAll" resultType="User" >
    		select id as id , user_name as userName , password as password,real_name as realName from user
    	</select>
    </mapper>
    

    声明式事务

      配置的式事务,通过配置让Spring自动管理事务

    xml配置

    <?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:jdbc="http://www.springframework.org/schema/jdbc"
    	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    	xmlns:oxm="http://www.springframework.org/schema/oxm"
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xsi:schemaLocation="http://www.springframework.org/schema/oxm https://www.springframework.org/schema/oxm/spring-oxm.xsd
    		http://www.springframework.org/schema/jdbc https://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
    		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
    		http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd
    		http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd">
    	<!-- 引入jdbc配置文件 -->
    	<context:property-placeholder location="classpath:jdbc.properties" system-properties-mode="FALLBACK" />
    	<!-- 
    		整合Mybatis  数据库操作的框架
    			1. 配置数据源
    			2. 创建SqlSessionFactoryBuilder
    			3. 创建SqlSessionFactory
    			4. 创建SqlSession
    			5. 根据SqlSession 创建  Mapper 代理类对象   // 生成 mapper的代理类对象
    	 -->
    	<!-- 配置数据源  -->
    	<bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName" value="${jdbc.driver}"></property>
    		<property name="url" value="${jdbc.url}"></property>
    		<property name="username" value="${jdbc.username}"></property>
    		<property name="password" value="${jdbc.password}"></property>
    	</bean>
    	<!-- 
    		创建SqlSessionFactory
    			1. 资源配置文件  mybatis 核心配置文件
    			2. mapper 映射文件
    			3. 数据源
    			4. 事务管理器
    	 -->
    
    	<!-- sqlSessionFactory -->
    	<bean id="sqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean"  >
    		<!-- 配置数据源 -->
    		<property name="dataSource" ref="dataSource"></property>
    		<!-- 配置包的别名 -->
    		<property name="typeAliasesPackage" value="com.sxt.pojo"></property>
    		<!-- 配置插件 -->
    		<property name="plugins" >
    			<array>
                    <!-- 配置分页插件 -->
    				<bean class="com.github.pagehelper.PageInterceptor"></bean>
    			</array>
    		</property>
    		<!-- 配置映射文件 -->
    		<property name="mapperLocations">
    			<array>
    				<value>classpath*:mapper/*Mapper.xml</value>
    			</array>
    		</property>
    	</bean>
    	<!-- 生成mapper的代理类对象  -->
    	<bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<!-- 设置需要生成代理类的mapper接口的包名  -->
    		<property name="basePackage" value="com.sxt.mapper," ></property>
    		<!-- 
    			当没有注入sqlSessionFactory时,spring默认自动装配
    			为什么spring提供出来  进行配置?
    			当一个项目中,存在多个数据源时,不同的数据源就有不同的SqlSessionFactory,而使用配置的方式,就是指定sqlSessionFactory.
    			不配置的方式,只支持单数据源
    		 -->
    		<!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> -->
    	</bean>
    	<!-- 组件扫描 -->
    	<context:component-scan base-package="com.sxt"></context:component-scan>
    	<!-- Spring的事务是利用AOP实现 -->
    
    	<!-- 配置数据库事务管理器 -->
    	<!-- 增强类 -->
    	 <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	 	<property name="dataSource" ref="dataSource"></property>
    	 </bean>
    	 <tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager">
    	 	<!-- 增强的目标 -->
    	 	<tx:attributes>
    	 		<!-- name : 事务生效的方法 
                    isolation:事务的隔离级别(数据库)
                        READ_COMMITTED:读已提交 (脏读)
                        READ_UNCOMMITTED:读未提交 (虚读)
                        REPEATABLE_READ:可重复读 (幻读)
                        SERIALIZABLE:串行化  效率低
                    rollback-for:哪些方法遇到异常时需要进行回滚  默认是任何异常都会进行回滚
                    no-rollback-for:指定不回滚得异常
                    propagation:事务的传播性
    				read-only="true" 只读事务,只能从数据库进行查询
    			-->
    	 		<tx:method name="add*" propagation="REQUIRED"/>
    	 		<tx:method name="insert*" propagation="REQUIRED"/>
    	 		<tx:method name="update*" propagation="REQUIRED"/>
    	 		<tx:method name="delete*" propagation="REQUIRED"/>
    	 		<tx:method name="modify*" propagation="REQUIRED"/>
    	 		<tx:method name="set*" 	  propagation="REQUIRED"/>
    	 		<tx:method name="select*" read-only="true"/>
    	 		<tx:method name="query*" read-only="true"/>
    	 		<!-- 以上都不匹配时使用 *  -->
    	 		<tx:method name="*" read-only="true"/>
    	 	</tx:attributes>
    	 </tx:advice>
    	 
    	<!-- 具体被增强的类 -->
    	<aop:config>
            <!-- 配置切面 -->
    		<aop:pointcut expression="execution(* com.sxt.service.impl.*.*(..))" id="pc"/>
    		<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
    	</aop:config>
    </beans>
    

    注解:@Transactional

    <?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:jdbc="http://www.springframework.org/schema/jdbc"
    	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    	xmlns:oxm="http://www.springframework.org/schema/oxm"
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xsi:schemaLocation="http://www.springframework.org/schema/oxm https://www.springframework.org/schema/oxm/spring-oxm.xsd
    		http://www.springframework.org/schema/jdbc https://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
    		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
    		http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd
    		http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd">
    	<!-- 引入jdbc配置文件 -->
    	<context:property-placeholder location="classpath:jdbc.properties" system-properties-mode="FALLBACK" />
    	<!-- 
    		整合Mybatis  数据库操作的框架
                1. 配置数据源
    			2. 创建SqlSessionFactoryBuilder
    			3. 创建SqlSessionFactory
    			4. 创建SqlSession
    			5. 根据SqlSession 创建  Mapper 代理类对象   // 生成 mapper的代理类对象
    	 -->
    	<!-- 配置数据源  -->
    	<bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName" value="${jdbc.driver}"></property>
    		<property name="url" value="${jdbc.url}"></property>
    		<property name="username" value="${jdbc.username}"></property>
    		<property name="password" value="${jdbc.password}"></property>
    	</bean>
    	<!-- 
    		创建SqlSessionFactory
    			1. 资源配置文件  mybatis 核心配置文件
    			2. mapper 映射文件
    			3. 数据源
    			4. 事务管理器
    	 -->
    	<!-- sqlSessionFactory -->
    	<bean id="sqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean"  >
    		<!-- 配置数据源 -->
    		<property name="dataSource" ref="dataSource"></property>
    		<!-- 配置包的别名 -->
    		<property name="typeAliasesPackage" value="com.sxt.pojo"></property>
    		<!-- 配置分页插件 -->
    		<property name="plugins" >
    			<array>
    				<bean class="com.github.pagehelper.PageInterceptor"></bean>
    			</array>
    		</property>
    		<!-- 配置映射文件 -->
    		<property name="mapperLocations">
    			<array>
    				<value>classpath*:mapper/*Mapper.xml</value>
    			</array>
    		</property>
    	</bean>
    	<!-- 生成mapper的代理类对象 -->
    	<bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<!-- 设置需要生成代理类的mapper接口的包名  -->
    		<property name="basePackage" value="com.sxt.mapper," ></property>
    		<!-- 
    			当没有注入sqlSessionFactory时,spring默认自动装配
    			为什么spring提供出来  进行配置?
    			当一个项目中,存在多个数据源时,不同的数据源就有不同的SqlSessionFactory,而使用配置的方式,就是指定sqlSessionFactory.
    			不配置的方式,只支持单数据源
    		 -->
    		<!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> -->
    	</bean>
    	<!-- 组件扫描 -->
    	<context:component-scan base-package="com.sxt"></context:component-scan>
    	<!-- Spring的事务是利用AOP实现 -->
    
        <!-- 配置事务 -->
    	<!-- 配置数据库事务管理器 -->
    	 <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	 	<property name="dataSource" ref="dataSource"></property>
    	 </bean>
        <!-- 开启注解事务 -->
    	<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
    
    </beans>
    
    package com.sxt.service.impl;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.github.pagehelper.Page;
    import com.github.pagehelper.PageHelper;
    import com.sxt.mapper.UserMapper;
    import com.sxt.pojo.User;
    import com.sxt.service.IUserService;
    
    @Service
    @Transactional
    public class UserServiceImpl implements IUserService {
    	
    	@Autowired
    	private UserMapper  userMapper;
    
    	@Override
    	public List<User> queryAll() {
    		Page<User> page = PageHelper.startPage(2, 5);
    		userMapper.selectAll();
    		return page.getResult();
    	}
    	
    	@Override
        @Transactional
    	public int user(String userName, String password, String realName) {
    		int m = userMapper.insert(userName, password, realName);
    		int n = 0;
    		System.out.println(m/n);
    		return m;
    	}
    }
    

    事务的传播性

      propagation: 事务的传播性

      REQUIRED(必须):PROPAGATION_REQUIRED : 表示当前若存在事务,则使用当前事务,否则创建一个事务

      SUPPORTS: 若当前存在事务,则在当前事务中执行,若不存在事务,则在非事务中执行

      NESTED(嵌套):PROPAGATION_NESTED : 若当前存在事务,则创建一个子事务,嵌套在当前事务中.注意,外层事务出现异常,会回滚子事务.子事务出现异常,不影响外层事务.

      注意: 在父事务中,使用try...catch 包裹子事务.否则,子事务异常会向上抛,父事务也会出现异常,则进行回滚

      NEVER:PROPAGATION_NEVER: 绝不使用事务,若当前存在事务则报错

      MANDATORY(强制的):PROPAGATION_MANDATORY:必须在事务中执行,若当前没有事务,则报错

      REQUIRES_NEW:PROPAGATION_REQUIRES_NEW: 必须在一个新的事务中执行,不管当前是否存在事务,都会创建一个新的事务,在创建的事务中执行. 只支持JtaTransactionManager事务管理器

      NOT_SUPPORTED:PROPAGATION_NOT_SUPPORTED:不论当前是否存在事务,都不在事务中执行.会将当前事务挂起.只支持JtaTransactionManager事务管理器

    NESTED与REQUIRES_NEW的区别:

    NESTED:PROPAGATION_NESTED的事务,是父子事务,父事务可以控制子事务.当父事务异常了,子事务会跟着回滚.但是,子事务异常了,不会影响父事务.
    
    REQUIRES_NEW:PROPAGATION_REQUIRES_NEW:完全创建一个新的事务,相互不受影响
    

    Spring中JDBC操作

    ​  在spring中封装了一套数据库JDBC操作,jdbcTemplate。

    xml配置

    <?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:jdbc="http://www.springframework.org/schema/jdbc"
    	xsi:schemaLocation="http://www.springframework.org/schema/jdbc https://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
    		http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    	<!-- 引入 jdbc配置文件 -->
    	<context:property-placeholder location="classpath:jdbc.properties" system-properties-mode="FALLBACK"/>
    	<!-- 创建数据源 -->
    	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName" value="${jdbc.driver}"></property>
    		<property name="url" value="${jdbc.url}"></property>
    		<property name="username" value="${jdbc.username}"></property>
    		<property name="password" value="${jdbc.password}"></property>
    	</bean>
    	<!-- 创建 JdbcTemplate -->
    	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    		<property name="dataSource" ref="dataSource"></property>
    	</bean>
    	
    	<context:component-scan base-package="com.sxt"></context:component-scan>
    </beans>
    
    package com.sxt.dao.impl;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.stereotype.Repository;
    
    import com.sxt.dao.IUserDao;
    import com.sxt.pojo.User;
    import com.sxt.rowmapper.MyRowMapper;
    
    @Repository
    public class UserDaoImpl implements IUserDao{
    	
    	@Autowired
    	private JdbcTemplate jdbcTemplate;
    
    	@Override
    	public List<Map<String,Object>> selectAll() {
    		String sql = "select id as id,user_name as userName,password as password,real_name as realName from user";
    		List<Map<String,Object>> maps = jdbcTemplate.queryForList(sql);
    		for (Map<String,Object> map : maps) {
    			System.out.println(map);
    		}
    		return maps;
    	}
    	
    	public List<User> selectAll2() {
    		String sql = "select id as id,user_name as userName,password as password,real_name as realName from user" ;
    		List<User> users = new ArrayList<User>();
    		jdbcTemplate.query(sql, new RowMapper<User>() {
    			@Override
    			public User mapRow(ResultSet rs, int rowNum) throws SQLException {
    				User user = new User();
    				user.setId(rs.getInt(1));
    				user.setUserName(rs.getString(2));
    				user.setPassword(rs.getString(3));
    				user.setRealName(rs.getString(4));
    				users.add(user);
    				return user;
    			}
    		});
    		for (User user : users) {
    			System.out.println(user);
    		}
    		return users;
    	}
    	
    	public List<User> selectAll3() {
    		String sql = "select id as id,user_name as userName,password as password,real_name as realName from user" ;
    		List<User> users = jdbcTemplate.query(sql, new MyRowMapper<User>(User.class));
    		for (User user : users) {
    			System.out.println(user);
    		}
    		return users;
    	}
    
    	@Override
    	public int insert(String userName, String password, String realName) {
    		String sql = "insert into user value (0,?,?,?)";
    		int m = jdbcTemplate.update(sql, userName,password,realName);
    		return m;
    	}
    
    	@Override
    	public int update(Integer id, String userName, String password, String realName) {
    		String sql = "update user set user_name = ?,password=?,real_name = ? where id=?";
    		int m = jdbcTemplate.update(sql, userName,password,realName,id);
    		return m;
    	}
    
    	@Override
    	public int delete(Integer id) {
    		String sql = "delete from  user where id=?";
    		int m = jdbcTemplate.update(sql,id);
    		return m;
    	}
    
    }
    
    package com.sxt.rowmapper;
    
    import java.lang.reflect.Field;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    
    import org.springframework.jdbc.core.RowMapper;
    
    public class MyRowMapper<T> implements RowMapper<T> {
    
    	private Class<T> obj;
    
    	public MyRowMapper(Class<T> obj) {
    		this.obj = obj;
    	}
    
    	@Override
    	public T mapRow(ResultSet rs, int rowNum) throws SQLException {
    
    		T t = null;
    		try {
    			t = obj.newInstance();
    		} catch (Exception e1) {
    			e1.printStackTrace();
    		}
    		// 元数据
    		ResultSetMetaData metaData = rs.getMetaData();
    		// 获取列数
    		int columnCount = metaData.getColumnCount();
    		// 获取列的别名
    		for (int i = 0; i < columnCount; i++) {
    			String columnLabel = metaData.getColumnLabel(i+1);
    			Object columnValue = rs.getObject(columnLabel);
    			try {
    				Field field = obj.getDeclaredField(columnLabel);
    				field.setAccessible(true);
    				field.set(t, columnValue);
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		return t;
    	}
    }
    

    Spring中的定时任务

    什么是定时任务?

      周期性执行的代码.

    定时任务的作用?

      参考网站:http://qqe2.com/cron

    导入jar包:

    quartz-2.3.1.jar
    

    例如:

    1. 每个月9号,花呗通知要还款了,花呗账单
    2. 定时数据同步:将服务器中的数据,同步到硬件中.
    3. 进行数据检查,补偿机制.
    package com.sxt.task;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    import com.sxt.dao.IUserDao;
    import com.sxt.pojo.User;
    
    @Component
    public class MyTask {
    	
    	@Autowired
    	IUserDao userDao;
    	
    	// 周期性的执行
    	@Scheduled(cron = "50-50 57-58 * * * ? ")
    	public void task1() {
    		System.out.println("========task1=========");
    		List<User> user1 = userDao.selectAll2();
    	}
    
    }
    
    <!-- 让定时任务注解生效 -->
    <task:annotation-driven/>
    
  • 相关阅读:
    【随笔】新博客
    【Linux】grep命令
    【C/C++】C++11 Move, Forward
    【C/C++】C++11 Variadic Templates
    【C/C++】C++11 Lambda
    【Linux】gdb调试
    【C/C++】数组 & 指针
    【PAT】反转链表
    【OS】Process & Thread
    【Python】Scrapy基础
  • 原文地址:https://www.cnblogs.com/lyang-a/p/12563279.html
Copyright © 2011-2022 走看看