1、mybatis简介
MyBatis是一个支持普通SQL查询、存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects)映射成数据库中的记录。
2、mybatis原理
简单来讲,当框架启动时,通过解析mybatis-config.xml(名字不是必须这个)配置文件和mapper.xml映射文件(映射文件可以使用xml方式或者注解方式),获得sqlsessionfactory对象,再由sqlsessionfactory获得sqlsession数据库访问会话对象,通过会话对象获得对应DAO层的mapper对象,通过调用mapper对象相应方法,框架就会自动执行SQL语句从而获得结果。
第一步,创建sqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
第二步,创建sqlSession对象(DefaultSqlSession实例)
SqlSession sqlSession = sqlSessionFactory.openSession();
第三步,通过调用DefaultSqlSession的getMapper方法并且传入一个类型对象获取,这个mapper对象其实是一个一个mapperProxy的代理类,调用持久层接口的方法时就会调用到这个MapperProxy对象的invoke方法。
第四步,CRUD操作,调用session.commit()提交事务,调用session.close()关闭会话。
3、mybatis缓存
mybatis一级缓存的作用域是session,openSession()后,如果执行相同的sql(包括语句和参数),则mybatis不执行sql直接从缓存返回结果。myBatis默认一级查询时开启状态,而且不能关闭。
mybatis二级缓存的作用域是一个mapper的namespace,同一个namespace中查询sql可以从缓存中命中。二级缓存有开关,可以进行配置。
一级缓存是用来共享数据提升速度和效率的,而二级缓存则是为了延长查询结果的保存时间,从而提高系统性能。
4、CRUD标签
1)select中的属性说明:
id属性:当前名称空间下的statement的唯一标识。必须。要求id和mapper接口中的方法的名字一致。
resultType:将结果集映射为java的对象类型。必须(和 resultMap 二选一)
parameterType:传入参数类型。可以省略
2)insert 的属性说明:
id:唯一标识,随便写,在同一个命名空间下保持唯一,使用动态代理之后要求和方法名保持一致
parameterType:参数的类型,使用动态代理之后和方法的参数类型一致
useGeneratedKeys:开启主键回写
keyColumn:指定数据库的主键
keyProperty:主键对应的pojo属性名
3)update、delete的属性说明:
id属性:当前名称空间下的statement的唯一标识(必须属性)
parameterType:传入的参数类型,可以省略
5、#{}和${}
在sql相当于占位符,#{}在sql执行时参数带引号"",而${}不带引号。
能用#的地方不要用$,可以避免sql注入,更加安全。
在进行group by 或order by 的时候,需要使用${}。
6、动态sql
<select id="queryUserList" resultType="com.test.User">
select * from UserInfo WHERE sex='male'
<if test="name!=null and name.trim()!='"'>
and name like '%${name}%'
</if>
</select>
<select id="queryUserListByIds" resultType="com.test.User">
select * from User where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
参考资料: