Mybatis框架总结(一)

Mybatis框架总结(一)

一、什么是mybatis

  • mybatis是一个持久层的框架,是apache下的顶级项目。mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。
  • mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
  • mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)

二、mybatis框架

这里写图片描述

三、入门程序

3.1、需求
  • 根据用户id(主键)查询用户信息
  • 根据用户名称模糊查询用户信息
  • 添加用户
  • 删除 用户
  • 更新用户
3.2、环境
  • java环境:jdk1.7.0_72
  • eclipse:indigo
  • mysql:5.1
  • mybatis运行环境(jar包):
    https://github.com/mybatis/mybatis-3/releases下载,3.2.7版本
    这里写图片描述
    • lib下:依赖包
    • mybatis-3.2.7.jar:核心 包
    • mybatis-3.2.7.pdf,操作指南
  • 加入mysql的驱动包
3.3、log4j.properties

这里写图片描述

3.4、工程结构

这里写图片描述

3.5、SqlMapConfig.xml
  • 配置mybatis的运行环境,数据源、事务等
    这里写图片描述
3.6、根据用户id(主键)查询用户信息
  • 3.6.1、创建PO类
    这里写图片描述
  • 3.6.2、映射文件
    映射文件命名:User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml在映射文件中配置sql语句。
    这里写图片描述
  • 3.6.3、 在SqlMapConfig.xml加载映射文件
    在sqlMapConfig.xml中加载User.xml
    这里写图片描述
  • 3.6.4、程序编写
    这里写图片描述
3.7、根据用户名称模糊查询用户信息
  • 3.7.1、映射文件
    使用User.xml,添加根据用户名称模糊查询用户信息的sql语句。
    这里写图片描述
  • 3.7.2、编写代码
    这里写图片描述
3.8、添加用户
  • 3.8.1、映射文件
    在 User.xml中配置添加用户的Statement
    这里写图片描述
  • 3.8.2、程序代码
    这里写图片描述
  • 3.8.3、自增主键返回
    mysql自增主键,执行insert提交之前自动生成一个自增主键。通过mysql函数获取到刚插入记录的自增主键:LAST_INSERT_ID();是insert之后调用此函数。修改insertUser定义:
    这里写图片描述
  • 3.8.4、非自增主键返回
    使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。
    执行思路:先通过uuid()查询到主键,将主键输入 到sql语句中。执行uuid()语句顺序相对于insert语句之前执行。
    这里写图片描述
  • 3.8.5、通过Oracle的序列生成主键
    这里写图片描述
3.9、删除用户
  • 3.9.1、映射文件
    这里写图片描述
  • 3.9.2、代码
    这里写图片描述
3.10、更新用户
  • 3.10.1、映射文件
    这里写图片描述
  • 3.10.2、代码
    这里写图片描述
3.11、总结
  • parameterType:在映射文件中通过parameterType指定输入 参数的类型。
  • resultType在映射文件中通过resultType指定输出结果的类型。
  • #{}:
    • #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
      如果接收简单类型,#{}中可以写成value或其它名称。
    • #{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。
  • ${}:
    • sql使 表 示 一 个 拼 接 符 号 , 会 引 用 s q l 注 入 , 所 以 不 建 议 使 用 {}。
    • ${}接收输入参数,类型可以是简单类型,pojo、hashmap。
    • 如果接收简单类型,${}中只能写成value。
    • ${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。
  • selectOne和selectList:
    • selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
    • selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
3.12、mybatis和hibernate本质区别和应用场景
  • hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
    对sql语句进行优化、修改比较困难的。
    应用场景:
    适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

  • mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
    应用场景:
    适用与需求变化较多的项目,比如:互联网项目。

四、mybatis开发dao的方法

4.1、SqlSession使用范围
  • 4.1.1 SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。
  • 4.1.2 SqlSessionFactory:通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。
  • 4.1.3 SqlSession:SqlSession是一个面向用户(程序员)的接口。SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)。SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。SqlSession最佳应用场合在方法体内,定义成局部变量使用。
4.2 原始dao开发方法(程序员需要写dao接口和dao实现类)
  • 4.2.1 思路:程序员需要写dao接口和dao实现类。需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession
  • 4.2.2 dao接口
    这里写图片描述
  • 4.2.3 dao接口实现类
public class UserDaoImpl implements UserDao {

    // 需要向dao实现类中注入SqlSessionFactory
    // 这里通过构造方法注入
    private SqlSessionFactory sqlSessionFactory;

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User findUserById(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();

        User user = sqlSession.selectOne("test.findUserById", id);

        // 释放资源
        sqlSession.close();

        return user;

    }

    @Override
    public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //执行插入操作
        sqlSession.insert("test.insertUser", user);

        // 提交事务
        sqlSession.commit();

