博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis入门及配置解析
阅读量:4141 次
发布时间:2019-05-25

本文共 4627 字,大约阅读时间需要 15 分钟。

一、快速入门

1. 引入pom
mysql
mysql-connector-java
5.1.32
org.mybatis
mybatis
3.2.8
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=xxx2)eg: 
3. settings属性
1)调整 settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为	(1)cacheEnabled   		该配置影响的所有映射器中配置的缓存的全局开关	(2)lazyLoadingEnabled   	延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态		(3)logPrefix  			指定 MyBatis 增加到日志名称的前缀	(4)logImpl 				指定 MyBatis 所用日志的具体实现,未指定时将自动查找
4. typeAliases别名
1)类型别名是为 Java 类型命名的一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余
5. mapper映射器
1)
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文件中的				fetchType:延迟加载,lazy打开延迟加载;eager积极加载
4. sql片段
1)定义可重用的部分,然后 
5. 动态sql
1)if(注意 null和空串‘’ 赋值和判断相等的区别)	
2)choose when otherwise
and source = 'superVip'
and source != 'superVip'
3)update中的where update table_name set name = "a"
emsType=#{emsType}
and goodsOrderNO=#{goodsOrderNo}
4)foreach (一般和in一起用)
#{id}
6. 其他
1)sql语句中出现’<’ 	(1)使用xml中的字符实体 —— < 、> 		  2)	(1)被这个标记所包含的内容将表示为纯文本	(2)比如表示文本内容“a < c”

参考网址

注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。

ps : 有错误的还望各位大佬指正,小弟不胜感激

你可能感兴趣的文章
在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
查看>>
万年历
查看>>
作为码农你希望面试官当场指出你错误么?有面试官这样遭到投诉!
查看>>
好多程序员都认为写ppt是很虚的技能,可事实真的是这样么?
查看>>
如果按照代码行数发薪水会怎样?码农:我能刷到公司破产!
查看>>
程序员失误造成服务停用3小时,只得到半月辞退补偿,发帖喊冤
查看>>
码农:很多人称我“技术”,感觉这是不尊重!纠正无果后果断辞职
查看>>
php程序员看过来,这老外是在吐糟你吗?看看你中了几点!
查看>>
为什么说程序员是“培训班出来的”就是鄙视呢?
查看>>
码农吐糟同事:写代码低调点不行么?空格回车键与你有仇吗?
查看>>
阿里p8程序员四年提交6000次代码的确有功,但一次错误让人唏嘘!
查看>>
一道技术问题引起的遐想,最后得出结论技术的本质是多么的朴实!
查看>>
985硕士:非科班自学编程感觉还不如培训班出来的,硕士白读了?
查看>>
你准备写代码到多少岁?程序员们是这么回答的!
查看>>
码农:和产品对一天需求,产品经理的需求是对完了,可我代码呢?
查看>>
程序员过年回家该怎么给亲戚朋友解释自己的职业?
查看>>
技术架构师的日常工作是什么?网友:搭框架,写公共方法?
查看>>
第四章 微信飞机大战
查看>>
九度:题目1008:最短路径问题
查看>>
九度Online Judge
查看>>