适合小白学习的MyBatis

带你学习MyBatis

(一)什么是MyBatis

​ MyBatis是一个开源的数据持久层框架。它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索。

(二)MyBatis框架的优缺点

优点:

①与JDBC相比,减少了50%以上的代码量

②最简单的持久化框架,小巧并简单易学

③SQL代码从程序代码中彻底分离,可重用

④提供XML标签,支持编写动态SQL

⑤提供映射标签,支持对象与数据库的ORM字段映射

缺点 :

①SQL语句编写工作量大,对开发人员有一定要求

②数据库移植性差

(三)使用MyBatis的开发步骤

1、下载jar包并导入工程

​ ①mybatis-3.2.2.jar

​ ② MySQL-connector-java-5.1.0-bin.jar

2、创建MyBatis核心配置文件(configuration.xml),并配置相关的database.properties

<?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="database.properties"/>
    <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 ="${user}"/>
                <property name="password" value ="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    //mapper.xml文件的路径
        <mapper url="file:///D:\java\idea-project\sj3\src\main\java\mapper\ProviderMapper.xml"/>
    </mappers>
</configuration>

再根据自己的数据库好配置相关的database.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/数据库名?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
user=root
password=root

3、创建持久化类(POJO)和SQL映射文件

4、创建测试类

​ ①读取核心配置文件mybatis-config.xml

​ ② 创建SqlSessionFactory对象,读取配置文件

​ ③创建SqlSession对象

​ ④关闭SqlSession对象

 @Test
public  void testGetUserList {
    SqlSession sqlSession=null;
    List<Provider> providerList=new ArrayList<Provider>();
    try{
    sqlSession = MaBatisUtil.createSqlSession();
    providerlist= sqlSession.selectList("cn.smbms.dao.provider.ProviderMapper.getProviderList")
    }catch(Exception e){
    e.printStakeTrace();
    }finally{
    MyBatisUtil.closeSqlSession(sqlSession);
    }
    for(Provider provider :list){
        System.out.println(“需要打印出来的数据”);

    }
}

(四)使用MyBatis实现对数据的增删改查

1、使用insert完成增加操作

2、使用delete完成删除操作

3、使用update完成修改操作

4、使用select完成查询操作

​ select语句有很多属性可以详细配置每一条语句
​ ①id:命名空间中唯一的标识符,接口中的方法与映射文件中 的SQL语句id一一对应
​ ②parameterType:传入SQL语句的参数类型
,表示SQL语句返回值类型的完整类名或别名
​ ③resultType:表示查询语句返回结果类型的完全限定名或别名
​ ④resultMap:对外部resultMap的引用

(五)MyBatis缓存

1、一级缓存

​ 一级缓存是基于PrepetualCache(MyBatis自带)的HashMap本地缓存,作用范围为session域内,当session flush或者close之后,该session中所有的cache就会被清空

2、二级缓存

​ 二级缓存就是global caching,它超出session范围之外,可以被所有SqlSession共享,开启它只需要在MyBatis的核心配置文件(mybatis-config.xml)setting中设置即可

▪二级缓存的配置

​ ⑴在mybatis-config.xml中的setting中设置全局cache配置

<setting>
    <setting name="cacheEnabled" value="true"/>
</setting>

​ ⑵在mapper文件(如UserMapper.xml)中设置缓存

<mapper namespace="cn.smbms.dao.user.UserMapper">
    <!--cache配置-->
    <cache
       eviction="FIFO"
       flushInterval="60000"
       size="512"
       readOnly="true"/>
    ......
</mapper>

​ ⑶在mapper文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置cache

<select id="getUserList" resultType="User" userCache="true">
......
</select>

(六)动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似.MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。用于实现动态SQL的元素如下:

① if:利用if实现简单的条件选择

② choose:相当于Java中的switch语句,通常与when和otherwise搭配

③ where:简化SQL语句中where的条件判断

④ set:解决动态更新语句

⑤ trim:可以灵活的去除多余的关键字

⑥ foreach:迭代一个集合,通常用于in条件

•if,用于简单的条件判断

 <if test="title != null">
    and title like #{title}
 </if>

•where,用来简化SQL语句中的where条件判断,并能智能的处理and和or

<where>
    <if test="title != null">
    and title like #{title}
 </if>
</where>

•choose(when,otherwise),当test属性中的条件满足的话,执行when元素中的内容,不满足则自动输出otherwise元素中的内容

 <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>

•trim(where,set)

<where> 
    <if test="state != null">
         state = #{state}
    </if> 
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>

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

  <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>

•foreach,完成复杂查询,主要用于in条件查询中,迭代集合

 <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>

(七)MyBatis分页

1、引用jar
<!-- pagehelper -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.10</version>
</dependency>
<!-- jsqlparser -->
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>3.0</version>
</dependency>
2、配置拦截
<!-- 
    plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
    properties?, settings?, 
    typeAliases?, typeHandlers?, 
    objectFactory?,objectWrapperFactory?, 
    plugins?, 
    environments?, databaseIdProvider?, mappers?
-->
<plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="reasonable" value="true"/>
	</plugin>
</plugins>
3、定义sql
<select id="selectPage" resultMap="membersMap">
    select id,mname,mgender,mage from membersinfo
    where 1 = 1
</select>
4、测试
 @Test
public void testPage(){
    SqlSession sqlSession = MybatisUtils.open();
    MembersInfoMapper mapper = sqlSession.getMapper(MembersInfoMapper.class);
    //引用pagehelper设置分页信息,这行代码必须在执行mapper层的sql前一行
    PageHelper.startPage(1, 3, true);
    List<Membersinfo> list = mapper.selectPage();
    for (Membersinfo membersinfo : list) {
        System.out.println(membersinfo.getId() + "," + membersinfo.getMname());
    }
    MybatisUtils.close(sqlSession);
}

国内牛人的一个开源项目,有兴趣的可以去看源码,都有中文注释

源码:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

你可能感兴趣的:(适合小白学习的MyBatis)