我们今天先来简单了解一下我们持久层框架,mybatis的使用。而且现在的注解成为趋势,我主要说一下注解方向的使用吧(配置文件也会说)

从使用角度只要是三个部分,mybatis-config.xml,mapper.xml,执行文件三个部分。

mybatis-config.xml:

  主键标签为configuration成对出现的,然后是properties也就是我们的配置,用于配置数据库。settings声明一些配置,比如打印sql语句等,后面会一个个去说。然后就是我们的mappers,里面包含多个mapper标签,也就是对应我们的mapper.xml文件,在这里说一下一共有三种注入的方式,resource,class,url,resource是通过classpath配置的,如果你没有把mapper放置在resources配置下面,需要在maven里设置编译,不然我们的mapper.xml不会编译到classpath里,class通过类来注入mapper,url一般是远程注入的。再就是我们的typehandlers,可以指定类型转换的。我们也可以继承BaseTypeHandler来重写父类的方法来自定义类型转换。

来一个我自己的简单配置。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <properties resource="app.properties">
  7. <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
  8. </properties>
  9.  
  10. <settings>
  11. <!-- 打印查询语句 -->
  12. <setting name="logImpl" value="STDOUT_LOGGING"/>
  13. </settings>
  14.  
  15. <environments default="${default.environment}">
  16. <environment id="dev">
  17. <transactionManager type="JDBC"/>
  18. <dataSource type="POOLED">
  19. <property name="driver" value="${jdbc.driver}"/>
  20. <property name="url" value="${jdbc.url}"/>
  21. <property name="username" value="${jdbc.username}"/>
  22. <property name="password" value="${jdbc.password}"/>
  23. </dataSource>
  24. </environment>
  25. </environments>
  26. <mappers>
  27. <mapper resource="mybatis/dao/StudentMapper.xml"/>
  28. <!-- <mapper class="com.tuling.mybatis.dao.UserMapper"></mapper>-->
  29. <!-- <mapper url="mybatis.dao.StudentDao"></mapper>-->
  30. </mappers>
  31.  
  32. </configuration>

配置还要很多,后面源码解析里面会一点点来说明。

mapper.xml:

  1.   这个文件就是我们的编写sql的文件了,里面主要标签就是selectinsertupdatedelete我们的增删改查标签,再就是我们的缓存设置(二级缓存)。下次博客主要说博客,源码级的。
    select里包含我们常见的idresultTyperesultMapid用来指向我们的接口文件的类名,resultType为我们mybatis自带的类型,也可以是我们设置的对象BeanresultMap是我们自己定义的返回类型。这里可能会有疑问,一堆多应该怎么来配置?
    association我们可以用他来指定一对多的配置,同时可以配置懒查询还是及时查询的。我们来看一个实例,我们现有学生表格分数表,学生对应很多科目的分数,我们来看一下。先来一段测试代码。
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql://localhost/jdbc"/>
  12. <property name="username" value="root"/>
  13. <property name="password" value="root"/>
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <mappers>
  18. <!-- <mapper resource="mybatis/dao/StudentMapper.xml"/>-->
  19. <mapper class="mybatis.dao.StudentMapper"></mapper>
  20. <mapper class="mybatis.dao.ScoreMapper"></mapper>
  21. </mappers>
  22. </configuration>
  1.  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="mybatis.dao.StudentMapper">
  6. <select id="selectUser" resultType="mybatis.bean.StudentBean">
  7. select * from stu where id = #{id}
  8. </select>
  9. </mapper>
  1. package mybatis.bean;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class StudentBean implements Serializable {
  6.  
  7. private static final long serialVersionUID = 2193971369901198487L;
  8. private int id;
  9. private String name;
  10.  
  11. public int getId() {
  12. return id;
  13. }
  14.  
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18.  
  19. @Override
  20. public String toString() {
  21. return "selectUser{" +
  22. "id=" + id +
  23. "name=" + name +
  24. '}';
  25. }
  26. }
  1. package mybatis;
  2.  
  3. import mybatis.bean.ScoreBean;
  4. import mybatis.bean.StudentBean;
  5. import mybatis.dao.ScoreMapper;
  6. import mybatis.dao.StudentMapper;
  7. import org.apache.ibatis.io.Resources;
  8. import org.apache.ibatis.session.SqlSession;
  9. import org.apache.ibatis.session.SqlSessionFactory;
  10. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  11. import org.junit.Test;
  12.  
  13. import java.io.IOException;
  14. import java.io.InputStream;
  15. import java.util.List;
  16.  
  17. public class Test1 {
  18.  
  19. @Test
  20. public void test() throws IOException {
  21. String resource = "mybatis-config.xml";
  22. InputStream inputStream = Resources.getResourceAsStream(resource);
  23. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  24.  
  25. SqlSession session = sqlSessionFactory.openSession();
  26. StudentMapper mapper = session.getMapper(StudentMapper.class);
  27. StudentBean result = mapper.selectUser(1);
  28.  
  29. System.out.println(result);
  30. }
  31. }

