一、MyBatis介绍
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、MyBatis优点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
- 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
三、MyBatis缺点:
- 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
- SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
- 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
- 二级缓存机制不佳
四、常用语法汇总
1、resultMap和resultType
resultType 用于返回值只有一个字段的类型,resultMap 用于返回值有多个字段的类型。
<!-- resultMap --> <resultMap id="BaseResultMap" type="cn.scpro.model.UserInfo"> <id column="id" property="id" jdbcType="INTEGER"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="doccode" property="doccode" jdbcType="VARCHAR"/> <result column="telno" property="telno" jdbcType="VARCHAR"/> </resultMap>
<!-- resultType --> <select id="getAge" resultType="java.lang.Integer"> SELECT age FROM USER WHERE id = 1 </select>
2、实体类查询条件
实体查询条件一般是指提取出公共的搜索条件,以便多次复用。
<!-- 实体类查询条件 --> <sql id="conditionExample"> <where> <if test="example.id != null"> AND id = #{example.id} </if> <if test="example.name != null"> AND name = #{example.name} </if> <if test="example.doccode != null"> AND doccode = #{example.doccode} </if> <if test="example.telno != null"> AND telno = #{example.telno} </if> </where> </sql>
3、查询字段名
查询字段名,需要返回的字段信息,提取出来复用,包含基本的和指定字段。一般是使用指定字段,以提高查询效率。
<!-- 查询字段名 --> <sql id="Base_Column_List"> id, name, doccode, telno </sql>
4、主键查询
主键查询,根据主键查询相关对象信息。
<!-- 主键查询 --> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer"> select <include refid="Base_Column_List"/> from user_info where id = #{id} </select>
5、插入数据 返回主键
新增数据,并返回主键信息,方式一:使用useGeneratedKeys="true" 和keyProperty="id"。
<!-- 插入数据 返回主键--> <insert id="insertSelective" parameterType="cn.scpro.model.UserInfo" useGeneratedKeys="true" keyProperty="id"> insert into user_info <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null"> id, </if> <if test="name != null"> name, </if> <if test="doccode != null"> doccode, </if> <if test="telno != null"> telno, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null"> #{id}, </if> <if test="name != null"> #{name,jdbcType=VARCHAR}, </if> <if test="doccode != null"> #{doccode}, </if> <if test="telno != null"> #{telno,jdbcType=VARCHAR}, </if> </trim> </insert>
6、插入数据返回主键
新增数据,并返回主键信息,方式二:使用selectKey。
<!--插入数据返回主键2 --> <insert id="insertTaskHistory" parameterType="cn.scpro.model.UserInfo" > insert into user_info <trim prefix="(" suffix=")" suffixOverrides="," > <if test="userinfo.name != null" > name, </if> <if test="userinfo.doccode != null" > doccode, </if> <if test="userinfo.telno != null" > telno, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="userinfo.name != null" > #{userinfo.name,jdbcType=VARCHAR}, </if> <if test="userinfo.doccode != null" > #{userinfo.doccode,jdbcType=VARCHAR}, </if> <if test="userinfo.telno != null" > #{userinfo.telno,jdbcType=VARCHAR}, </if> </trim> <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="userinfo.id"> SELECT id FROM user_info ORDER BY id DESC LIMIT 0,1 </selectKey> </insert>
7、更新数据
根据对象更新数据信息
<!-- 更新数据 --> <update id="updateByPrimaryKeySelective" parameterType="cn.scpro.model.UserInfo"> update user_info <set> <if test="name != null"> name = #{userinfo.name,jdbcType=VARCHAR}, </if> <if test="doccode != null"> doccode = #{userinfo.doccode}, </if> <if test="telno != null"> telno = #{userinfo.telno,jdbcType=VARCHAR}, </if> </set> where id = #{userinfo.id} </update>
8、批量新增数据
批量插入数据,以List为例。
<!-- 插入list --> <insert id="insertNotifylist" parameterType="java.util.List" useGeneratedKeys="true"> insert into user_info values <foreach collection="userlist" item="item" index="index" separator=","> (#{item.name,jdbcType=VARCHAR},#{item.doccode,jdbcType=VARCHAR}, #{item.telno,jdbcType=VARCHAR}) </foreach> </insert>
9、批量更新数据
批量更新数据,以List为例。
<!-- 更新list--> <update id="UpdateById"> update user_info set name= null where id in <foreach collection="list" item="id" separator="," open="(" close=")"> #{id} </foreach> </update>
10、批量删除数据
批量删除数据,以List为例。
<!-- 删除list --> <delete id="DeleteById" parameterType="java.util.List"> delete from user_info where id in <foreach collection="list" item="id" separator="," open="(" close=")"> #{id} </foreach> </delete>
11、查多个对象
继承map,可查多项个实体
<!-- 继承map,可查多项个实体 --> <resultMap id="BaseResultMapForMore" type="com.test.model.User" extends="BaseResultMap"> <collection property="score" ofType="com.test.model.Score" column="userid" javaType="com.test.model.Score" select="com.test.mapper.ScoreMapper.findByuserid"> </collection> <collection property="teacherlist" ofType="com.test.model.Teacher" column="teacherid" javaType="com.test.model.Teacher" select="com.test.model.TeacherMapper.findById"> </collection> <!--<collection property="homeinfo"--> <!--ofType="com.test.model.Home" column="homeid"--> <!--javaType="com.test.model.Home"--> <!--select="com.test.mapper.HomeMapper.findById">--> <!--</collection>--> </resultMap>
好了,本文MyBatis 常用语法汇总就介绍完了