# mybatis **Repository Path**: szz12/mybatis ## Basic Information - **Project Name**: mybatis - **Description**: mybatis框架 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2017-06-09 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ###入门 1. 引入jdbc,mybatis jar包 ``` mysql mysql-connector-java 5.1.41 org.mybatis mybatis 3.4.4 ``` 2. 在src/main/resources中新建 mybatis-config.xml 这个文件中主要配置 数据库的连接信息,和映射文件所在的位置 3. 映射文件 mybatis为了顺利找到映射文件中 sql语句,对每个要执行的sql语句进行了标识,有两级: 1. namespace 类似于包名 2. id 同一个namespace中id必须唯一 使用namespace + id 就能找到sql语句 4. 写好映射文件之后,需要将映射文件的位置告诉 mybatis-config.xml ``` ``` 5. 编写测试用例 ### 映射器接口 sqlSession中提供了getXXX方法来执行 mapper文件中的sql语句.因为 mapper中的sql语句是使用 namespace+ id的方式来标识的,所以每次调用getXXX方法的时候,都需要传递一个很长的名称,如果名称写错,只能在运行的时候发现错误。 所以MyBatis提供了映射器接口的方式。编写一个interface,这个interface的package 将于mapper文件中的namespace对应, interface中的 method于 mapper文件中的id对应 sqlSession通过getMapper(Class cls)方法可以获取一个映射器接口的对象,这个接口不用实现,MyBatis自动实现, 当接口对象的方法被调用的时候,MyBatis通过反射的方式 拿到 接口的package和调动的方法的名称,然后根据package +method 到 mapper文件中找 namespace+id,找到后执行sql语句。 这样我们在写代码的时候,程序代码的可读性增强, 而且在编译的时候也能发现一些错误 6. mapper文件中的resultType 每次在mapper文件中写resultType的时候,都需要写全名很麻烦,我们可以在 MyBatis的配置文件中 配置 resultType的别名,配置的时候,有两种方式: A) 具体配置 ``` ``` B)指定包,MyBatis会将这个包下的所有的类自动做别名处理,规则是:去掉类的包名然后将首字母小写。PS: 3.4.4中首字母大小写都可以 ``` ``` MyBatis对系统中常用的类型,自动做了别名处理,具体查看[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html#typeAliases) ### 代码生成器 使用MyBatis提供的代码生成器插件,可以生成: 1. 实体类 2. 映射器接口 3. 映射器xml文件 - pom配置maven插件 主要注意: 插件中需要指定 插件运行所需要的jdbc驱动,生成器配置文件的路径。 插件只是生成java源代码和xml文件,它是独立运行的 - 生成器插件的配置文件 生成器的代码是不需要发布的,所以一般在 src/test/resources中配置就可以了 1. 数据库连接信息 2. 实体类存放的位置和包名 3. 生成映射文件xml的包名和位置 4. 生成映射器接口(dao) 的包名和位置 5. 要生成哪些表以及表所对应的实体类的名称 - 运行代码生成器 1. 完整的命令 mvn mybatis-generator:generate 2. 如果在eclipse中运行,则直接运行目标: mybatis-generator:generate ### resultType与 resultMap 结果映射。它定义了 结果集字段与对象 property之间的映射关系 select查询的时候,需要将结果集转换为java对象。 xml映射文件中提供了 resultType 与 resultMap。 resultType会反射javaBean对象然后将结果集中的数据抽取出来set到javaBean中 此时如果 ResultSet中的columnName 与 JavaBean中的propertyName不一致,就无法填充了。 解决办法有两个: 1. 在select语句中使用as将 columnName进行重命名,重新命名后与JavaBean PropertyName 保持一致 2. 自己做映射,使用 resultMap。 需要注意的是 在 select from users u where id = #{id} ``` 所以说 $仅仅是简单的字符串替换, 而 # 是会进行预编译的,而不仅仅是简单的字符串替换。 ### 动态 SQL 在xml映射文件中编写sql语句的时候,可能需要做一些循环和判断,此时就可以使用 动态sql,参考 [官方文档动态sql](http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html) ``` if choose (when, otherwise) trim (where, set) foreach ``` ### 插入的时候,使用自动增长列。 插入数据后,希望返回自动生成的列使用useGeneratedKeys和keyProperty ``` ``` 让代码生成器生成的时候,能够生成 这两个属性 代码生成器完整的配置属性解释: 1. [官方](http://www.mybatis.org/generator/configreference/xmlconfig.html) 2. [网友总结](http://www.jianshu.com/p/e09d2370b796) ### typeHandlers 类型处理器 MyBatis默认能够处理的数据类型(Java数据类型进入数据库和 数据库中的数据转换成Java类型)参考: [官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers) 对于特殊的类型,我们需要编写typeHandlers ,然后注册到配置文件中。 - 处理器的编写 需要实现 org.apache.ibatis.type.TypeHandler接口 setParameter: 当Java类型的数据作为参数传递给 Mapper的时候,Mybatis就会调用这个方法来转换 getResult: 当结果集中的数据要转换成Java类型的时候,Mybatis就会调用这个方法来转换 MyBatis 已经提供了基础类BaseTypeHandler实现了该接口,我们只需要继承它,实现BaseTypeHandler中的抽象方法即可 - 处理器注册 在MyBatis的配置文件中注册 1. 明确指定 ``` ``` 2. 指定一个包,MyBatis会加载这个包中所有的类 ``` ``` 注意: typeHandlers配置必须 在typeAliases后面 ### 关联查询 - oneToOne 后者 ManyToOne 1. 使用嵌套查询 ``` ``` 这种嵌套会造成N+1查询,在性能要求高的情况下,执行效率会底下 2. 使用resultMap 或者自己指定 如何映射 ``` ``` 使用这种方式的前提是 在查询的sql语句中必须使用 内连接或者 左外连接或者 交叉连接多个表,将需要的数据一次性查询出来 ,然后在 association中 指明如何从结果集中提取数据,然后设置到 关联的对象中。 手工指定如何提取结果集: ``` ``` - oneToMany 在实体类中定义一个集合来保存关联的对象 在映射的时候,使用collection来保存集合中的数据 与association不同的地方 使用ofType 来指定集合中元素的类型 ``` ``` ### Mybatis与Spring整合 1. 为什么要与Spring整合? 为了能够使用Spring的IOC特性,将MyBatis中的 Mapper映射器 注入到其它业务类中。所以Mapper必须被spring托管 2. 如何整合? 只需要让SpringIOC来创建 Mybatis中的几个重要的类SqlSessionFactory SqlSession XXXMapper 就完成了整合 步骤: - 引入spring依赖(包含springjdbc) - 引入Mybatis与spring整合的依赖. 整合时用到的关键的类就存放在这个jar包中。 ``` org.mybatis mybatis-spring 1.3.1 ``` 3. 在Spring配置文件中配置Mybatis的几个bean - Mybatis的SqlSessionFactory 原来是自己通过加载配置文件,由SqlSessionFactoryBuilder来创建的,现在由Spring容器来创建。mybatis-spring包中提供了一个类 org.mybatis.spring.SqlSessionFactoryBean,可以方便的创建出SqlSessionFactory. 原来在Mybatis的配置文件中的几个重要配置: typeAliases,typeHandlers,dataSource,mappers 都可以注入到SqlSessionFactoryBean中,这样,mybatis的配置文件就不需要了 所以配置的时候,只需要关注两点: 1. SqlSessionFactory的创建由org.mybatis.spring.SqlSessionFactoryBean完成 2. 映射器接口必须被spring扫描到,所以需要配置扫描器 完整配置: ``` ``` 最后删除 原来的mybatis的配置 4. 使用。在业务类中注入 XXXXMapper接口即可 ### 分页插件 PageHelper [github官方文档](https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md)