这样我们查询到我们的学生信息,但是还未包含我们的分数。我们来改造一下。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="mybatis.dao.StudentMapper">
  6. <resultMap id="studentMap" type="mybatis.bean.StudentBean">
  7. <id property="id" column="id"></id>
  8. <collection property="scoreBean" ofType="mybatis.bean.ScoreBean">
  9. <id property="id" column="sid"></id>
  10. <!-- <result property="subject" column="subject"></result>-->
  11. <result property="score" column="score"></result>
  12. <result property="studentId" column="studentId"></result>
  13. </collection>
  14.  
  15. </resultMap>
  16.  
  17. <select id="selectUser" resultMap="studentMap">
  18. select t.id,t.name,t.address,t.num,s.id as sid,s.subject,s.score,s.studentId as studentId from student t left join score s on s.studentId = t.id where t.id = #{id}
  19. </select>
  20. </mapper>

这样就可以查询到对应关系了。需要注意的事子表如果和主表重名,一定给子表起一个别名,而且子表的每一项需要写result,不然没有结果的,但是还不是很好,本来是一个对象一个集合,现在直接变成集合了,我们再来改改。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="mybatis.dao.StudentMapper">
  6. <resultMap id="studentMap" type="mybatis.bean.StudentBean">
  7. <id property="id" column="id"></id>
  8. <collection property="scoreBean" javaType="java.util.ArrayList" ofType="mybatis.bean.ScoreBean" select="mybatis.dao.ScoreMapper.selectScoreByStudentId" column="{studentId=id}">
  9. </collection>
  10. </resultMap>
  11.  
  12. <select id="selectUser" resultMap="studentMap">
  13. select * from student t where t.id = #{id}
  14. </select>
  15. </mapper>

这个比较好用,但是切记,不是懒加载,不是懒加载,需要注意的是collection的property指定我们实体类Bean类中集合的名字。ofType是指向我们一对多中多方的实体Bean,select指定我们对应的第二句sql语句,也就是我们的子查询语句。

column="{studentId=id}" 中studentId是我们的子查询参数名,id是和我们主表的对应关系。就是说,我们要子表的什么参数等于我们的主表的哪个参数传递过去。

接下来就是我们简单的一对一了(也可以当做一对多,但是没啥卵用的多对一,项目经理让从多往一查的时候,请你吐他。。。)我们来看我一下我的配置

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="mybatis.dao.ScoreMapper">
  6. <resultMap id="scoreMap" type="mybatis.bean.ScoreBean">
  7. <id property="id" column="id"></id>
  8. <result property="subject" column="subject"></result>
  9. <result property="score" column="score"></result>
  10.  
  11. <association property="studentBean" javaType="mybatis.bean.StudentBean" column="studentId">
  12. <id property="id" column="id"></id>
  13. <result property="name" column="name"></result>
  14. <result property="address" column="address"></result>
  15. <result property="num" column="num"></result>
  16. </association>
  17. </resultMap>
  18.  
  19. <select id="selectScoreByStudentId" resultMap="scoreMap">
  20. select * from score s left join student t on s.studentId = t.id where studentId = #{studentId}
  21. </select>
  22. </mapper>

这个比较简单,就不说了,就是写了一个resultMap。我们来看一下两条sql的怎么来进行。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="mybatis.dao.ScoreMapper">
  6. <resultMap id="scoreMap" type="mybatis.bean.ScoreBean">
  7. <id property="id" column="id"></id>
  8. <result property="subject" column="subject"></result>
  9. <result property="score" column="score"></result>
  10.  
  11. <association property="studentBean" javaType="mybatis.bean.StudentBean" select="mybatis.dao.StudentMapper.selectUser" column="studentId">
  12. <id property="id" column="id"></id>
  13. <result property="name" column="name"></result>
  14. <result property="address" column="address"></result>
  15. <result property="num" column="num"></result>
  16. </association>
  17. </resultMap>
  18.  
  19. <select id="selectScoreByStudentId" resultMap="scoreMap">
  20. select * from score where studentId = #{studentId}
  21. </select>
  22. </mapper>

简单解释一下,其实和上面collection差不多的,select指定查询sql位置,column执行传递过去的参数。

其余的insert,update,delete都差不多,我这里就放在一起说了。

