十八、Spring6集成MyBatis3.5

目录

十八、Spring6集成MyBatis3.5

[18.1 实现步骤](#18.1 实现步骤)

[18.2 具体实现](#18.2 具体实现)

第一步:准备数据库表

第二步:IDEA中创建一个模块,并引入依赖

第三步:基于三层架构实现,所以提前创建好所有的包

第四步:编写pojo

第五步:编写mapper接口

第六步:编写mapper配置文件

第七步:编写service接口和service接口实现类

第八步:编写jdbc.properties配置文件

第九步:编写mybatis-config.xml配置文件

第十步:编写spring.xml配置文件

第十一步:编写测试程序,并添加事务,进行测试

运行结果

数据变化

最后大家别忘了测试事务!!!!

创造异常测试事务

运行结果:

数据不变


十八、Spring6集成MyBatis3.5

18.1 实现步骤

  • 第一步:准备数据库表
    • 使用t_act表(账户表)
  • 第二步:IDEA中创建一个模块,并引入依赖
    • spring-context
    • spring-jdbc
    • mysql驱动
    • mybatis
    • mybatis-spring:mybatis提供的与spring框架集成的依赖
    • 德鲁伊连接池
    • junit
  • 第三步:基于三层架构实现,所以提前创建好所有的包
    • com.powernode.bank.mapper
    • com.powernode.bank.service
    • com.powernode.bank.service.impl
    • com.powernode.bank.pojo
  • 第四步:编写pojo
    • Account,属性私有化,提供公开的setter getter和toString。
  • 第五步:编写mapper接口
    • AccountMapper接口,定义方法
  • 第六步:编写mapper配置文件
    • 在配置文件中配置命名空间,以及每一个方法对应的sql。
  • 第七步:编写service接口和service接口实现类
    • AccountService
    • AccountServiceImpl
  • 第八步:编写jdbc.properties配置文件
    • 数据库连接池相关信息
  • 第九步:编写mybatis-config.xml配置文件
    • 该文件可以没有,大部分的配置可以转移到spring配置文件中。
    • 如果遇到mybatis相关的系统级配置,还是需要这个文件。
  • 第十步:编写spring.xml配置文件
    • 组件扫描
    • 引入外部的属性文件
    • 数据源
    • SqlSessionFactoryBean配置
      • 注入mybatis核心配置文件路径
      • 指定别名包
      • 注入数据源
    • Mapper扫描配置器
      • 指定扫描的包
    • 事务管理器DataSourceTransactionManager
      • 注入数据源
    • 启用事务注解
      • 注入事务管理器
  • 第十一步:编写测试程序,并添加事务,进行测试

18.2 具体实现

第一步:准备数据库表

连接数据库的工具有很多,除了之前我们使用的navicat for mysql之外,也可以使用IDEA工具自带的DataBase插件。可以根据下图提示自行配置:

第二步:IDEA中创建一个模块,并引入依赖

pom.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.dong</groupId>
    <artifactId>spring6-016-sm</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <!--
    引入依赖:
          ○ 德鲁伊连接池
          ○ junit
    -->
    <dependencies>
        <!--spring-context-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.11</version>
        </dependency>

        <!--spring-jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>6.0.11</version>
        </dependency>

        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.13</version>
        </dependency>

        <!--mybatis-spring:mybatis提供的与spring框架集成的依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>3.0.2</version>
        </dependency>

        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.16</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>19</maven.compiler.source>
        <maven.compiler.target>19</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

第三步:基于三层架构实现,所以提前创建好所有的包

第四步:编写pojo

java 复制代码
package com.dong.bank.pojo;

public class TAccount {
    private String actno;
    private double balance;

    @Override
    public String toString() {
        return "Account{" +
                "actno='" + actno + '\'' +
                ", balance=" + balance +
                '}';
    }

    public TAccount() {
    }

    public TAccount(String actno, double balance) {
        this.actno = actno;
        this.balance = balance;
    }

    public String getActno() {
        return actno;
    }

    public void setActno(String actno) {
        this.actno = actno;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }
}

第五步:编写mapper接口

java 复制代码
package com.dong.bank.mapper;

import com.dong.bank.pojo.TAccount;

import java.util.List;

public interface AccountMapper {    //该接口的实现类不需要写,是mybatis通过动态代理机制生成的实现类

    //这就是DAO,只需要编写CRUD方法即可

    /**
     * 新增账户
     * @param TAccount
     * @return
     */
    int insert(TAccount TAccount);

    /**
     * 根据账号删除账户
     * @param actno
     * @return
     */
    int deleteByActno(String actno);

    /**
     * 根据账号修改账户
     * @param TAccount
     * @return
     */
    int update(TAccount TAccount);

    /**
     * 根据账号查询账户
     * @param actno
     * @return
     */
    TAccount selectByActno(String actno);

    /**
     * 查询所有大的账户
     * @return
     */
    List<TAccount> selectAll();
}

第六步:编写mapper配置文件

一定要注意,按照下图提示创建这个目录。注意是斜杠不是点儿。在resources目录下新建。并且要和Mapper接口包对应上。

如果接口叫做AccountMapper,配置文件必须是AccountMapper.xml

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">
<mapper namespace="com.dong.bank.mapper.AccountMapper">

    <insert id="insert">
        insert into t_act values (#{actno},#{balance})
    </insert>

    <delete id="deleteByActno">
        delete from t_act where actno=#{actno}
    </delete>

    <update id="update">
        update t_act set balance=#{balance} where actno=#{actno}
    </update>

    <select id="selectByActno" resultType="com.dong.bank.pojo.TAccount">
        select * from t_act where actno=#{actno}
    </select>

    <select id="selectAll" resultType="com.dong.bank.pojo.TAccount">
        select * from t_act
    </select>

</mapper>

第七步:编写service接口和service接口实现类

注意编写的service实现类纳入IoC容器管理:

java 复制代码
package com.dong.bank.service;

import com.dong.bank.pojo.TAccount;

import java.util.List;

public interface AccountService {
    /**
     * 开户
     * @param account
     * @return
     */
    int sava(TAccount account);

    /**
     * 销户
     * @param actno
     * @return
     */
    int deleteByAactno(String actno);

    /**
     *修改账户
     * @param account
     * @return
     */
    int modify(TAccount account);

    /**
     * 查询账户
     * @param actno
     * @return
     */
    TAccount getByActno(String actno);

    /**
     * 获取所有账户
     * @return
     */
    List<TAccount> getAll();

    /**
     * 转账
     * @param fromActno
     * @param toActno
     * @param money
     */

    void transfer(String fromActno,String toActno,double money);

}
java 复制代码
package com.dong.bank.service.impl;

import com.dong.bank.mapper.AccountMapper;
import com.dong.bank.pojo.TAccount;
import com.dong.bank.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
@Transactional
@Service("accountService")
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountMapper accountMapper;

    @Override
    public int sava(TAccount account) {
        return accountMapper.insert(account);
    }

    @Override
    public int deleteByAactno(String actno) {
        return accountMapper.deleteByActno(actno);
    }

    @Override
    public int modify(TAccount account) {
        return accountMapper.update(account);
    }

    @Override
    public TAccount getByActno(String actno) {
        return accountMapper.selectByActno(actno);
    }

    @Override
    public List<TAccount> getAll() {
        return accountMapper.selectAll();
    }

    @Override
    public void transfer(String fromActno, String toActno, double money) {
        TAccount fromAct = accountMapper.selectByActno(fromActno);
        if (fromAct.getBalance()<money) {
            throw new RuntimeException("余额不足");
        }
        TAccount toAct = accountMapper.selectByActno(toActno);
        fromAct.setBalance(fromAct.getBalance()-money);
        toAct.setBalance(toAct.getBalance()+money);
        int count = accountMapper.update(fromAct);
        count+= accountMapper.update(toAct);

        //创造异常测试事务
/*        String s=null;
        s.toString();*/

        if (count!=2) {
            throw new RuntimeException("转账失败!!");
        }
    }
}

第八步:编写jdbc.properties配置文件

放在类的根路径下

java 复制代码
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring6
jdbc.username=root
jdbc.password=****

第九步:编写mybatis-config.xml配置文件

放在类的根路径下,只开启日志,其他配置到spring.xml中。

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>

    <!--帮助我们打印mybatis的日志信息,sql语句等。-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

</configuration>

第十步:编写spring.xml配置文件

注意:当你在spring.xml文件中直接写标签内容时,IDEA会自动给你添加命名空间

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

    <!--组件扫描-->
    <context:component-scan base-package="com.dong.bank"/>

    <!--引入外部的属性文件-->
    <context:property-placeholder location="jdbc.properties"/>

    <!--数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <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>

    <!--SqlSessionFactoryBean配置-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--注入数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--注入mybatis核心配置文件路径-->
        <property name="configLocation" value="mybatis-config.xml"/>
        <!--指定别名包-->
        <property name="typeAliasesPackage" value="com.dong.bank.pojo"/>
    </bean>

    <!--Mapper扫描配置器,主要扫描Mapper接口,生成代理类-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定扫描的包-->
        <property name="basePackage" value="com.dong.bank.mapper"/>
    </bean>

    <!--事务管理器DataSourceTransactionManager-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--启用事务注解-->
    <tx:annotation-driven transaction-manager="txManager"/>

    <!--
    配置步骤:
          ○ 组件扫描
          ○ 引入外部的属性文件
          ○ 数据源
          ○ SqlSessionFactoryBean配置
            ■ 注入mybatis核心配置文件路径
            ■ 指定别名包
            ■ 注入数据源
          ○ Mapper扫描配置器
            ■ 指定扫描的包
          ○ 事务管理器DataSourceTransactionManager
            ■ 注入数据源
          ○ 启用事务注解
            ■ 注入事务管理器
    -->


</beans>

第十一步:编写测试程序,并添加事务,进行测试

java 复制代码
package com.dong.spring6.test;

import com.dong.bank.service.AccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SMTest {
    @Test
    public void testSM(){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
        AccountService accountService = applicationContext.getBean("accountService", AccountService.class);
        try{
            accountService.transfer("act-001","act-002",10000);
            System.out.println("转账成功!!!");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行结果

数据变化

最后大家别忘了测试事务!!!!

创造异常测试事务

java 复制代码
package com.dong.bank.service.impl;

import com.dong.bank.mapper.AccountMapper;
import com.dong.bank.pojo.TAccount;
import com.dong.bank.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
@Transactional
@Service("accountService")
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountMapper accountMapper;

    @Override
    public int sava(TAccount account) {
        return accountMapper.insert(account);
    }

    @Override
    public int deleteByAactno(String actno) {
        return accountMapper.deleteByActno(actno);
    }

    @Override
    public int modify(TAccount account) {
        return accountMapper.update(account);
    }

    @Override
    public TAccount getByActno(String actno) {
        return accountMapper.selectByActno(actno);
    }

    @Override
    public List<TAccount> getAll() {
        return accountMapper.selectAll();
    }

    @Override
    public void transfer(String fromActno, String toActno, double money) {
        TAccount fromAct = accountMapper.selectByActno(fromActno);
        if (fromAct.getBalance()<money) {
            throw new RuntimeException("余额不足");
        }
        TAccount toAct = accountMapper.selectByActno(toActno);
        fromAct.setBalance(fromAct.getBalance()-money);
        toAct.setBalance(toAct.getBalance()+money);
        int count = accountMapper.update(fromAct);
        count+= accountMapper.update(toAct);

        //创造异常测试事务
        String s=null;
        s.toString();

        if (count!=2) {
            throw new RuntimeException("转账失败!!");
        }
    }
}

运行结果:

事务是起作用的

数据不变

相关推荐
苏三说技术1 分钟前
Redis 性能优化的18招
数据库·redis·性能优化
Tttian62226 分钟前
基于Pycharm与数据库的新闻管理系统(2)Redis
数据库·redis·pycharm
做梦敲代码1 小时前
达梦数据库-读写分离集群部署
数据库·达梦数据库
hanbarger2 小时前
mybatis框架——缓存,分页
java·spring·mybatis
苹果醋32 小时前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行2 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger2 小时前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud2 小时前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡2 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式