MyBatis笔记摘要

什么是MyBatis

定义:

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
简单理解:
mybatis本质就是一个半自动的ORM框架,用于和数据库交互。在编码的过程中,只需要一个接口和xml就可以创建映射器,让程序员们可以专注于业务逻辑。

优缺点:

1.sql语句与代码分离,存放于xml配置文件中:
优点:便于维护管理,不用在java代码中找这些语句;
缺点: JDBC方式可以用用打断点的方式调试,但是Mybatis不能,需要通过log4j日志输出日志信息帮助调试,然后在配置文件中修改。

2.用逻辑标签控制动态SQL的拼接:
优点:用标签代替编写逻辑代码;
缺点:拼接复杂SQL语句时,没有代码灵活,拼写比较复杂。不要使用变通的手段来应对这种复杂的语句。

3.查询的结果集与java对象自动映射:
优点:保证名称相同,配置好映射关系即可自动映射或者,不配置映射关系,通过配置列名=字段名也可完成自动映射。
缺点:对开发人员所写的SQL依赖很强。
4.编写原声SQL:

优点:接近JDBC,比较灵活。
缺点:对SQL语句依赖程度很高;并且属于半自动,数据库移植比较麻烦,比如mysql数据库编程Oracle数据库,部分的sql语句需要调整。

特点:

mybatis是一种持久层框架,也属于ORM映射。前身是ibatis。相比于hibernatehibernate为全自动化,配置文件书写之后不需要书写sql语句,但是欠缺灵活,很多时候需要优化; mybatis为半自动化,需要自己书写sql语句,需要自己定义映射。增加了程序员的一些操作,但是带来了设计上的灵活,并且也是支持hibernate的一些特性,如延迟加载,缓存和映射等;对数据库的兼容性比hibernate差。移植性不好,但是可编写灵活和高性能的sql语句。

作用:

就是对JDBC代码进行封装。
MyBatis是持久层框架,它是支持JDBC的!简化了持久层开发!使用MyBatis时,只需要通过接口指定数据操作的抽象方法,然后配置与之关联的SQL语句,即可完成!

原理:

  1. 读取mybatis的全局配置文件(mybatis-config.xml 名称不固定)从中获取参数信息后(数据源、事务、映射文件mapper等)加载到内存中。

  2. 由会话工厂sqlSessionFactory根据获取到的数据库信息创建出访问数据库所需要的sqlSession会话对象。

  3. sqlSession对象调用executor接口进行对数据库的操作(sqlSession对象不能够直接操作数据库)。

  4. 执行器会根据配置和sqlSession对象中的信息查找到对应的mapper.xml执行相应的语句。

  5. mapped statement(底层封装对象)会查找对应mapper.xml中对应的id的sql执行语句,根据 输入参数+sql语句 执行数据库操作后,返回对应的输出结果。

使用:

1 引入Jar包
2 配置mybatis

  • 2.1 属性( properite) 用于配置数据源
  • 2.2 设置(settings)
  • 2.3 类型别名(typeAliases)
  • 2.4 类型处理器(typeHandlers)
  • 2.5 映射器(mappers)

3 XML 映射器

应用场景:

  • 对SQL优化要求比较高
  • 项目需求或业务经常变动

properties

  • 作用: 加载properties文件,并在核心配置文件中使用
  • 使用:
    • 利用properties标签加载properties文件
    • 利用$直接使用对应配置文件中的key

Mapper标签

  • 属性: namespace, 理解为包名

select标签

  • 名字: name

  • 返回值类型: resultType

  • 参数类型:parameterType

  • 方法体:SQL语句
    mybatis–> SQL + parameterType ----> ResultSet —> resultType

  • 为什么mybatis中查询的结果是集合不写List

    • mybatis通过方法(selectList、selectOne)来判断最后结果是集合还是对象,你只需要传递你真正数据表对应的类型即可

三层架构

  • 控制层(web, controller, servlet)
  • 业务层(service)
  • 持久层(dao,mapper)

接口代理

  • 作用:动态的创建Mapper接口的实现类
  • 要求:
    • 接口的方法名称以及参数类型返回值类型必须和SQL映射配置文件中的标签对应
    • namespace的值一定得和接口的权限定类名相同
  • 具体实现类存储在SQLSession里面
  • 抽取代码
    • 什么时候初始化配置信息拿到SQLSession(静态代码块儿, 构造方法)
    • 抽取StudentMapper作为属性字段在构造方法重初始化

limit

  • 他是MySQL的方言

mybatis分页插件

  • 使用步骤
    • 导包
    • 配置修改,添加插件
    • PageHelper.start(当前页, 显示条数)
  • 注意:标签是有编写顺序的
  • 分页信息获取
    • PageInfo
    • 创建PageInfo的时候需要传入查询结果

SQL构建器的使用

    //@Select("SELECT * FROM student")
    @SelectProvider(type = ReturnSql.class , method = "getSelectAll")
    public abstract List<Student> selectAll();
  • @SelectProvider
    type: 指定提供SQL的功能类
    method: 指定调用功能类的哪一个方法

SQL构建器使用步骤

  1. 构建SQL构建类
  2. 编写一方法,返回值为String
  3. 在原本注解开发的地方将原有的@XXX注解改为@XXProvider注解
    1. type参数指定构建类
    2. method指定对应sql的方法

mybatis整合工程

  1. 导包,mybatis + mysql

    1. 将mybatis的jar拷贝到WEB-INF/lib
      log4j-1.2.17.jar
      mybatis-3.5.3.jar
  2. 拷贝核心配置文件(log4j.properties、MyBatisConfig.xml)

    1. 到src目录下面
    2. 修改加载的配置文件(jdbc.properties修改为config.properties)
    3. 确认映射配置文件加载是否正确(Mappers标签)
  3. 接口文件(添加上对应的注解)

    1. 给接口文件添加对应sql
public interface StudentDao {
    //查询所有学生信息
    @Select("SELECT * FROM student")
    public abstract ArrayList<Student> findAll();

    //条件查询,根据id获取学生信息
    @Select("SELECT * FROM student WHERE sid=#{sid}")
    public abstract Student findById(Integer sid);

    //新增学生信息
    @Insert("INSERT INTO student VALUES (#{sid},#{name},#{age},#{birthday})")
    public abstract int insert(Student stu);

    //修改学生信息
    @Update("UPDATE student SET name=#{name},age=#{age},birthday=#{birthday} WHERE sid=#{sid}")
    public abstract int update(Student stu);

    //删除学生信息
    @Delete("DELETE FROM student WHERE sid=#{sid}")
    public abstract int delete(Integer sid);
}
  1. service层调用dao层的接口代理实现
    1. 加载配置文件获取SQLSession
    2. 拿到Mapper代理实现类调用对应方法
  2. 如何封装相同代码
    1. 能否在构造方法中去直接创建mapper 对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值