一.核心组件
1.SqlSessionFactoryBuilder:根据配置或者注解模式生成SqlSessionFactory.
2.SqlSessionFactory:根据工厂来生成SqlSession。一般是一个全局单例,对一个数据库连接池,用它来创建SqlSession。
3.SqlSession:一次会话,即发送sql,并返回结果,也可以获取Mapper接口。相当于一个JDBC的connection对象,在一次失误会话结束后,会被关闭,他可以为我们获得Mapper.
4.Sql Mapper:由一个Java接口和XML文件组成,给出相对应的sql和映射规则,它负责发送sql,并把返回结果映射为实体对象。SqlSession销毁的时候它也会被销毁。
二.配置详解
1.枚举处理器:EnumOrdinalTypeHander或者EnumTypeHander,用来将sql返回的字段,根据枚举设置转换为相应的枚举名称。
2.mybatis默认开启一级缓存,不开启二级缓存。开启二级缓存时候,要求返回的对象必须是可序列化的,而且是在sqlsession调用了commit方法后才能生效。缓存回收策略有:最少使用LRU,先进先出FIFO,软引用SOFT(移除基于垃圾回收期状态和软引用规则的对象),弱引用,更积极地移除基于垃圾回收期状态和弱引用规则的对象,这里采用的是LRU,移除最长时间不用对象。另外,还有3个设置属性分别是:flushInterval:刷新间隔时间,单位毫秒;size:引用数目,代表缓存最多存储多少个对象,不宜过大,否则会导致内存溢出,1024及其以下比较合适;readOnly,设置只读后不能修改,可以快速读取,但无法修改缓存。
3.动态sql:就是在select 区域内使用if、choose、when、ohterwise元素。如果判断查询条件,则使用where【元素】,在里面加入if判断比较合适。如果参数是个数组或者list、set等集合,则可以使用foreach元素,形成in()语句。如果模糊查询,则可以使用bind元素,讲传入的参数包装成新参数,在sql语句中引用新参数即可,避免了不同数据库对like语句后的参数连接语法不同问题。
三.各种版本mybatis差异
1.tk.mybatis,查询采用Example.Criteria方式,参数用的是实体的字段作为查询条件,然后转为数据库表字段,如果想过滤某个字段,则在实体字段上添加标记:@Transient【import javax.persistence.*;】
其查询实例:
Example example = new Example(User.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("userId", sysUser.getId());#注意,这里用的是User表中的UserId字段,然后翻译成数据库字段。 List<User> moldUserList = userMapper.selectByExample(example);
2.mybatis-plus,采用直sql方式,参数直接采用的是数据库字段形式,如果想忽略某个字段则添加标记:@TableField(exist = false)
其查询实例:
QueryWrapper<User> example1 = Wrappers.query(); example1.eq("user_id", userId);#这里用的是数据库表字段 List<User> gramWeightRecords = UserMapper.selectList(example1);