        // 释放资源
        sqlSession.close();

    }

    @Override
    public void deleteUser(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //执行插入操作
        sqlSession.delete("test.deleteUser", id);

        // 提交事务
        sqlSession.commit();

        // 释放资源
        sqlSession.close();

    }

}

  • 4.2.4 测试代码:
    这里写图片描述

  • 4.2.5 总结原始 dao开发问题

  • dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
  • 调用sqlsession方法时将statement的id硬编码了
  • 调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
4.3 mapper代理方法(程序员只需要mapper接口(相当 于dao接口))
  • 4.3.1 思路(mapper代理开发规范)
    • 程序员还需要编写mapper.xml映射文件程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
    • 开发规范:
      • 在mapper.xml中namespace等于mapper接口地址
        这里写图片描述
      • mapper.java接口中的方法名和mapper.xml中statement的id一致
      • mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
      • mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
        这里写图片描述
        这里写图片描述
  • 4.3.2 mapper.java
    这里写图片描述
  • 4.3.3 mapper.xml
    这里写图片描述
  • 4.3.4 在SqlMapConfig.xml中加载mapper.xml
    这里写图片描述
  • 4.3.5 测试
    这里写图片描述
  • 4.3.6 一些问题总结
    • 4.3.6.1 代理对象内部调用selectOne或selectList
      如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。
    • 4.3.6.2 mapper接口方法参数只能有一个是否影响系统 开发
      mapper接口方法参数只能有一个,系统是否不利于扩展维护。系统 框架中,dao层的代码是被业务层公用的。即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。
五、SqlMapConfig.xml

mybatis的全局配置文件SqlMapConfig.xml,配置内容如下:

properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
  • 5.1 properties属性
    需求:将数据库连接参数单独配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties。
    这里写图片描述
    在sqlMapConfig.xml加载属性文件:
    这里写图片描述
    properties特性:
    MyBatis 将按照下面的顺序来加载属性:
    在 properties 元素体内定义的属性首先被读取。 然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。 最后读取parameterType传递的属性,它会覆盖已读取的同名属性。
    建议:
    不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。
    在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX
  • 5.2 settings全局参数配置
    • mybatis框架在运行时可以调整一些运行参数。比如:开启二级缓存、开启延迟加载。
      全局参数将会影响mybatis的运行行为。
      这里写图片描述
  • 5.3 typeAliases(别名)

    • 5.3.1 需求
      在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。 如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
    • 5.3.2 mybatis默认支持别名

      别名  映射的类型
      _byte   byte 
      _long   long 
      _short  short 
      _int    int 
      _integer    int 
      _double     double 
      _float  float 
      _boolean    boolean 
      string  String 
      byte    Byte 
      long    Long 
      short   Short 
      int     Integer 
      integer     Integer 
      double  Double 
      float   Float 
      boolean     Boolean 
      date    Date 
      decimal     BigDecimal 
      bigdecimal  BigDecimal 
    • 5.3.3 自定义别名

      • 5.3.3.1 单个别名定义
        这里写图片描述
        引用别名:
        这里写图片描述
      • 5.3.3.2 批量定义别名(常用)
        这里写图片描述
  • 5.4 typeHandlers(类型处理器)
    mybatis中通过typeHandlers完成jdbc类型和java类型的转换。通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义.。
  • 5.5 mappers(映射配置)
    • 5.5.1 通过resource加载单个映射文件
      这里写图片描述
    • 5.5.2 通过mapper接口加载单个mapper
      这里写图片描述
      按照上边的规范,将mapper.java和mapper.xml放在一个目录 ,且同名。
      这里写图片描述
    • 5.5.3 批量加载mapper(推荐使用)
      这里写图片描述
六、输入映射

通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型。

七、输出映射
  • 7.1 resultType
    使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
  • 7.2 resultMap
    mybatis中使用resultMap完成高级输出结果映射。
    • 7.2.1 resultMap使用方法
      如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。1、定义resultMap 2、使用resultMap作为statement的输出映射类型
      这里写图片描述
      使用resultMap作为statement的输出映射类型
      这里写图片描述
  • 7.3 小结
    使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
八、动态sql
  • 8.1 什么是动态sql
    mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
  • 8.2 需求
    用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sql。对查询条件进行判断,如果输入参数不为空才进行查询条件拼接。
    这里写图片描述
    这里写图片描述
  • 8.3sql片段
    • 8.3.1 需求
      将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。方便程序员进行开发。
    • 8.3.2 定义sql片段
      这里写图片描述
    • 8.3.3 引用sql片段
      这里写图片描述
  • 8.6 foreach
    向sql传递数组或List,mybatis使用foreach解析

    • 8.6.1 需求
      在用户查询列表和查询总数的statement中增加多个id输入查询。
      sql语句如下:两种方法:

      SELECT * FROM USER WHERE id=1 OR id=10 OR id=16
      SELECT * FROM USER WHERE id IN(1,10,16)

      这里写图片描述
      这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值