【Mybatis】使用注解开发

闲话

为什么昨天中午做的核酸报告还不出来!

基本要点

1、使用注解开发的本质是反射,核心是动态代理
反射可以参考我之前的博客 注解和反射
动态代理可以参考 代理模式

mapper中会引用上面的sqlSession,存放我们配置信息,如dataSource等
【Mybatis】使用注解开发_第1张图片
mapper下的mapperInterface通过反射获取到对应的接口类信息
mapper下的methodCache获取调用方法的信息
【Mybatis】使用注解开发_第2张图片

2、简单的sql可以使用注解,复杂的还是建议使用xml文件
比如我们需要用到结果集映射,那么使用注解开发就不太合适了

3、Mybatis执行流程(分析一下我创建sqlSession的工具类MybatisUtils和对应源码)
Resource获取全局文件—>实例化sqlSessionFactoryBuilder构造器—>读取配置文件获得sqlSessionFactory实例(XMLConfigBuilder解析配置)—>sqlSessionFactory.openSession()方法获取sqlSession时,将配置传到sqlSession实例中,并创建事务管理器和执行器—>实现CRUD(不成功则回滚)—>提交事务—>关闭

4、注解实现增删查改
我们结合一个demo来做个简单了解
下面是我所建表t_decade_user下的数据
【Mybatis】使用注解开发_第3张图片
注意:User3这个类的属性名称应该与数据库中的字段名称对应上,因为使用注解无法配置结果集映射,所以可能会导致CRUD出现问题

使用注解做增删改操作时,需要在工具类创建的时候就实现自动提交事务

package com.decade.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 * Mybatis工具类
 */
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            // 使用Mybatis第一步:获取sqlSession
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 既然有了sqlSessionFactory,我们就可以得到sqlSession实例了
    // sqlSession完全包含了面向数据库执行sql命令所需要的方法,如果要开启自动提交事务,openSession中设置true即可
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession(true);
    }

}

然后我们在接口类中声明相关方法

package com.decade.mapper;

import com.decade.pojo.User3;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserInfoMapper {
    @Select("select * from t_decade_user where id = #{userId}")
    List<User3> getUserInfo(@Param("userId") String id);

    @Insert("insert into t_decade_user(id,name,age,sex) values(#{id},#{name},#{age},#{sex})")
    int addUser(User3 user3);

    @Update("update t_decade_user set name = #{name},age = #{age} where id = #{id}")
    int updateUser(User3 user3);

    @Delete("delete from t_decade_user where id = #{uid}")
    int deleteUser(@Param("uid") String id);
}

注意:由于我们使用注解开发,没有对应的xml文件了,所以我们在核心配置文件mybatis-config.xml中需要使用映射器接口进行注册,而不是之前的那种使用相对于类路径的资源引用


DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="db.properties">
        <property name="username" value="decade"/>
        <property name="password" value="11111"/>
    properties>
    
    <settings>
        
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    settings>

    <typeAliases>
        <typeAlias alias="user3" type="com.decade.pojo.User3"/>
    typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            dataSource>
        environment>
    environments>

    
    <mappers>
        <mapper class="com.decade.mapper.UserInfoMapper"/>
    mappers>
configuration>

这个是存放数据库信息的配置文件db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/decade_test?useUnicode=true&characterEncoding=UTF-8
username=root
password=root

最后我们写一个测试类进行测试

import com.decade.mapper.UserInfoMapper;
import com.decade.pojo.User3;
import com.decade.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class MyTest {

    @Test
    public void test() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        try {
            UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
            // 增加一个004
            mapper.addUser(new User3("004", "胡歌", 26, "man"));
            // 修改004的年龄
            mapper.updateUser(new User3("004", "胡歌", 28, "man"));
            // 删除002号
            mapper.deleteUser("002");
            // 查询005号信息
            List<User3> userInfo = mapper.getUserInfo("005");
            userInfo.forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
    }
}

运行结果如下,数据库改动符合预期,信息查询成功
【Mybatis】使用注解开发_第4张图片

如有错误,欢迎指正!

你可能感兴趣的:(Mybatis,后端,java,开发语言,Mybatis)