1 介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
2 入门
- 下载地址:https://github.com/mybatis/mybatis-3/releases
- mybatis的核心包:mybatis-3.2.7.jar
- mybatis也会有一些依赖包,下载完成后在lib目录中即可查看。
- 步骤
(1) 创建一个java工程
(2) 把包导入工程
(3) 导入log4j.propertis文件,mybatis默认使用log4j作为输出日志信息
(4) 在资源目录中创建sqpMapConfig.xml(mybatis的核心配置文件)文件,并对其进行配置。
创建约束:
环境配置:
加载映射:
package:将某个包下所有映射文件都加载进来
3 数据库操作
- 创建实体类User,属性有id,usename,password,在实体类上加上注解(需要导包和添加插件),get、set、tostring方法
完成后创建dao包,在dao包中对数据库进行操作(这使用mapper动态代理开发)。
(1)在dao包下创建一个UserDao接口
(2)在dao包下创建一个xml文件,文件名与UserDao名字要相同(这里定义为UserDao.xml)
(3)将dao包到sqlMaperConfig.xml中的mappers映射中
(4)操作UserDao.xml
注意: - 在UserDao.xml给mapper命名,namespace与dao中接口的路径相同
- 接口的方法名必须要与UserDao.xml中定义的每个的statement(即对数据库增删改查)的id相同
- 接口中方法出入的参数和UserDao.xml中定义的每个sql的parameterType的类型要相同
- 接口中方法输出的参数和UserDao.xml中定义的每个sql的resultType的类型要相同
- 在使用的过程中,如果传入的参数类型(parameterType)是简单数据类型,就可以忽略不写,如Integer等
- #{}和${}的区别:
- #{}表示一个占位符号,可以防止sql注入。可以接收简单类型,也可以接收实体类,大括号中可以是value,也可以是其他值。
- 后者表示拼接sql串,可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
- parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。 - selectOne和selectList
- selectOne:查询一条数据,如果使用selectOne查询多条数据就会报错
- selectList:查询多条数据,可以使用selectList查询一条数据,也可查询多条
4 sqlMapConfig.xml配置文件
mybatis除了自身支持一些别名外,还可以自己设置别名。
typeAliases:设置别名
5. 动态sql
通过mybatis提供的各种标签方法实现 动态拼接。
if标签:
test:只有当test为true时,后面的代码才会拼接到前面的代码后面
where标签:
可以有多个where标签,同时也是只有test为true时才会执行。
froeach标签:
当传入的参数的类型为如List这种需要遍历的类型时,可以使用foreach标签对其进行遍历,来获取其中的数据。
foreach中的属性:collection:需要遍历的集合 item:内容 index:索引 open:开始的时候需要加的,如“(” close:结束的时候需要加的东西,如“)” separator用什么分隔其中的数据(open、close这些都是需要才加)
6.sql片段
抽取重复使用的sql语句(类似java中方法的抽取)
7 多数据查询
当要查询的数据为多个表时,就可以使用多数据查询,当数据为一对一时,使用resultMap加association查询;当数据为一对多时,使用resultMap加collection查询。
一对一:
一对多:(这里使用了延时操作,即collection中多了两个属性column和select,使用延时需要在sqlMapConfig.xml文件中配置)