学点新东西(三)Mybatis

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>

 

参考资料:

https://segmentfault.com/a/1190000015117926

https://blog.csdn.net/hellozpc/article/details/80878563

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值