spring整合mybatis XML版

目录

 

1,spring为什么要和持久层技术整合

2,可以与哪些进行整合呢?

mybatis开发步骤

导入依赖

spring配置文件编码

调用代码:

结果:

spring控制事务开发【基于mybatis】

spring控制事务的开发方式-----【aop】。

我们来写事务

spring来替我们写事务

组装事务

@Transactional注解细节

基于XML标签的事务配置方式【更好的理解原理】

关键:额外功能

组装切面


1,spring为什么要和持久层技术整合

javaee开发需要持久层进行数据库的访问操作。

jdbc或者是mybatis在进行开发时存在大量的代码冗余。

spring基本模板设计模式对持久层进行了封装。

2,可以与哪些进行整合呢?

jdbc   jdbcplate

Hibernate -HibernateTemplate jpa

Mybatis -SqlSessionFactoryBean MapperScannerConfiguration。

mybatis开发步骤

1,实体类。2,实体类指定别名。3,数据库建表。4,创建dao接口。5,书写Mapper映射文件。6,注册Mapper文件。7,调用API。

导入依赖

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.2.0.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.0.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.23</version>
    </dependency>


    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.0</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.21</version>
    </dependency>

<!--spring-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.6</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
      <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.2.3</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.logback-extensions/logback-ext-spring -->
    <dependency>
      <groupId>org.logback-extensions</groupId>
      <artifactId>logback-ext-spring</artifactId>
      <version>0.1.4</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>

spring配置文件编码

    <!--配置连接池-->
    <context:property-placeholder location="classpath:mysql.properties" />
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <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>
<!--创建sqlsessionFactoryBean-->
<!--    这些内容都是mybatis主配置文件中的信息,所以我们可以把主配置文件的信息省略-->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--        指定数据源-->
        <property name="dataSource" ref="dataSource"></property>
<!--        指定别名包-->
        <property name="typeAliasesPackage" value="org.entity"></property>
<!--        指定Mapper文件的位置-->
        <property name="mapperLocations">
<!--            这是一个list数组-->
            <list>
                <value>classpath:org/dao/Mapper/*Mapper.xml</value>
            </list>
        </property>
    </bean>
<!--spring工厂 存储 mybatis根据dao接口创建dao的实现类,id是接口名小驼峰。-->
    <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property>
<!--        dao接口所在包-->
        <property name="basePackage" value="org.dao"></property>
    </bean>

调用代码:

 /**
     * 用于测试,spring和mybatis的整合
     * @throws IOException
     */
    @org.junit.Test
    public void test1() throws IOException {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
//        根据spring提供的MapperScannerConfigure
        UserDao us =(UserDao)ctx.getBean("userDao");
       List all= us.findAll();
        for (Object o : all) {
            System.out.println(o);
        }
    }

结果:

spring控制事务开发【基于mybatis】

jdbc:Connection的操作。con.setAutoCommit 、con.commit 、con.rollback;

mybatis:SqlSession的操作。factory.getSqlSession(AutoCommit)、session.commit 、session.rollback。

结论:控制事务的底层,都是connection对象。

spring控制事务的开发方式-----【aop】。

-----额外功能是事务。

我们来写事务

原始对象
	XXXServiceImp类。dao作为service的成员变量,依赖注入的方法进行赋值
额外功能
	MethodInterceptor
		Public void invoke(MethodInvocation){
			Try{
				Connection.setAutoCommit=false;
				Object ret = invocation.proceed()
				Conn.commit
			}catch{
				Conn.rollback
			}
		}

spring来替我们写事务

该额外功能类位于org.springframework.jdbc.datasource.DataSourceTransactionManager;

为了提高效率,需要传入的不是连接(Connection),而是连接池(DataSource)。

<!--    额外功能-事务-->
<!--    DataSourceTransationManager-->
    <bean id="dataSourceTransationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

事务应用注解@Transactional

事务【额外功能能给哪些业务方法】。

该注解放在类上,全部方法加注解。该注解放在方法上,该方法加注解。

组装事务

<!--    定义aop代理的方法,JDK false【default】 cglib true 可以验证,事务功能通过aop添加的-->
    <tx:annotation-driven transaction-manager="dataSourceTransationManager" proxy-target-class="false"/>

@Transactional注解细节

业务涉及到数据库 【增删改】 @Transactional

业务涉及到数据库查询操作【查】@Transactional(propagation = progation.supports,readonly=true);

基于XML标签的事务配置方式【更好的理解原理】

aop:1,原始对象。2,额外功能。3,切入点。4,组装。

关键:额外功能

 <tx:advice id="tx" transaction-manager="dataSourceTransationManager">
        <tx:attributes>
	//表示修改操作【增删改】
            <tx:method name="modify*" />
// 表示除修改操作以外的操作【查询】
	  <tx:method name="*" propagation='supports' readonly = true/>
        </tx:attributes>
    </tx:advice>

组装切面

<aop:config>
        <aop:pointcut id="pc" expression="within(com.project..service..*)"/>
        <aop:advisor advice-ref="tx" pointcut-ref="pc"></aop:advisor>
    </aop:config>

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值