读书:《深入浅出MyBatis技术原理与实战》

介绍

在不少项目中使用过MyBatis,但一直没机会深入了解过其相关知识.这次获知这本书之后,终于得以深入了解其运行原理.因原书并未附带相关随书源码.因此在看书时,非常不方便.本文后面会附上我看书时整理的源码一份(mybatis-spring 整合,及最后一章未整理),所有源码均可运行.我的环境是JDK1.8,Idea 2017.1,MySQL5.7,关于书籍信息如下:

  • 书名:深入浅出MyBatis技术原理与实战
  • 作 者:杨开振
  • ISBN:978-7-121-29594-2

mybatis logo

笔记

下面是一些笔记,供以后参考.

MyBatis基本构成:

SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口).
SqlSessionFactory:依靠工厂来生成SqlSession(会话).
SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper的接口.
SQL Mapper:它是MyBatis新设计的组件,它是由一个Java接口和XML文件(或注解)构成的,需要给出对应的SQL和映射规则.它负责发送SQL去执行,并返回结果.

MyBatis配置XML文件层次结构(顺序不能变)

配置示例(application.properties)

需要配合上面的文件使用.

maven如果不能读取xml或者properties配置文件?

首选配置properties文件方式进行配置.

MyBatis映射器主要元素

特殊字符串的替换和处理(#和&)

columns = “c1,c2,c3″ #{columns} 会直接显示”c1,c2,c3”,会对参数进行处理.

${columns} 不会处理参数,会直接显示.例如(c1,c2,c3)

需要注意SQL注入的问题.

常用工具类

二级缓存默认不开启. 开启需要在映射文件中(查询数据中),添加

即可开启二级缓存.

元素 作用 备注
if 判断语句 单条件分支判断
choose(when,otherwise) 相当于Java中的if else语句 多条件分支判断
trim(where,set) 辅助元素 用于处理一些SQL拼接问题
foreach 循环语句 在in语句等列举条件常用

映射器的组成

MappedStatement:它保存映射器的一个节点(select|insert|delete|update),包括许多我们配置的SQL,SQL的id,缓存信息,resultMap,parameterType,resultType,languageDriver等重要配置内容;

SqlSource:它是提供BoundSql对象的地方,它是MappedStatement的一个属性.

BoundSql:它是简历SQL和参数的地方.它有3个常用的属性:SQL,parameterObject,parameterMappings.

1.Executor是执行SQL的全过程,包括组装参数,组装结果集返回和执行SQL过程,都可以拦截;
2.StatementHandler是执行SQL的过程,我们可以重写执行SQL的过程;
3.ParameterHandler,拦截执行SQL的参数组装;
4.ResultSetHandler用于拦截执行结果的组装.

源码及使用

使用源码可遵循如下步骤:

  1. 配置JDK1.8环境
  2. 配置MySQL5.6
  3. 配置Maven或Gradle
  4. 配置IDEA,并将源码包中的mybatis.sql导入到数据库中
  5. over…

贴一个maven的配置(使用了阿里的maven仓库,速度杠杠的).

源码下载.mybatils 源码

JSP:实现数据分页查询

准备工作[实体层]

此示例在Linux下演示没有问题,并且此处假设你已经安装了MySQL和Eclipse.
请使用以下代码登录你的数据库:

接着开始创建数据库和表:

关于插入数据:可以使用Java进行数据插入:

JSP:分页查询数据
image-1883

逻辑处理部分

然后,就按照下面的步骤来了:

1.负责存放属性的Bean.

2.连接数据库的操作Bean.

3.处理数据的Bean.

视图部分

一个JSP页面搞定.

Java连接MySQL简化版

网上有很多Java连接MySQL的代码。现在奉上简化版本(仅测试连接,不创建表)

MySQL数据库图标
image-1708

MySQL:数据库的导出和导入

这几天fedora17一部分配置出问题了(懒得修复),正好赶上fedora18发布。
于是直接就赶了fedora18的潮流,直接换系统,然后把旧系统的一些东西复制过去(很费精力啊啊啊啊啊)

首先将mysql的文件从fedora17导出来[在fedora终端执行下面的命令,数据库文件将导入当前目录]:
*:Test作为mysql里面的数据库名称.

MySQL数据库图标
image-1700

然后将文件复制到fedora18,再打开终端执行下面的命令:

完成.

MySQL向现有表中添加主键

MySQL数据库图标
image-1686

MySQL图标

不说简单的简介了,直接说下我遇到的问题以及解决情况吧:

在前不久建表的时候,一直觉得没必要创建主键列(INT,NOT NULL,PRIMARY KEY)自增长,可后来才发现,没有主键,更新和删除太不方便了

我去CSDN发帖问了下,结果有人回复是:

见一个有自增id表  把数据导入进去  然后drop老表  rename新表

当然,我看到下面还有别人的回复:

直接加一列有什么问题吗?

于是便直接添加了一列进去,数据也自动更新了(原来的每行数据都有编号了)。

下面是向MySQL新增一列主键的SQL语句:

注:其中t2是现有的表名,c是需要增加的列的名称.