spring 集成mybatis(一)

概述

本文介绍spring集成mybatis

在真实的项目中,并不完全是这种搭建,这里只是为了做演示

工程目录

创建maven工程

略

修改pom.xml

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>

mybatis全局配置文件

在 resources 文件夹下创建 mybatis-config.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"  
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!-- 配置环境 。default名字随意起-->
    <environments default="mysql">
    <!--    id名字必须同上面default名    -->
        <environment id="mysql">
            <!-- 配置事务管理器类型,JDBC 是 JdbcTransactionFactory.class 的别名 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源。POOLED 是 PooledDataSourceFactory.class 的别名 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3308/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
<mappers>
    <package name="top.malaoshi.mapper"/>
</mappers>

</configuration>

创建实体类

public class User {
    private String id;
    private String username;
    private String password;
    private Integer age;
    private String sex;
    private String status;
    private Date createTime;

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

实现mapper类

public interface IUserMapper {

    @Insert("insert into user (id,username,password,age,sex,status,create_time) values (#{id},#{username},#{password},#{age},#{sex},#{status},#{createTime})")
    public int save(User user);

    @Select("select id,username,password,age,sex,status from user where username like #{username}")
    public List<User> queryByName(String username);
}

实现service接口

public interface IUserService {
    public int save(User user) throws Exception;

    public List<User> queryByName(String username) throws Exception;
}

实现service实现类

@Service
public class UserSrvImpl implements IUserService{
    @Autowired
    private IUserMapper mapper;

    public int save(User user) throws Exception {
        return mapper.save(user);
    }

    public List<User> queryByName(String username) throws Exception {
        return mapper.queryByName(username);
    }

}

说明: 执行时,在 spring容器中,只有一个 IUserMapper 类对象,直接取出并注入

配置类

@Configuration
@ComponentScan("top.malaoshi")
public class ApplicationConfig {

    @Bean
    public SqlSessionFactory getSessionFactory() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
    /**
     * 在spring容器中,只有一个SqlSession对象,所以直接取出注入到形参中
     * @param sqlSessionFactory
     * @return
     */
    @Bean("session")
    public SqlSession getSession(SqlSessionFactory sqlSessionFactory) throws IOException {
        SqlSession sqlSession = sqlSessionFactory.openSession();

        return sqlSession;
    }

    /**
     * 在spring容器中,只有一个SqlSession对象,所以直接取出注入到形参中
     * @param sqlSession
     * @return
     */
    @Bean
    public IUserMapper getUserMapper(SqlSession sqlSession){
        IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
        return mapper;
    }
}

测试查询

public class Main {
    public static void main(String[] args) throws Exception{

        ApplicationContext ac=new AnnotationConfigApplicationContext(ApplicationConfig.class);
        IUserService srv=(IUserService)ac.getBean("userSrvImpl");

        List<User> list=srv.queryByName("李%");
        for(User user:list){
            System.out.println(user.getUsername());
        }

    }
}

测试保存

public class Main {
    public static void main(String[] args) throws Exception{

        ApplicationContext ac=new AnnotationConfigApplicationContext(ApplicationConfig.class);
        IUserService srv=(IUserService)ac.getBean("userSrvImpl");

        User user=new User();
        user.setId(UUID.randomUUID().toString().replace("-",""));
        user.setUsername("李现");
        user.setPassword("123456");
        srv.save(user);


    }
}

保存失败

没有提交到数据库中

修改service实现类

@Service
public class UserSrvImpl implements IUserService{
    @Autowired
    private IUserMapper mapper;
    //定义session
    @Autowired
    private SqlSession session;

    public int save(User user) throws Exception {
        int i=0;
        try {
            i = mapper.save(user);
            session.commit();
        }catch (Exception e){
            session.rollback();
            throw e;
        }finally {
            session.close();
        }

        return i;
    }

    public List<User> queryByName(String username) throws Exception {
        List<User> list=null;
        try{
            list=mapper.queryByName(username);
        }catch (Exception e){
            throw e;
        }finally {
            session.close();
        }
        return list;
    }
}

缺点

在增删改方法中,执行成功后,需要 手动 提交事务;执行报错时,需要 手动 回滚事务;执行后,最终要关闭session

如果每次都手写,代码量大,繁琐
如果忘写,会造成很大问题


原文出处:/show_1IX2tmBWQp3.html