一:对象关系设计

MyBatis重点了解: 多对一  一对多   多对多    ![对象关系设计的重点](https://img-blog.csdn.net/20180325221156220?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
泛华关系:其实就是继承关系,比如类和类之间,接口和接口之间,使用extends表示.在UML中,继承通常是使用空心三角+实线来表示.实现关系:其实就是实现关系,存在于类和接口之间,使用implements表示.在UML中,实现通常是使用空心三角+虚线来表示.依赖关系:表示一个类依赖于另一个B类的定义,如果A对象离开了B对象,A对象就不能正常编译,则A对象依赖B对象(A类中使用到了B对象)在UML中依赖通常使用虚线箭头表示.
对于面向对象中的继承关系,我们在设计表的时候有三种情况:![继承关系表的三种设计方法](https://img-blog.csdn.net/20180325222503304?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
关联关系:A对象依赖B对象,并且把B对象作为A的一个成员变量,则A和B存在关联关系.在UML中关联通常使用实际箭头表示.    按照多重性分:        1):一对一:一个A对象属于一个B对象,一个B对象属于一个A对象.        2):一对多:一个A对象包含多个B对象.        3):多对一:多个A对象属于一个B对象,并且每个A对象只能属于一个B对象.        4):多对多:一个A对象属于多个B对象,一个B对象属于多个A对象.    按照导航性分:如果通过A对象中的某一个属性可以访问到B对象,则A可以导航到B.        1):单向:只能从A通过属性导航到B,B不能导航到A.        2):双向:A可以通过属性导航到B,B也可以通过属性导航到A.    判断方法:        1:判断都是从对方的实例上面来看的.        2:判断关系必须确定一对属性.        3:判断关系必须确定具体需求.
对象关系之一对一关系的表设计:![一对一表的设计](https://img-blog.csdn.net/20180325224411800?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
多对一的关系设计:![多对一的设计](https://img-blog.csdn.net/20180325224557209?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
多对多的关系设计:![多对多的关系](https://img-blog.csdn.net/20180325224751422?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
聚合关系:是一种"弱拥有"关系,表示为has-a.表示整体和个体的关系,整体和个体之间可以相互独立存在,一定是有两个模块来分别管理整体和个体.如果A和B是聚合关系,它并不是一个独立的整体,A和B的生命周期可以是不同的,通常B也是会作为A的成员变量存在.在UML中聚合通常是使用空心菱形+实线箭头来表示.
组合关系:是一种强聚合关系,是一种"强拥有"关系,表示为contains-a.整体和个体不能独立存在,一定是在一个模块中同时管理整体和个体,声明周期必须相同(级联).级联(cascade):把主对象的操作遍历的在每一个从对象上面执行相同的操作.

二:对象关系映射

多对一关联映射:跟多查询映射一对多:查看代码多对多:查看代码
额外SQL:<!-- 当结果集中的列名和对象的属性名称不匹配  处理结果集 --><resultMap id="BaseResultMap" type="Employee" ><id column="id" property="id"/><result column="name" property="name"/><!-- 额外SQL的配置方式association元素:配置单一元素的关联关系select属性:发送的额外SQLcolumn属性:将指定列的值传递给额外的SQL--><association column="dept" property="dept" javaType="Department" select="cn.wolfcode.mybatis.hello.mapper.DepartmentMapper.get"/></resultMap>
    ![N+1问题](https://img-blog.csdn.net/2018032523113376?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
内连映射:也就是多表查询:可以解决N+1的问题:<resultMap id="BaseResultMap" type="Employee" ><id column="id" property="id"/><result column="name" property="name"/><!--处理关联对象--><association property="dept" javaType="Department" columnPrefix="d_"><id column="d_id" property="dept.id"/><result column="d_name" property="dept.name"/></association></resultMap>
MyBatis的延迟加载和最佳实践配置mybatis-config.xml文件中<setting></setting>内<!-- 开启延迟加载功能 --><setting name="lazyLoadingEnabled" value="true"/><!-- 设置不要积极地去查询关联对象 --><setting name="aggressiveLazyLoading" value="false"/><!-- 延迟加载触发方法 --><setting name="lazyLoadTriggerMethods" value="clone"/><!-- 在开发中:针对单属性对象,使用association元素,通常直接使用多表查询操作,也就是使用内连查询.针对集合属性对象,使用collection元素,通常使用延迟加载也就是额外SQL处理. -->
在并发中:针对属性对象,使用association元素,通常直接使用多表查询操作,也就是使用内联查询.针对集合属性对象,使用collection元素,通常使用延迟加载,也就是额外SQL处理.
缓存机制:![一级缓存跟二级缓存](https://img-blog.csdn.net/20180325234341526?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
启动二级缓存:拷贝jar包:mybatis-ehcache-1.0.3.jar它是mybatis的桥梁ehcache-core-2.6.8.jar日志文件的拷贝slf4j-log4j12-1.7.21.jar它是下面俩个的桥梁slf4j-api-1.6.1.jarlog4j-1.2.17.jar
mybatis-config.xaml:<setting><!-- 启用二级缓存,缺省已经启用 --><setting name="cacheEnabled" value="true"/></setting>
    mapper文件中设置:<!-- 使用的EhCache技术 --><cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
ehcache.xml文件:<ehcache>  <!-- 指定硬盘的缓存目录 -->  <!-- <diskStore path="D:/temp/ehcache"/>   --><defaultCache  maxElementsInMemory="10000"  eternal="false"  timeToIdleSeconds="3"  timeToLiveSeconds="5"  overflowToDisk="true"  />  <!-- 设置默认的缓存区  maxElementsInMemory="10000"  设置最大的缓存对象数量  eternal="false" 设置缓存数据是否过期:true表示永远不过期;false允许过期,  通过timeToIdleSeconds和timeToLiveSeconds属性控制过期  timeToIdleSeconds="20" 对象在缓存区中空闲的时间,单位秒.  timeToLiveSeconds="120" 对象在缓存区中一共存活的时间,单位秒.  overflowToDisk="true" 对象超过最大的缓存数量,将数据往硬盘上缓存.  -->  <!-- 自定义区域的Cache, 填写不同的mapper-->           <cache name="cn.wolfcode.mybatis.hello.mapper.TeacherMapper"maxElementsInMemory="10000"  eternal="false"  timeToIdleSeconds="4"  timeToLiveSeconds="5"  overflowToDisk="true"  /></ehcache>  ![插件的xml文件中的属性值表示什么](https://img-blog.csdn.net/20180325235539901?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

三:MyBatis Generator

MyBatis Generator简称MBG:是一个专门为Batis,MyBatis框架使用者提供的代码生成器,可以快速的根据表生成对应的模型对象,Mapper接口,Mapper文件,甚至生成QBC风格查询对象.
MyBatis Generator的使用:1:拷贝jar包2:提供一个MGB的配置generatorConfig.xml包含了生成代码和配置的参数.3:运行MGB;方式一:使用java代码来运行(代码不需要大家写,直接用)方式二:使用Maven插件运行.

generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" ><!-- 生成的java文件的编码 --><property name="javaFileEncoding" value="UTF-8"/><property name="beginningDelimiter" value="'"/><property name="endingDelimiter" value="'"/><!-- 注释生成器 --><commentGenerator><property name="suppresssDate" value="true" /><property name="suppressAllComments" value="true"/></commentGenerator><!-- 必须要有的,使用这个配置链接数据库@TODO:是否可以扩展 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/mybatisdemo"userId="root"password="111111"></jdbcConnection><!-- 生成domain对象 --><javaModelGenerator targetPackage="cn.wolfcode.mybatis.demo.domain" targetProject="src"><property name="enableSubPackages" value="true" /></javaModelGenerator><!-- 生成Mapper文件 --><sqlMapGenerator targetPackage="cn.wolfcode.mybatis.demo.mapper"  targetProject="resources"><property name="enableSubPackages" value="true" /></sqlMapGenerator><!-- 生成Mapper 接口 --><javaClientGenerator targetPackage="cn.wolfcode.mybatis.demo.mapper"  type="XMLMAPPER"  targetProject="src"><property name="enableSubPackages" value="true" /></javaClientGenerator><!-- ============================================================================= --><table  tableName="systemuser" delimitIdentifiers="true" domainObjectName="SystemUser" ><property name="useActualColumnNames" value="true"/><generatedKey column="id" sqlStatement="JDBC" /></table><!-- ============================================================================= --></context>
</generatorConfiguration>
//java启动代码
public class Generator {public static void main(String[] args) throws Exception {//MBG执行过程中的警告信息List<String> warnings = new ArrayList<String>();//生成代码重复时,是否覆盖源代码boolean override = false;InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("generatorConfig.xml");ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(in);DefaultShellCallback callback = new DefaultShellCallback(override);//创建MBGMyBatisGenerator mbg = new MyBatisGenerator(config,callback,warnings);mbg.generate(null);//输出警告信号for (String warn : warnings) {System.out.println(warn);}}
}

MyBatis Generator的QBC查询

QBC风格:Query By Criteria,一种查询方式,比较面向对象的,看不到任何SQL语句.在这里主要由Criteria,Example组成,使用面向对象的方式去拼写查询条件,一般的适用于简单查询
只需要吧generator-Config.xml文件中的第一行中<context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >targetRuntime="MyBatis3Simple"去掉  或者  只去掉Simple   即可开发中还是喜欢带Simple的风格,因为自己写SQL在开发中好一些!

四:插件开发

        ![MyBatis执行流程总结1](https://img-blog.csdn.net/2018032612182767?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)![MyBatis执行流程图2](https://img-blog.csdn.net/20180326122105982?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)![MyBatis执行流程图3](https://img-blog.csdn.net/20180326122210153?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

PageHelper插件

1:先拷贝jar包:jsqlparser-0.9.5.jarpagehelper-5.0.0.jar2:然后mybatis-config.xml中添加<!-- 配置插件的位置,在环境上面 --><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><!-- config params as the following --><property name="param1" value="value1"/></plugin></plugins>可以查看手册学习

插件如何使用

    public class EmployeeServiceImpl implements IEmployeeService{private EmployeeMapper employeeMapper = MyBatisUtil.getMapper(EmployeeMapper.class);public PageInfo<?> query(QueryObject qo) {PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());List<Employee> list = employeeMapper.queryForList(qo);return new PageInfo<>(list);}}![pageInfo的使用](https://img-blog.csdn.net/2018032612370183?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
并且Mapper.xml文件中的的代码也不需要添加LIMIT参数:<!-- 查询结果集 --><select id="queryForList" resultType="Employee">Select id,name,sn,salary,deptId FROM employee<where><if test="keyword != null and keyword != ''"><bind name="keywordLike" value="'%'+keyword+'%'"/>AND (name like #{keywordLike} OR sn LIKE #{keywordLike})</if><if test="minSalary!=null">AND salary >= #{minSalary}</if><if test="maxSalary!=null">AND salary &lt;= #{maxSalary}</if><if test="deptId > 0">AND deptId = #{deptId}</if></where></select>
测试类:@Testpublic void test1() throws Exception {IEmployeeService service = new EmployeeServiceImpl();QueryObject qo = new EmployeeQueryObject();qo.setCurrentPage(3);qo.setPageSize(2);PageInfo<?> pageInfo = service.query(qo);System.out.println(pageInfo.getTotal());for(Object o : pageInfo.getList()){System.out.println(o);}}

MyBatis的总结(下)相关推荐

  1. mybatis源码阅读(三):mybatis初始化(下)mapper解析

    转载自 mybatis源码阅读(三):mybatis初始化(下)mapper解析 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单. ...

  2. Mybatis中SqlSession下的四大核心组件分析

    SqlSession下的四大核心组件 Mybatis中SqlSession下的四大核心组件:ParameterHandler .ResultSetHandler .StatementHandler . ...

  3. 面试官:精通 Mybatis?请回答下这几个问题

    点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! Mybatis是现在非常主流的持久层框架,虽然平时用的多,但是其中几个细节的问题,能说出个所以然来不? 一.最常见,参数中 #{} 和 $ ...

  4. mybatis整合spring下的的各种配置文件

    1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...

  5. springboot mybatis 事务_SpringBoot 下 Mybatis 的缓存

    "IT魔幻屋"致力于让你遇见更好的自己! 说起 mybatis,作为 Java 程序员应该是无人不知,它是常用的数据库访问框架.与 Spring 和 Struts 组成了 Java ...

  6. Spring Boot——MyBatis配置带下划线命名的字段自动转换驼峰命名解决方案

    问题描述 MyBatis无法查询出属性名和数据库字段名不完全相同的数据. 即:属性名和数据库字段名分别为驼峰命名和下划线命名时查出的数据为NULL. 问题分析 MyBatis默认是属性名和数据库字段名 ...

  7. Mybatis搞两下(sqlsession,动态代理)

    本文主要介绍和,其中动态代理实操了源码,我觉得值得一看,能加深你对Mybatis底层文件的映射,代理类进行的CRUD的操作,即使他本身也是通过SqlSession来执行增删改查的操作. SqlSess ...

  8. Spring+Struts2+Mybatis在Intellij下的整合

    环境:jdk 1.8,      tomcat 8.0.38; 开发工具:Intellj; 具体步骤: 1. 创建一个maven下的web项目 2. 配置相应的jar文件,具体的配置方式为: < ...

  9. MyBatis实战【下】

    七. 动态 SQL 在 MyBatis 中提供了动态 SQL 功能.将使用 Java 代码拼接 SQL 语句,改变为在 XML 映射文件中使用标签拼接 SQL 语句. MyBatis 中动态 SQL ...

最新文章

  1. php几个预定义变量$_SERVER['DOCUMENT_ROOT']
  2. ROP简单 ret2syscall
  3. 【报表技术】IReport图形化报表开发工具生成PDF文档
  4. Struts2中ActionContext和ServletActionContext
  5. Linux下备份cisco路由配置
  6. 简单实现MySQL数据实时增量同步到Kafka————Maxwell
  7. 用python二重循环求成绩表_python的循环
  8. 【车间调度】基于matlab差分进化算法求解作业车间调度问题【含Matlab源码 1743期】
  9. rsync+inotify实现数据实时同步
  10. 幻方解法之horse法生成奇阶幻方
  11. 关于学习软件逆向分析意义的阐述
  12. 计算机显示另外一个用户登录,电脑两个用户怎么在欢迎界面只显示一个?
  13. hostname -I(大写i)显示主机IP
  14. 动态照片怎么制作?这三款软件推荐给你
  15. R语言ggplot2可视化:使用geom_step可视化阶梯图、阶梯线图、可视化分组阶梯线图
  16. TreeMap实现原理 红黑树
  17. zram lz4 和 lzo 算法性能评估比较
  18. sklearn 读取csv_气象数据再分析数据的读取方式(GRIB格式为例)
  19. 软件功能以图找图自动点击鼠标 发现一款非常好用的以图视图自动操作软件AI万控系统和大家分享一下全名叫“AI人工智能万控系统”
  20. python 分解变量

热门文章

  1. 当我答出了springboot只有5%人涉足的领域,面试官一脸诧异
  2. Luogu P4478 [BJWC2018]上学路线 卢卡斯+组合+CRT
  3. thinkphp框架的优缺点
  4. struts2基础梳理(二)
  5. 关于SRAM,DRAM,SDRAM,以及NORFLASH,NANDFLASH
  6. “疯狂猜成语”软件用户体验
  7. 使用jQuery创建模态窗口登陆效果
  8. 教程视图Android教程(十三)-- Activity间的切换
  9. Siebel Admin: How to find the Component that associated with Application
  10. 决定你是富人还是穷人的12条定律