对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点;当知道了为什么的时候就开始了解如何用的问题,如何使用mybatis、有几种使用方式、各种方式的优缺点,在这个阶段也会学习mybatis涉及到的一些标签的用法;当知道了基础用法之后,就开始接触一些高级的用法,例如动态sql的使用、mybatis的缓存使用等;至此,在实战项目中使用mybatis进行开发已经没有问题了。
接下来就开始深入的研究一下mybatis这个持久层的框架,在纯技术的方面进行研究,提高自己的能力。首先,大家需要了解一下mybatis的整体技术架构和工作原理;接下来,就开始了解一下mybatis各大核心组件的具体功能及其工作原理。至此,算是对mybatis的原理简单的了解一下了,由于博主的能力有限,因此对于mybatis的框架技术研究也就到这里算结束了。
最后会了解一些其他的东西,例如:mybatis的逆向工程使用、如何开发一个mybatis插件,在这里会介绍一下mybatis的分页实现等。
至此,mybatis也算是入门了,出去就可以和别人说,你稍微了解mybatis框架,对其也多少有一点自己的理解和看法了。
目录
1、输入映射
1、1 传入参数的方式
1)传入单个参数
2)传入多个参数
3)传入实体bean
4)传入集合
1、2 参数的获取
1)#{}
2)${}
2、输出映射
2、1 自动映射结果集 resultType
1)结果映射到Integer
2)结果映射到实体
3)结果映射到集合
4)结果映射到map
2、2 自定义结果集映射 resultMap
上一篇 留的两个问题如何传入参数、如何将查询结果映射到java对象中,这一篇做一下介绍。
大体上可分为两部分:输入映射、输出映射
1、输入映射
输入映射这里指的是将java中的参数传入到mybatis映射文件中,继而进行数据查询。
1、1 传入参数的方式
需要往sql中传入参数时,在sql 映射文件中需要指定类型,一般通过 parameterType 属性进行设置 ,但是mybatis是强大的,即使在sql映射文件中不用 parameterType 指明传入参数的类型,mybatis依然可以自动识别类型,但是建议在开发时写明,维护时可以直接明确传入参数的类型。
虽然上边这句话可能有人觉得会自相矛盾,但是还是有必要理解的,可以看一个例子:
sql 文件中写两个sql,他们区别在于,一个指定了传入参数的类型
<insert id="insertUser">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name})
</insert><insert id="insertUser2" parameterType="com.app.mapper.User">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name})
</insert>
在接口中定义两个方法,调用时效果是一样的,都会添加数据到数据库
Integer insertUser(User user);Integer insertUser2(User user);
好了,知道了上边的这些,就可以继续下边的介绍了,接下来一次介绍传入单个参数、多个参数、传入实体、传入map、传入list时如何开发sql映射文件
1)传入单个参数
直接看例子吧,没什么可说的
<delete id="delUser">delete from oa_user where id = #{id}
</delete>
Integer delUser(Long id);或者// 可以使用 @Param 来设置传入的参数名
Integer delUser(@Param("id") Long id);
2)传入多个参数
有的时候可能需要传入多个参数,mybatis会自动将多个参数封装到一个map中,sql映射文件中获取参数时也是通过获取map中参数方式。例如:需要根据性别和状态获取用户列表数据,则可以这样开发
<select id="selectUsersBySexAndStatus" resultType="com.app.mapper.User">select * from oa_user where sex = #{sex} and status = #{status}
</select>
接口中方法:
List<User> selectUsersBySexAndStatus(String sex, String status);
3)传入实体bean
<insert id="insertUser">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name})
</insert>
接口中的方法
Integer insertUser(User user);
4)传入集合
<insert id="insertUserList" useGeneratedKeys="true" keyProperty="id">insert into oa_user (id, loginName, name) values<foreach collection="list" item="user" separator=",">(#{user.id}, #{user.loginName}, #{user.name})</foreach>
</insert>
Integer insertUserList(List<User> list);
1、2 参数的获取
在sql映射文件中有两种获取参数的方式,一种是使用 #{},第二种是使用 ${},接下来,说一下这两者的用法和区别。
1)#{}
以预编译的形式将参数设置到sql语句中,相当于 JDBC 中的PreparedStatement,可以有效防止参数注入,一般可适用于大部分增、删、改、查语句中。
另外,可以通过jdbcType 属性进行类型的设置,用到的时候查询mybatis官方文档即可,我基本没有碰到过。
使用时,直接通过#{param} 参数名获取对应的参数值。
2)${}
将对应值直接拼接到sql语句中,相当于 Statement,一般用于模糊查询、排序语句中。
使用时,直接通过#{param} 参数名获取对应的参数值。
使用范例在这里就不写了,之前所有的例子中基本都用到了参数。
2、输出映射
2、1 自动映射结果集 resultType
对于一些简单的查询,mybatis可以自动映射结果集到类、实体、集合中,需要通过resultType 属性进行标识。具体使用如下:
1)结果映射到Integer
对于增、删、改的处理,如果没有使用resultType显示声明返回的结果集映射类型,则自动映射到Integer类型,为处理成功的记录数。
<!-- 返回结果集映射到Integer,为添加结果记录数 -->
<insert id="insertUser">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name})
</insert>
2)结果映射到实体
一般是用于数据查询,返回单条记录,会将数据自动封装到对应的实体类中:
<!-- 会将添加的结果映射到User实体类中,返回添加成功的User -->
<insert id="insertUser2" parameterType="com.app.mapper.User">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name})
</insert>
3)结果映射到集合
一般用于数据查询,返回多条记录,会将数据自动映射到对应的实体类中集合中,但是在sql 映射文件中使用resultType声明返回的结果类型为实体类型,而非集合类型,这个需要注意:
<select id="selectUserList" resultType="com.app.mapper.User">select * from oa_user
</select>
4)结果映射到map
通过 resultType 显式设置返回结果集映射到 map 即可,resultType = 'map'
2、2 自定义结果集映射 resultMap
可以使用 resultMap标签 来进行结果集的自定义映射。在实际开发中,其实使用自动映射一般就可以满足需求了。
其大体思路就是,先使用 resultMap 标签定义映射关系,之后使用resultMap 属性来标识返回的结果集通过自定义的映射关系进行映射。简单使用如下:
<resultMap id="user" type="com.app.mapper.User"><!-- 映射主键列,column是数据表对应的字段,property是实体User对应的字段 --><id column="id" property="id"/><!--映射非主键列时,使用result标签即可这里我自定义映射关系,将loginname字段信息映射到实体类的email属性上--><result column="loginName" property="email"/>
</resultMap><!-- 在这里使用resultMap 声明结果集映射的类型 -->
<select id="selectUser3" resultMap="user">select * from oa_user where id = #{id}
</select>
好了,这一篇就到此位置,针对于resultMap还可以实现更复杂的映射,由于篇幅原因在这里先不详细介绍,在 下一篇 继续描述。