MyBatis笔记

半腔热情 提交于 2020-03-03 16:28:18

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github;
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射;
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录;

好处:
1.简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
2.灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
3.解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
4.提供映射标签,支持对象与数据库的orm字段关系映射
5.提供对象关系映射标签,支持对象关系组建维护
6.提供xml标签,支持编写动态sql.

mybatis底层就是封装了JDBC!
原生的JDBC操作
在这里插入图片描述
MyBatis常用配置标签:
1.properties标签:该标签可以加载外部的properties文件
<properties resource="jdbc.properties"></properties>
2.typeAliases标签: 设置类型别名
<typeAlias type="com.demo.pojo.user" alias="user"></typeAlias>
3.mappers标签: 加载映射配置
<mapper sesource="com/demo/mapper/userMapper.xml"></mapper>

Mybatis的代理开发
只需要定义好接口,在mapper.xml文件中映射,需要保证
1.mapper标签内的映射地址和接口是同一个;
2.方法名和sql标签的id一样,
3.参数类型一样,
4.返回值是一样,mybatis会自动将数据库返回的结果封装成java对象返回;

动态sql

在mybatis中有动态sql的一个好处,可以根据我们的业务需求来编写动态sql;
<if>条件判断
举个例子: 条件搜索 用户名和id 来查询用户信息 但是可能只传了用户名,id只是选填没有,就是在这种不确定的情况下怎么编写sql语句;

<select id="findByCondition" parameterType="user" resultType="user">
   select * from User
     <where>
        <if test="id!=0">
          and id=#{id}
         </if>
        <if test="username!=null">
          and username=#{username}
          </if> 
             </where>
             </select>

如果id不为0就加上and的条件,如果id为0就不需要加上这个条件;
<foreach>循环执行sql的拼接操作
举个例子: 查询多个id的用户信息集合, 将id封装成一个数组,ids 作为参数传入,用<foreach>标签遍历,

<select id="findByIds" parameterType="list" resultType="user">
   select * from User
 <where> 
 <foreach collection="array" open="id in(" close=")" item="id" separator=",">  
          #{id}
           </foreach>
               </where>
               </select>

foreach标签的属性含义如下:
<foreach>标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符

Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的

<!--抽取sql片段简化编写-->
<sql id="selectUser" select * from User</sql>
<select id="findById" parameterType="int" resultType="user">
   <include refid="selectUser"></include> where id=#{id}</select>
<select id="findByIds" parameterType="list" resultType="user">    <include refid="selectUser"></include>   
 <where>      
  <foreach collection="array" open="id in(" close=")" item="id" separator=",">
              #{id}
            </foreach>
                </where>
                </select>

:查询
:插入
:修改
:删除
:where条件
:if判断
:循环
:sql片段抽取

MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据
开发步骤:
1.导入通用PageHelper的坐标
2.在mybatis核心配置文件中配置PageHelper插件
3.测试分页数据获取

MyBatis多表配置方式:
一对一配置:使用做配置
一对多配置:使用+做配置
多对多配置:使用+做配置

MyBatis的常用注解 注解开发
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@One:实现一对一结果集封装
@Many:实现一对多结果集封装

使用注解开发需要扫描注解的Mapper接口

<mappers>
   <!--扫描使用注解的类-->  
    <mapper class="com.itheima.mapper.UserMapper">
     <!--或者扫描使用注解的类所在的包-->
     <!--<package name="com.itheima.mapper"></package>-->
    </mapper>
    </mappers>

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置

在核心配置文件标签内的<mapper class的属性>
在这里插入图片描述

public interface UserMapper {
    @Select("select * from user")
    @Results({
        @Result(id = true,property = "id",column = "id"),
        @Result(property = "username",column = "username"),
        @Result(property = "password",column = "password"),
        @Result(property = "birthday",column = "birthday"),
        @Result(property = "roleList",column = "id",
                javaType = List.class,
                many = @Many(select = "com.itheima.mapper.RoleMapper.findByUid"))
})
List<User> findAllUserAndRole();}



public interface RoleMapper {
    @Select("select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=#{uid}")
    List<Role> findByUid(int uid);
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!