Mybatis使用注解开发

2022-10-04 09:47:33

闲话

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

基本要点

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出现问题

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

packagecom.decade.utils;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importjava.io.IOException;importjava.io.InputStream;/**
 * Mybatis工具类
 */publicclassMybatisUtils{privatestaticSqlSessionFactory sqlSessionFactory;static{try{// 使用Mybatis第一步:获取sqlSessionString resource="mybatis-config.xml";InputStream inputStream=Resources.getResourceAsStream(resource);
            sqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);}catch(IOException e){
            e.printStackTrace();}}// 既然有了sqlSessionFactory,我们就可以得到sqlSession实例了// sqlSession完全包含了面向数据库执行sql命令所需要的方法,如果要开启自动提交事务,openSession中设置true即可publicstaticSqlSessiongetSqlSession(){return sqlSessionFactory.openSession(true);}}

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

packagecom.decade.mapper;importcom.decade.pojo.User3;importorg.apache.ibatis.annotations.*;importjava.util.List;publicinterfaceUserInfoMapper{@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})")intaddUser(User3 user3);@Update("update t_decade_user set name = #{name},age = #{age} where id = #{id}")intupdateUser(User3 user3);@Delete("delete from t_decade_user where id = #{uid}")intdeleteUser(@Param("uid")String id);}

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

<?xml version="1.0" encoding="utf-8" ?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><propertiesresource="db.properties"><propertyname="username"value="decade"/><propertyname="password"value="11111"/></properties><settings><!-- 标准的日志工厂 --><settingname="logImpl"value="STDOUT_LOGGING"/></settings><typeAliases><typeAliasalias="user3"type="com.decade.pojo.User3"/></typeAliases><environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"/><dataSourcetype="POOLED"><!--驱动配置,com.mysql.jdbc.driver --><propertyname="driver"value="${driver}"/><propertyname="url"value="${url}"/><propertyname="username"value="${username}"/><propertyname="password"value="${password}"/></dataSource></environment></environments><!--每一个mapper都需要在核心配置文件中注册--><mappers><mapperclass="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

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

importcom.decade.mapper.UserInfoMapper;importcom.decade.pojo.User3;importcom.decade.utils.MybatisUtils;importorg.apache.ibatis.session.SqlSession;importorg.junit.Test;importjava.util.List;publicclassMyTest{@Testpublicvoidtest(){SqlSession sqlSession=MybatisUtils.getSqlSession();try{UserInfoMapper mapper= sqlSession.getMapper(UserInfoMapper.class);// 增加一个004
            mapper.addUser(newUser3("004","胡歌",26,"man"));// 修改004的年龄
            mapper.updateUser(newUser3("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();}}}

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

如有错误,欢迎指正!

  • 作者:Decade0712
  • 原文链接:https://blog.csdn.net/Decade0712/article/details/123697768
    更新时间:2022-10-04 09:47:33