整合mybatis-spring

  1. SqlSessionFactoryBean
  2. 包扫描接口 MapperScannerConfigurer 或 @MapperScan
  3. 事务管理器 DataSourceTransactionManager

用到的注解
@Transactional 需要开事务的 annotation-driver。。@Transaction在方法上表示该方法开启事务,,标注在类上,表示类中所有方法都开启事务
@Aspect
@Mapper 感觉@Mapper没什么用??????
@MapperScan mybatis扫描接口。
@EnableAspectJAutoProxy
@RunWith
@ContxtConfiguration

实体类

@Component
public class Account {
    private String name;
    private Double money;

    @Override
    public String toString() {
        return "com.com.cj.bean.Account{" +
                "name='" + name + '\'' +
                ", money=" + money +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }
}

配置文件

package com.cj.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.mapper.MapperScannerConfigurer;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@ComponentScan("com.cj")
@MapperScan("com.cj.mapper")//必须在mapper包第一层目录下。。改为com.cj扫不到
@PropertySource("classpath:db.properties")
@ImportResource("classpath:spring.xml")
@EnableAspectJAutoProxy
public class ConfigApp {
    @Value("jdbc:mysql:///test01")
    private String url;
    @Value("com.mysql.jdbc.Driver")
    private String driver;
    @Value("root")
    private String username;
    @Value("root")
    private String password;

    @Bean
    public  DataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
        System.out.println("url:"+url);
        ds.setUrl(url);

        ds.setUsername(username);
        ds.setPassword(password);
        ds.setDriverClassName(driver);
        return ds;
    }


    @Bean  // SqlSessionFactory
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());


        //设置 Mapper 映射文件的位置:* 表示获取 mapper 文件夹下的所有 xml 配置文件
//        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
//                .getResources("classpath:com/cj/mapper/*.xml"));

        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public DataSourceTransactionManager transactionManager(){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource());
        return dataSourceTransactionManager;
    }

//    @Bean  // mapper的扫描器
//    MapperScannerConfigurer mapperScannerConfigurer(){
//        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
//        mapperScannerConfigurer.setBasePackage("com.cj.mapper");
//        return mapperScannerConfigurer;
//    }
}

mapper

@Repository
//@Mapper
public interface AccountMapper1 {
    Account findAccountByName(String name);
    int  update(Account account);
}
<mapper namespace="com.cj.mapper.AccountMapper1">
    <select id="findAccountByName" resultType="com.cj.bean.Account" parameterType="java.lang.String">
        select * from account where name= #{name}
    </select>
    <update id="update">
        update account set money=#{money} where name=#{name}
    </update>
</mapper>

service

@Component
@Transactional
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountMapper1 accountMapper;

    @Override
    public void transfer(String send, String recieve, Double money) {
        Account sendA = accountMapper.findAccountByName(send);
        Account recieveA = accountMapper.findAccountByName(recieve);
        sendA.setMoney(sendA.getMoney()-money);
        recieveA.setMoney(recieveA.getMoney()+money);

        accountMapper.update(sendA);
        accountMapper.update(recieveA);
    }
}
@Aspect
@Component
public class AccountTransaction {
    @Pointcut("execution(* com.cj.service.*.*(..))")
    public void pointcut(){}
    @Before("pointcut()")
    public void before(JoinPoint joinPoint){
        Signature signature = joinPoint.getSignature();
        System.out.println(signature.getName()+"执行了");
    }
}

xml配置事务扫描器

<tx:annotation-driven transaction-manager="transactionManager"/>

测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ConfigApp.class)
public class Main {
    @Autowired
    AccountMapper1 accountMapper;

 @Test
 public void test0(){
     System.out.println(accountMapper);
     System.out.println(accountMapper.findAccountByName("aaa"));
    /* Account account = new Account();
     account.setMoney(100D);
     account.setName("aaa");
     accountMapper.update(account);*/
 }

 @Autowired
    AccountService accountService;
  @Test
  public void test1(){
      accountService.transfer("aaa","bbb",500D);
  }
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