一、快速入门
1. 引入pom
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
2. 编写全局配置文件(mybatis-config.xml)
3. 配置映射文件Mapper
1)配在全局文件中包含
2)集成spring可以用 MapperScannerConfigurer的basePackage来配置要扫描成mapper的路径
4. 编码
public class TestMybatis {
@Test
public void test() throws IOException {
// 1、根据mybatis全局配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
// 使用MyBatis提供的Resources类加载mybatis的配置文件,获取输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 构建sqlSession的工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2、从SqlSession工厂中,获取sqlsession,用来执行sql
SqlSession session = sqlSessionFactory.openSession();
try {
// 查询selectOne(用getMapper()方法也可以)
Employee employee = (Employee) session.selectOne("com.hd.test.mapper.EmployeeMapper.getEmployeeById", 1);
// 输出信息
System.out.println(employee);
} finally {
// 关闭session
session.close();
}
}
}
二、全局配置文件(mybatis-config.xml)
1. environment属性
1)MyBatis提供的多环境适应机制,例如开发、测试、生产环境都需要有不同的配置
2. properties属性
1)该属性主要作用就是引入外部的properties是文件,文件格式为xxx=xxx
2)eg: <properties resource="jdbc.properties"></properties>
3. settings属性
1)调整 settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为
(1)cacheEnabled 该配置影响的所有映射器中配置的缓存的全局开关
(2)lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态
(3)logPrefix 指定 MyBatis 增加到日志名称的前缀
(4)logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找
4. typeAliases别名
1)类型别名是为 Java 类型命名的一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余
5. mapper映射器
1)<mappers>
<mapper resource="usermapper.xml"/>
</mappers>
6. plugins插件
1)MyBatis中的插件,其实类似于拦截器的效果,可以实现在MyBatis的整个运行流程中的 某些指定位置进行拦截
(1) Executor:对执行器进行拦截
(2) ParameterHandler:参数处理时进行拦截
(3) ResultSetHandler:处理结果集,封装Java对象时进行拦截
(4) StatementHandler:编译statement时进行拦截
三、映射文件Mapper
1. CRUD标签
1)select
(1)id:当前名称空间下的statement的唯一标识。必须。要求id和mapper接口中的方法的名字一致
(2)resultType:将结果集映射为java的对象类型。必须(和 resultMap 二选一)
(3)parameterType:传入参数类型。可以省略(或者在Dao层加@Param注解映射,多个参数的时候很有用)
2)insert
(1)id:唯一标识,随便写,在同一个命名空间下保持唯一,使用动态代理之后要求和方法名保持一致
(2)parameterType:参数的类型,使用动态代理之后和方法的参数类型一致
(3)useGeneratedKeys:开启主键回写 (会返回插入的表id)
(4)keyColumn:指定数据库的主键
(5)keyProperty:主键对应的pojo属性名
3)update
(1)id:当前名称空间下的statement的唯一标识(必须属性)
(2)parameterType:传入的参数类型,可以省略
4)delete
(1)id:当前名称空间下的statement的唯一标识(必须属性)
(2)parameterType:传入的参数类型,可以省略
2. #{}和${}
1)#{} 只是替换?,相当于PreparedStatement使用占位符去替换参数,可以防止sql注入
2)${} 是进行字符串拼接,相当于sql语句中的Statement,使用字符串去拼接sql;$可以是sql中的任一部分传入到Statement中,不能防止sql注入
3)#{} 只是表示占位,与参数的名字无关,如果只有一个参数,会自动对应(多个的话Dao层加@Param注解,${} 也可以这样用)
3. resultMap
1)概念
(1)ResultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中
(2)完成高级查询,比如一对一,一对多,多对多
2)属性说明
(1)id: resultMap标签的标识
(2)type: 返回值的全限定类名,或类型别名
(3)autoMapping: 值范围true(默认值)|false, 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在resultMap内明确注明映射关系才会调用对应的setter方法
3)子元素说明
(1)id : 用于设置主键字段与领域模型属性的映射关系
(2)result: 用于设置普通字段与领域模型属性的映射关系
a. property : 需要映射到JavaBean 的属性名称
b. column : 数据表的列名或者标签别名
c. javaType : 一个完整的类名,属性的java类型
d. jdbcType :JDBC类型
e. typeHandler : 数据库与Java类型匹配处理器
(3)association联合(联合元素用来处理“一对一”的关系)
a. 概念
需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler
b. 不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载
select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活
resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型
c. 属性
select:指定嵌套SQL,可以是本XML或者其他XML文件中的<select>
fetchType:延迟加载,lazy打开延迟加载;eager积极加载
(4)collection聚集(聚集元素用来处理“一对多”的关系)
a. 概念
需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称
b. 不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载
select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活
resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型(用的时候id最好取别名)
c. 属性
select:指定嵌套SQL,可以是本XML或者其他XML文件中的<select>
fetchType:延迟加载,lazy打开延迟加载;eager积极加载
4. sql片段
1)定义可重用的部分,然后 <include refid="paymentOrderSql"></include>
5. 动态sql
1)if(注意 null和空串‘’ 赋值和判断相等的区别)
<if test="name!=null and name.trim()!=''">
</if>
2)choose when otherwise
<choose>
<when test='"Y" == isSuperVip '>
and source = 'superVip'
</when>
<otherwise>
and source != 'superVip'
</otherwise>
</choose>
3)update中的where
update table_name set name = "a"
<where>
<if test="emsType!=null and emsType!=''">
emsType=#{emsType}
</if>
<if test="goodsOrderNo!=null and goodsOrderNo!=''">
and goodsOrderNO=#{goodsOrderNo}
</if>
</where>
4)foreach (一般和in一起用)
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
6. 其他
1)sql语句中出现’<’
(1)使用xml中的字符实体 —— < 、>
2)<![CDATA[ < ]]>
(1)被<![CDATA[]]>这个标记所包含的内容将表示为纯文本
(2)比如<![CDATA[ a < c ]]>表示文本内容“a < c”
参考网址
注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激