【Mybatis】使用注解开发

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【Mybatis】使用注解开发,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

闲话

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

基本要点

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

mapper中会引用上面的sqlSession,存放我们配置信息,如dataSource等
在这里插入图片描述
mapper下的mapperInterface通过反射获取到对应的接口类信息
mapper下的methodCache获取调用方法的信息
在这里插入图片描述

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

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

4、注解实现增删查改
我们结合一个demo来做个简单了解
下面是我所建表t_decade_user下的数据
在这里插入图片描述
注意: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中需要使用映射器接口进行注册,而不是之前的那种使用相对于类路径的资源引用

<?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>
    <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">
                <!--驱动配置,com.mysql.jdbc.driver -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--每一个mapper都需要在核心配置文件中注册-->
    <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();
        }
    }
}

运行结果如下,数据库改动符合预期,信息查询成功
在这里插入图片描述

如有错误,欢迎指正!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136773.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!