MyBatis

Posted always0708

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis相关的知识,希望对你有一定的参考价值。

MyBatis

1.编写流程

1、编写工具类 如:MybatisUtils (里面需要一个配置文件mybatis-config.xml)

​ 主要是为了获取SqlSessionFactory,以及从中获得SqlSession的实例

2、编写配置文件 mybatis-config.xml (环境准备)

3、编写实体类

4、编写接口 ***mapper.java

5、编写***mapper.xml 文件

6、编写测试类

@Test
public void test01
	SqlSession sqlSession = Mybatis工具类.getSqlSession();
	对象 对象名 = sqlSession.getMapper(mapepr接口.class);
	返回值 = 对象名.方法名;
	sqlSession.close();

注意点:
1、注意maven的扫描位置,即pom文件中<build></build>中的扫描资源文件的位置
2、SqlSession一定要记得关闭  如:sqlSession.close();

2.CRUD

1、nameSpace

命名空间 和mapper接口路径保持一致

2、select

1、id 和mapper接口中的方法名保持一致,否则会出现绑定异常

2、parameterType 参数类型,如 int 或 com.zxw.pojo.User

3、resultType 结果类型 如:com.zxw.pojo.User

3、增删改 需要提交事务

查询不需要提交事务,但是增删改 需要提交事务 如:sqlSession.commit();

4、万能map

当参数为多个是的时候,可以使用map传参,即parameterType= map

即传递sql参数的时候,注意map的key即可

5、模糊查询

1、java传递代码的时候,使用通配符%%

List<User> abc = mapper.selectList("%周%");

2、在sql拼接的时候使用通配符

select * from user where name like "%"#value"%"

3、配置解析

所有的xml文件,在写的时候,都是由顺序限制的,如配置properties就必须放在前面,否则会出

1、核心配置文件 mybatis-congfig.xml

2、环境配置(environments)在xml文件中可以配置多个环境,根据default选择需要用的环境

3、属性(properties) 主要是为了引用外部的配置文件,如db.properties。外部配置文件优先级比较高

4、类型别名(typeAliases)

​ 一、给实体类起别名

​ 二、扫描包,默认是类名首字母小写,也可以在实体类上加上注解(@Aliases),来使用自己在注解中写的别名

5、设置


7、其他配置

  • typeHandlers(类型处理器)

  • objectFactory(对象工厂)

  • plugins插件

    mybatis-generator-core

    mybatis-plus

    通用mapper

8、映射器(mappers)

​ MapperRegistry:注册绑定我们的mapper文件

​ 方式一:

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

​ 方式二:

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

​ 方式三:

<!-- 将包内的映射器接口全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

注意点:方式二和三这两个,第一需要 接口和他的mapper配置文件必须同名,第二个 接口和他的mapper配置文件必须在同一个包下!

4、解决属性名和字段名不一致的问题

resultMap

column是数据库中的字段,property是实体类中的属性
<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id" />
  <result property="username" column="user_name"/>
  <result property="password" column="hashed_password"/>
</resultMap>

<select id= "***" resultMap="userResultMap">
 sql语句
</select>

5、日志

Log4J

1、先导入log4j的包

2、配置log4j.properties

3、配置log4j的日志实现

在mybatis中
<setings>
    <seting  name="logImpl" value=""/>
</setings>

4、使用

简单使用:

一、在需要使用log4j的类中,导入包 org.apache.log4j.Logger

二、日志对象,参数为当前类的class

static Logger logger = Logger.getLogger(类名.class);

三、设置日志级别 info.debug,error

6、分页

1、limit 在sql语句中实现

2、RowBounds 在java代码中实现

3、分页插件 mybatis pageHelper

7、注解

1、@select 在接口上添加此注解,直接在里面编写 sql语句【此注解只适用于简单的sql语句,复杂的还是建议使用xml文件中编写】

2、@Param 在接口中,出现多个参数(基本数据和String 类型,引用数据类型不需要加此注解)的时候,注意再每个参数前,添加@Param注解,执行sql的时候,是以param中的value为主。【param中的value值也要和xml文件#中的值保持一致】

8、#和$

通常都是使用#。主要是安全,防止sql注入,以前使用$,会导致sql注入,因为会产生自动拼接

9、Lombok

主要三个注解

@Data @AllArgsConstructor@NoArgsConstructor

但有些觉得不建议使用这个,但这个看公司要不要使用这个把

10、多对一的处理

1、按照查询嵌套处理

2、按照结果嵌套处理

11、一对多处理



总结:

对象:assoiation 多对一

集合:collection 一对多

javaType 和 ofType

javaType是用来指定实体类中属性的类型

ofType是用来指定映射到List或者集合中的pojo类型,泛型中的约束类型

12、动态SQL

if标签

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #title
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #author.name
  </if>
</select>

choose、when、otherwise

选择其中一个条件进行执行

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #title
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #author.name
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

trim、where、set

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#username,</if>
      <if test="password != null">password=#password,</if>
      <if test="email != null">email=#email,</if>
      <if test="bio != null">bio=#bio</if>
    </set>
  where id=#id
</update>


<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>

<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

foreach

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符,看它多智能!

提示 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  <where>
    <foreach item="item" index="index" collection="list"
        open="ID in (" separator="," close=")" nullable="true">
          #item
    </foreach>
  </where>
</select>

SQL片段

1、使用sql标签抽取重复的部分

2、在需要使用的地方使用include标签根据sql标签的id进行引用

注意点:最好基于单表定义sql片段;不要存在where标签

13、缓存

1、mybatis有一级缓存,二级缓存

​ 一级缓存只存在再一个会话中,就是一个sqlSession中,会话结束,一级缓存就失效了。

​ 二级缓存作用与同一个namespace下,即同一个mapper中的,当一级缓存失效后,就会把数据放到二级缓存中(前提是会话关闭,或者会话提交),配置二级缓存需要先在mybatis-congfig.xml中先配置,开启缓存,其实mybatis中默认就是开启的,一般都会显示的展示出来,再在具体的mapper.xml中,配置就表示开启缓存,里面也可以加一些参数(清楚策略,刷新时间,大小等)

2、清楚策略

  • LRU 最近很少使用的:移除最长时间不被使用的对象(默认)
  • FIFO 先进先出:按照对象进入缓存的顺序来移除它们
  • SOFT 软引用:基于垃圾回收器状态和软引用规则移除对象
  • WEAK 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象

以上是关于MyBatis的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis1:MyBatis入门

MyBatis源码分析二MyBatis回顾

MyBatis1:MyBatis入门

MyBatis源码分析二MyBatis回顾

Mybatis 一级缓存,Mybatis 二级缓存,Mybatis 缓存失效

Mybatis-Plus:快速开始(SpringBoot + Mybatis + Mybatis)