id 命名空间中的唯一标识符,可被用来代表这条语句。
parameterType 将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器推断出具体传入语句的参数,默认值为未设置(unset)。
parameterMap 这是引用外部 parameterMap 的已经被废弃的方法。请使用内联参数映射和 parameterType 属性。
flushCache 将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:true(对于 insert、update 和 delete 语句)。
timeout 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖驱动)。
statementType STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
useGeneratedKeys (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。
keyProperty (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认值:未设置(unset)。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
keyColumn (仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望使用多个生成的列,也可以设置为逗号分隔的属性名称列表。
databaseId 如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有的不带 databaseId 或匹配当前 databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。

useGeneratedKeys=”true”这个相当来说配置的还是比较多的,也就是我们新增成功后,我们的对象可以返回我们插入成功的主键ID。

拼装sql:

  #{}:是预处理,也是一个占位符的方式来执行sql,${}是sql的拼接,我们其实可以这样来写。

  1.   @Select("select * from ${}_sys_log where id=#{condition}")
  2. public SystemLog findSystemLog(String year,String condition);

也就是说,我们对日志sys_log表做了分库分表,按照年份来区分的表,这时我们可以采用sql拼接的方式来做。

但尽力不要用拼接的方式来做,后面我将动态sql会说具体怎么来实现。${}容易被sql注入。所以我们尽力还用占位符的方式来处理我们的SQL。

然后就是我们的插件集成,还有缓存,下次博客我们来说说缓存吧。

忘记了,学mybatis的使用,推荐一个网站https://mybatis.org/mybatis-3/zh/index.html  上面挺全的(没有源码解析,源码还得回来看我博客)。

最进弄了一个公众号,小菜技术,欢迎大家的加入

java架构之路-(源码)mybatis基本使用的更多相关文章

  1. Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战

    Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台-  什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定 ...

  2. Java生鲜电商平台-电商会员体系系统的架构设计与源码解析

    Java生鲜电商平台-电商会员体系系统的架构设计与源码解析 说明:Java生鲜电商平台中会员体系作为电商平台的基础设施,重要性不容忽视.我去年整理过生鲜电商中的会员系统,但是比较粗,现在做一个最好的整 ...

  3. Java生鲜电商平台-优惠券系统的架构设计与源码解析

    Java生鲜电商平台-优惠券系统的架构设计与源码解析 电商后台:实例解读促销系统 电商后台系统包括商品管理系统.采购系统.仓储系统.订单系统.促销系统.维权系统.财务系统.会员系统.权限系统等,各系统 ...

  4. Java生鲜电商平台-促销系统的架构设计与源码解析

    Java生鲜电商平台-促销系统的架构设计与源码解析 说明:本文重点讲解现在流行的促销方案以及源码解析,让大家对促销,纳新有一个深入的了解与学习过程. 促销系统是电商系统另外一个比较大,也是比较复杂的系 ...

  5. Activiti架构分析及源码详解

    目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...

  6. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  7. java多线程----线程池源码分析

    http://www.cnblogs.com/skywang12345/p/3509954.html 线程池示例 在分析线程池之前,先看一个简单的线程池示例. 1 import java.util.c ...

  8. JAVA上百实例源码网站

    JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...

  9. Java并发指南10:Java 读写锁 ReentrantReadWriteLock 源码分析

    Java 读写锁 ReentrantReadWriteLock 源码分析 转自:https://www.javadoop.com/post/reentrant-read-write-lock#toc5 ...

  10. Java汽车租赁系统[源码+数据库]

    系统名称 Java汽车租赁系统   (源码在文末) 系统概要 汽车租赁系统总共分为两个大的模块,分别是系统模块和业务模块.其中系统模块和业务模块底下又有其子模块. 功能模块 一.业务模块 1.客户管理 ...

随机推荐

  1. 【java提高】(17)---Java 位运算符

    Java 位运算符 &.|.^.~.<<.>> 以前学过有关java的运算符,不过开发了这么久也很少用过这个.现在由于开发需要,所以现在再来回顾整理下有关java的运算 ...

  2. Vue创建项目配置

    前言 安装VS Code,开始vue的学习及编程,但是总是遇到各种各样的错误,控制台语法错误,格式错误.一股脑的袭来,感觉创建个项目怎么这个麻烦.这里就讲一下vue的安装及创建. 安装环境 当然第一步 ...

  3. vue+el-menu实现路由刷新和导航栏菜单状态保持(局部刷新页面)

    一.菜单项激活状态保持 有时,我们在项目中会有这样一个需求,即实现 一个侧导航栏,点击不同的菜单项,右边内容会跟着变化,而页面手动刷新后想要使菜单激活状态保持,那么这个功能该如何实现呢? 现在给出以下 ...

  4. Prometheus 集成 Node Exporter

    文章首发于公众号<程序员果果> 地址:https://mp.weixin.qq.com/s/40ULB9UWbXVA21MxqnjBxw 简介 Prometheus 官方和一些第三方,已经 ...

  5. cs231n---强化学习

    介绍了基于价值函数和基于策略梯度的两种强化学习框架,并介绍了四种强化学习算法:Q-learning,DQN,REINFORCE,Actot-Critic 1 强化学习问题建模 上图中,智能体agent ...

  6. Spark安装与部署

    1.首先安装scala(找到合适版本的具体地址下载) 在/usr/local/目录下 wget https://www.scala-lang.org/download/**** 2.安装spark ( ...

  7. C++通过宏定义判断操作系统及编译器

    INTRODUCTION: C++的编译环境千奇百怪,很多时候一些代码在某些编译环境下可用,一旦移到其他环境下,就会干脆Compile Error 对此,我们可以使用C++的宏定义来判断操作系统,从而 ...

  8. 《Java 8 in Action》Chapter 3:Lambda表达式

    1. Lambda简介 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名--我们说匿名,是因为 ...

  9. keras的get_value运行越来越慢的问题解决

    https://blog.csdn.net/mingshili/article/details/81941677?utm_source=blogxgwz5

  10. odoo视图中常用widget

    widget="statusbar" 头部状态条标签 widget="email" 电子邮件地址标签 widget="selection" ...