[TOC]
mybatis概念
![Uploading {H53VGSI{K_MEWKS(D2]0AC_588680.png . . .]
概念:一个持久层框架
作用:ORM将sql语句映射成实体类
-
特点:
- 巧灵活
- 半自动化
- 使用与中小型项目的开发
mybatis入门
1、创建mybatis-config.xml文件
2、创建映射文件UserMapper.xml
3、获取xml配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
4、创建SqlSessionFactory
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
5、获取SqlSession
SqlSession sqlSession = factory.openSession();
6、调用SqlSession的selectOne(命名空间.id名称);
Object object = sqlSession.selectOne("user.selectUser");
7.关闭SqlSession
sqlSession.close();
增删改
增
insert into user (username,password) values(#{username},#{password});
改
update user set username=#{username},password=#{password} where uid=#{uid}
删
delete from user where uid=#{value}
Mapper接口开发
一、定义一个接口
public interface TypeMapper {
Type selectType(int typeid);
}
二、定义一个mapper.xml映射文件
mapper文件的要求:
1.namespace的值就是对象接口的全类名,并且类名和xml文件名保持一致
2.id的值就是抽象方法
3.resultType的值必须和抽象方法的返回值一致
4.parameterType的值和抽象方法的参数类型一致
注意 mapper.xml文件的约束是mapper.dtd,不是config.dtd
三、使用
将mybatis入门步骤中的步骤六改为如下代码:
TypeMapper mapper=sqlSession.getMapper(TypeMapper.class);
Type type=mapper.selectType(1);
动态sql
if
SELECT * FROM good INNER JOIN type ON good.type = type.typeid where 1=1
and gname like concat('%',#{gname},'%')
注意:
1、字符串的拼接建议使用concat来代替${}
2、判断条件中获取数据不用加#{},与el表达式不一样
where
作用where可以自动去除第一个and
and gname like concat('%',#{gname},'%')
and typename like concat('%',#{typename},'%')
choose when otherwise
作用:组合使用,相当于if else if else
set
update good
gname=#{gname},
gprice=#{gprice}
where gid=#{gid}
trim
作用:去除多余字符串
两种常见的用法
1、where and
prefix:字首 prefixOverrides:去除第一个指定的字符串
and gname like concat('%',#{gname},'%')
and typename like concat('%',#{typename},'%')
2.set ,
prefix:字首 suffixOverrides:去除最后指定的字符串
update good
gname=#{gname},
gprice=#{gprice},
foreach
作用:动态循环拼接sql部分内容
1、open代表在集合前面添加的字符串
2、close代表在集合后面添加的字符串
3、separator代表集合分割使用的字符串
4、collection代表被循环的集合,值可以是list、map、array
5、常见用法,in的语句
resultMap
作用:
1、可以将表字段与javabean对象属性名进行映射 2、将映射抽取出来,可以给多个statement所使用
映射的原理
1.先拿到type指定的类的class
2.通过newInstance创建对象
3.获取propetry中属性名,通过反射的方式调用对应的set方法
4.调用方法的invoke方法,将column的值赋值进去
5.返回封装好的对象
关联嵌套结果(resultMap与resultMap相互嵌套)
上面的association部分可以改造为
关联嵌套查询
集合嵌套结果
注意
如果在主配置文件中配置了
缓存
一级缓存(同一个SqlSession中执行同一个statement)
默认开启
二级缓存(同一个namespace中,不同SqlSession执行同一个statement)
配置 1、setting中设置cacheEnabled="true"
2、mapper中添加
3、statement中添加useCache="true"
4、调用session.close()时候才将数据写入二级缓存