MyBatis 是一款半自动的ORM 模型,它支持定制化 SQL、存储过程以及高级映射
为什学习MyBatis
- MyBatis解决了jdbc 的问题
-
1.数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
- 2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
- 3..向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型
- 4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
-
MyBatis快速开始
-
- MyBatis基础配置
- 1.configuration 元 素:标识配置文件的起始,所有配置信息都存放在这里
- 2. enviroments 元 素:配置数据库环境信息,注册数据源配置数据库事务
- 3.properties 元素:配置属性的元素,可以在配置文件的上下文中使用该属性。
- 4.typeAliases:(声明类在哪个包下,之后用哪个类就可以直接写那个类,不区分大小写)
- 5.mappers 元 素:用来在MyBatis初始化的时候引入映射器。
- 动态代理
- 1. 接口方法名要和 sqlmapper 的id名一样 能找到要执行的sql语句
- 2. 接口返回值的类型 要和 sqlmapper中 resultType 类型要一致(每个元素的类型)
- 3. 接口中入参的类型 要和 sqlmapper 中 parameterType类型要一致
- 4.sqlmapper中的namescpace 的值要和 接口的类路径要一致
- 5. 接口要和sqlmapper 放在同一个包下
- 6. 接口的名字 要和 sqlmapper 文件名要一致
MyBatis映射器分为语句映射和关系映射
1.SQL语句映射
- 1.select
- 1.属性
- 1.id:唯一标识,接口中的方法名
- ··
- ·
- ··
- 2.parameterType:参数的类型(如果要传入多个参可以使用Map集合或者在对象中加入属性,入参类型:当前类的类型)
- 3.resultType:结果的类型(可以返回引用数据类型、也可以是map集合)
- 4.resultMap :复杂的结果集映射关系
- 5.Mybatis底层不支持方法重载
- 6..Mybatis传参只能传一个
- 1.id:唯一标识,接口中的方法名
- 1.属性
- 2.insert
- 1.新增数据时需要获取刚刚新增的数据的ID,就需要用到Mybatis的主键回填(由于数据库的隔离级别默认是可重复读(幻读)会导致达到的结果不是自己想要的)
- 1keyProperty(回填的类中的属性作为主键)
- 2.keyColumn (数据库中的表的字段作为主键)
- 3.useGeneratedKeys:是否启用主键回填(默认为false)
- 4.keyProperty和keyColumn不能同时使用
- 3.update(跟之前一样)
- 4.delete(跟之前一样)
2.关系映射
- 1.sql
- 2.parameterMap(入参的映射)不使用:(字段和类型的映射,定义时都写好了)
- 3.resultMap(返回结果的映射)
- 1.当字段名和属性名不一致时(1.可以通过起别名来解决 2.也课以通过resultMap来自定义映射来解决)
- 2.自定义resultMap(单表的查询)
-
- 1.id是用来标识主键的(一个resultMap只能有一个id,id也可以用result来代替)
- 2.<resultMap type="Master" id="m">:类型就是要映射的类名,id可以随便起名(不能重复)
- 3.<result column="sm_name" property="name"/>可以有多个
- column:字段名
- property:类的属性名
- 4.如果是单表查询字段和类的属性名一样的可以不用写
-
- 3.一对一表的查询
- 1.每个字段都必须映射
- 2.标签:<association property="bj">(association一对一映射的标签)property="bj"要映射的类型(以班级为例将班级作为学生属性传进去)bj就是班级作为学生属性的名字
- 4.一对多表的查询
- 1.每个字段都必须映射
- 2.标签: <collection property="slist" ofType="Student" > (collection property就是班级类中学生集合的名字,ofType指定是什么类型的)
- 5.级联的缺陷(多张表的联查)
- 1.性能缺陷:级联操作会降低性能增加程序的执行时间;
- 2.复杂度缺陷关联较多造成复杂度的增加,不利于他人的理解和维护
- 3.根据实际情况增加级联关系,建议超过3层关联时尽量少用级联