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对象并返回。
解析:
sqlMapConfig.xml
SqlMapConfig.xml中配置的内容和顺序如下:
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
Mybatis sql语句中的#{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中
selectOne和selectList
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found:3 at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70),selectList可以查询一条或多条记录
Mapper引射器的配置
mappers(映射器)
Mapper配置的几种方法:
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
SELECT id, username, birthday, sex, address FROM `user`
WHERE 1=1
AND sex = #{sex}
AND username LIKE
'%${username}%'
SELECT id, username, birthday, sex, address FROM `user`
AND sex = #{sex}
AND username LIKE
'%${username}%'
SELECT FROM `user`
AND sex = #{sex}
AND username LIKE
'%${username}%'
id, username, birthday, sex, address
SELECT * FROM `user`
#{item}
注意:
1.使用resultType方法(自定义pojo)
思路:将接收查询结果封装成一个pojo,这个pojo可以通过继承其中一个表的对应pojo1来创建,然后书写mapper.xml,resultType即为pojo。增加接口。
2.使用resultMap方法(不使用自定义pojo)
思路:把查询结果中的信息映射到属性多的pojo中,然后在该pojo中添加另一个表的pojo1属性,将关联查询的结果映射到pojo对象中,这样就能把两个表的联合查询结果放在同一个pojo。
mapper.xml:
javatype改成property
两种方法对比,resultType比较简单,resultMap时候在特殊要求(要求延迟加载,要将pojo放到一个pojo)时用。
一对多
多对多
延迟加载
一级缓存
二级缓存