Mybatis在idea的搭建

目录

一.Mybatis概述

二.Mybatis在idea搭建

1.创建一张数据库表和表对应的实体类

2.导入Mybatis jar包和mysql 数据驱动包

3.创建Mybatis全局配置文件

4.创建sql映射文件

5.定义接口

6.测试Mybatis

7.属性(properties)

8.设置日志 

9.类型别名 

10.API 接口说明

11.参数传递

 12.增删改查

结果处理

If 元素

tirm元素

Choose 元素

Set元素

foreach元素

13特殊符号处理

14.Test测试类创建

三.mybatis一级缓存和二级缓存

1.了解缓存

2.一级缓存

3.二级缓存


友情提示可能用到Mybatis中文官网:​​​​​​https://mybatis.org/mybatis-3/zh/getting-started.html

一.Mybatis概述

  Mybatis原是Apache的一个开源项目iBatis,2010年6月这个项目由Apache Software Found 迁移到 Google Code,伴随着开发团队转投Google Code下面,iBatis3.x正式更名为Mybatis。

特点:Mybatis是一款优秀的持久层框架.避免了几乎所有的JDBC代码手动设置参数以及手动获取结果集的操作.

  Mybatis可以使用XML或注解来配置和映射,将数据库中的记录映射成Java的POJO((Plain Old Java Objects,普通的 Java 对象),是一种ORM(ORM Object Relational Mapping 对象关系映射)实现.它支持动态SQL以及数据缓存.

 Mybatis将基本的JDBC常用接口封装,对外提供操作即可.

二.Mybatis在idea搭建

1.创建一张数据库表和表对应的实体类

如下:

 

2.导入Mybatis jar包和mysql 数据驱动包

        <dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.2</version>
		</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>8.0.16</version>
	</dependency>	

3.创建Mybatis全局配置文件

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

    <!--
     配置连接数据库相关的配置
    -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" /> 
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssm_db?serverTimezone=Asia/Shanghai" />
                <property name="username" value="" />//mysql的用户名
                <property name="password" value=""/> //mysql的密码
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mappers/AdminMapper.xml"/>  //这个地址是下面创建sql映射文件的位置,我写的是我上图中的地址
    </mappers>

</configuration>

4.创建sql映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="接口地址">
      定义 sql 语句  例如
   <select id="接口中的方法名" resultType="实体类的位置" parameterType="int">
        select * from admin where id = #{id}
    </select>

</mapper>

5.定义接口

在接口中定义方法

6.测试Mybatis

public static void main(String[] args) throws IOException {
        //读取配置文件
        Reader reader = Resources.getResourceAsReader("mybatis.xml");

        //创建SqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

        //创建SqlSession
        SqlSession sqlSession = sessionFactory.openSession();

        //获得接口代理对象
        AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
        Admin admin = adminDao.adminById(1);

        System.out.println(admin);
        sqlSession.close();




    }

7.属性(properties)

    这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置

 

8.设置日志 

9.类型别名 

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean

10.API 接口说明

SqlSessionFactory 接口

使用 SqlSessionFactory 来创建 SqlSession,一旦创建 SqlSessionFactory 就 会在整个应用过程中始终存在。由于创建开销较大,所以没有理由去销毁再创建 它,一个应用运行中也不建议多次创建 SqlSessionFactory。

SqlSession 接口

Sqlsession 意味着创建与数据库链接会话,该接口中封装了对数据库操作的方 法,与数据库会话完成后关闭会话。

Mybatis-Dao 层 Mapper 接口化开发

Mapper 接口开发方式只需要程序员编写 Mapper 接口,由 Mybatis 框架创建接 口的动态代理对象,使用 sqlsession.getMapper(接口.class);获得代理对象. Mapper 接口开发需要遵循以下规范:

1、 Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同.

2、 Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同.

3、 Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同.

4、 Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同 

11.参数传递

单个参数传递

 多个参数传递使用@Param(“id”)绑定

如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定 

 12.增删改查

<insert id="唯一标识" useGeneratedKeys="true"//接收主键  keyColumn="主键的名字"
  keyProperty=“ 接收主键的属性 parameterType="参数类型">

例如:

增加

#{} 和${}区别

#{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止sql 注入

  #{}:select * from admin where uid=#{id}

${} 拼接符,会传入参数字符串,取值以后再去编译 SQL 语句,$方式无法防止 Sql 注入

  ${} ${}:select * from admin where id= '1'

注意:MyBatis 排序时使用 order by 动态参数时需要注意,用$而不是 

删除

<delete id="唯一标识" parameterType="参数类型">
    delete from admin where id= #{id}
</delete>

修改

<update id="唯一标识" parameterType=“参数类型">
    update admin set account= #{account},password= #{password} where  id= #{id}
</update>

查询

<select id="唯一标识" resultType="返回结果集类型">
    select * from admin where id= #{id}
</select>

结果处理

 简单类型输出映射

<select id="findAdminInfoCount" resultType="int">
       select count(*) from admin
</select>

 对象映射

      如果表中的表名与类中的属性名完全相同,mybatis会自动将查询结果封装 到POJO对象中. 如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换.

<!--是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。-->

<setting name="mapUnderscoreToCamelCase" value="true"/>
<select id="adminById" resultType="Admin" parameterType="int">
     select id,account,password,admin_gender from admin where id = #{id}
</select>

特殊处理定义 resultMap

定义 resutlMap

<resultMap id="adminResultMap" type="Admin">
    <id column="id" property="id"/>
    <result property="account" column="account" />
    <result property="password" column="password" />
</resultMap>

(1). resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为 “adminResultMap”

(2). resutlMap 的 id 属性是映射的 POJO 类

(3). id 标签映射主键,result 标签映射非主键

(4). property 设置 POJO 的属性名称,column 映射查询结果的列名称

使用 resutlMap

<select id="findAdminInfoResultMap" resultMap="adminResultMap">
    SELECT id ,account,password FROM admin
</select>

(1). 本例的输出映射使用的是 resultMap,而非 resultType

(2). resultMap 引用了 adminResultMap

多表关联处理结果集

resultMap 元素中 association , collection 元素

Collection 关联元素处理一对多关联

学生多方,在多方配置一方

宿舍一方,配置多方集合

 使用 resultMap 组装查询结果

根据学生查询对应宿舍的信息

<mapper namespace="com.ffyc.mybatis.dao.StudentDao_back">
    <resultMap id="studentMap" type="Student">
        <id  column="id" property="id"></id>
        <result column="num" property="num"></result>
        <result column="name" property="name"></result>
        <result column="gender" property="gender"></result>
        <association property="dorm" javaType="Dorm">
            <result column="dnum" property="num"></result>
        </association>
        <association property="admin" javaType="Admin">
            <result column="account" property="account"></result>
        </association>
    </resultMap>

    <select id="findStudentById" resultMap="studentMap" parameterType="int">
          SELECT
   s.id,
   s.num,
   s.name,
   s.gender,
   d.num dnum,
   a.account
 FROM student s LEFT JOIN dorm d ON s.dormid = d.id
                LEFT JOIN admin a ON s.adminid = a.id
                WHERE s.id = #{id}
    </select>

 使用 resultMap 组装查询结果

根据宿舍id查询每个宿舍入住人数

<resultMap id="dormMap" type="Dorm">
        <id  column="id" property="id"></id>
        <result column="num" property="num"></result>
        <collection property="studentList" javaType="List" ofType="Student">
            <result column="name" property="name"></result>
            <result column="snum" property="num"></result>
        </collection>
    </resultMap>


    <select id="findDorms" resultMap="dormMap">
        SELECT 
          d.id,
          d.num,
          s.name,
          s.num snum
         FROM dorm d LEFT JOIN student s ON d.id = s.dormid
    </select>

嵌套查询

将一个多表关联查询拆分为多次查询,先查询主表数据,然后查询关联表数据.

下面是学生的嵌套查询

<resultMap id="studentMap1" type="Student">
        <id  column="id" property="id"></id>
        <result column="num" property="num"></result>
        <result column="name" property="name"></result>
        <result column="gender" property="gender"></result>
        <association property="dorm" javaType="Dorm" select="findDormById" column="dormid"></association>
        <association property="admin" javaType="Admin" select="findAdminById" column="adminid"></association>
    </resultMap>


    <select id="findStudentById1" resultMap="studentMap1" parameterType="int">
        select id,num,name,gender,dormid,adminid from student where id=#{id}
    </select>
    <select id="findDormById" resultType="Dorm" parameterType="int">
        select num from dorm where id = #{dormid}
    </select>
    <select id="findAdminById" resultType="Admin" parameterType="int">
        select account from admin where id = #{adminid}
    </select>

(1). select:指定关联查询对象的 Mapper

(2). column="dormid":关联查询时将 num 列的值传入 studentMap1, 并将 studentMap1 查询的结果映射到 Emp 的 dorm 属性中

(3).collection 和 association 都需要配置 select 和 column 属性,两者配置方法相同

Mybatis 动态 SQL

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。 如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么 的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态 SQL 可以彻底处理 这种痛苦。

MyBatis 中用于实现动态 SQL 的元素主要有:

If

where

trim

set

choose (when, otherwise)

foreach

If 元素

if 标签可以对传入的条件进行判断

如果没有type=1 ,当那么和sex都为null时,就会查不出

查询条件 

对于查询条件个数不确定的情况,可使用元素。如下:

if 条件判断
       where 动态根据where标签内的if是否有成立,动态添加where关键字,还可以去除条件前面的关键字(and / or)
        <select id="findStudents" resultType="Student" parameterType="Student">
         select id,num,name,gender from student
        <where>
           <if test="num!=0">
              num = #{num}
           </if>
           <if test="name!=null">
               and  name = #{name}
           </if>
           <if test="gender!=null">
              or   gender = #{gender}
           </if>
        </where>
    </select>

 元素会进行判断,如果它包含的标签中有返回值的话,它就插入一个 ‘where’。 此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉 AND 或 OR。

tirm元素

trim 元素 where 标签,其实用 trim 也可以表示,当 WHERE 后紧随 AND 或则 OR 的 时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定内容

trim
prefix="where" 有条件成立时,添加指定的关键字
 prefixOverrides="and" 覆盖指定的关键字
    <select id="findStudents" resultType="Student" parameterType="Student">
         select id,num,name,gender from student
        <trim prefix="where" prefixOverrides="and">
           <if test="num!=0">
              num = #{num}
           </if>
           <if test="name!=null">
               and  name = #{name}
           </if>
           <if test="gender!=null">
               and  gender = #{gender}
           </if>
        </trim>
    </select>
Choose 元素

有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

choose只会选择一种,当第一个when成立时后面的就直接跳过了

<select id="findStudent" resultType="Student" parameterType="Student">
        select id,num,name,gender from student
        <trim prefix="where" prefixOverrides="and">
            <choose>
                <when test="num !=num">
                    num = #{num}
                </when>
                <when test="name !=name">
                   and name = #{name}
                </when>
                <otherwise>
                   and gender = "男"
                </otherwise>
            </choose>
        </trim>
</select>
Set元素

用于动态更新语句的类似解决方案叫做 setset 元素可以用于动态包含需要更新的列,忽略其它不更新的列.比如:

<update id="updateStudent" parameterType="Student">
        update student
        <set>
            <if test="num!=0">
                num = #{num},
            </if>
            <if test="name!=null">
                name = #{name},
            </if>
            <if test="gender!=null">
                gender = #{gender}
            </if>
        </set>
         where  id = #{id}

      </update>

也可以使用trim实现

<update id="updateStudent" parameterType="Student">
        update student
       <trim prefix="set" suffixOverrides=",">
            <if test="num!=0">
                  num = #{num},
            </if>
             <if test="name!=null">
                 name = #{name},
             </if>
             <if test="gender!=null">
                 gender = #{gender}
             </if>
        </trim>
        where  id = #{id}
    <!--       where id &lt; 2(转义为<)-->
    <!--          where id &gt;1(转义为>)  -->
    <!--    where id <![CDATA[ < ]]>2   将需要转义的字符放进去<![CDATA[ ]]>就不用转义,但也会使 
    标签失灵   -->

      </update>
foreach元素

动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。比如:

<delete id="deleteStudent" parameterType="Integer">
      delete from student where id in
           <foreach collection="array" item="item" open="(" separator="," close=")">
                #{item}
           </foreach>
</delete>

注意:主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach 元素的属性主要有 item,index,collection,open,separator,close。 item 表示集合中每一个元素进行迭代时的别名,index 指定一个名字,用于 表示在迭代过程中,每次迭代到的位置,open 表示该语句以什么开始, separator 表示在每次进行迭代之间以什么符号作为分隔符,close 表示以什 么结束,在使用 foreach 的时候最关键的也是最容易出错的就是 collection 属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的.

     如果传入的是单参数且参数类型是一个 List 的时候,collection 属 性值为 list.

     如果传入的是单参数且参数类型是一个 array 数组的时候, collection 的属性值为 array.

13特殊符号处理

在 mybatis 中的 xml 文件中,存在一些特殊的符号,比如:、"、&、<> 等,正常书写 mybatis 会报错,需要对这些符号进行转义。具体转义如下所示: 特殊字符      转义字符

<    &lt;

>    &gt;

"     &quot;

'      &apos;

&     &amp;

14.Test测试类创建

    1.导入jar包

      

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>provided</scope>
        </dependency>

   2.添加@Test测试

 

三.mybatis一级缓存和二级缓存

1.了解缓存

     缓存可以将数据保存在内存中,是互联网系统常常用到的。目前流行的缓存服务器有 

MongoDB、Redis、Ehcache 等。缓存是在计算机内存上保存的数据,读取时无需再从磁盘读

入,因此具备快速读取和使用的特点。和大多数持久化框架一样,MyBatis 提供了一级缓存和二级

缓存的支持。默认情况下,MyBatis 只开启一级缓存。

2.一级缓存

     

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

在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用同一个 mapper 的方法,往往只执行一次 SQL。因为使用 SqlSession 第一次查询后,MyBatis 会将其放在缓存中,再次查询时,如果没有刷新,并且缓存没有超时的情况下,SqlSession 会取出当前缓存的数据,而不会再次发送 SQL 到数据库。

由于 SqlSession 是相互隔离的,所以如果你使用不同的 SqlSession 对象,即使调用相同的 Mapper、参数和方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果。
 

 一级缓存的生命周期

    1.同一个sqlsession查询的sql不一样

    2.手动清除了缓存 clearCache()

    3.sqlsession执行力update((update()、delete()、 insert()) ),都会清空缓存的数据,但是该对象可以继续使用。

    4.MyBatis 在开启一个数据库会话时,会 创建一个新的 SqlSession 对象, SqlSession 对象中会有一个新的 Executor 对象。Executor 对象中持有一个新 的 PerpetualCache 对象,如果 SqlSession 调用了 close()方法,会释放掉一级 缓存 PerpetualCache 对象,一级缓存将不可用。

3.二级缓存

  

     二级缓存是 SqlSessionFactory 级别的,根据 mapper 的 namespace 划分区域 的,相同 namespace 的 mapper 查询的数据缓存在同一个区域,如果使用 mapper 代理方法每个 mapper 的 namespace 都不同,此时可以理解为二级缓 存区域是根据 mapper 划分。

     每次查询会先从缓存区域查找,如果找不到则从数据库查询,并将查询到数据写 入缓存。Mybatis 内部存储缓存使用一个 HashMap,key 为 hashCode+sqlId+Sql 语句。value 为从查询出来映射生成的 java 对象。 sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区 域,防止脏读。二级缓存参考下图所示:

 配置二级缓存

1.在mybatis.xml里面中启用二级缓存

 2.将对象序列化

将所有的 POJO 类实现序列化接口 Java.io. Serializable

3.配置映射文件

  在Mapper映射文件中添加<cache />,表示此mapper开启二级缓存

当SqlSession关闭时,会将数据存入到二级缓存.

 

     

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值