相比 Hibernate ,Mybatis 实在是学习门槛低多了。

1 . 类属性和表字段的自动对应

当向数据库中插入一行数据时,<insert>标签中的占位符#{}中的占位符的值写 model 类的属性名,但是要保证数据库中的字段名和属性名要一致,属性可以多余数据表的字段,但是不能少。这也是约定高于配置。

<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.msym.beans.User">
<!-- 添加用户之前查询到自增主键的最大值,这里 order属性指定的是‘after’,
               则得到的是这个插入语句的主键 -->
        <selectKey keyProperty="id" resultType="Integer" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into user (username,birthday,address,sex)
values (#{username},#{birthday},#{address},#{sex})
</insert>

User 类的属性:

private static final long serialVersionUID = 1L;
private Integer id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址

但是当类属性和表字段有不匹配的情况时,就需要使用到 resultMap 属性了,比如将 User 类的 Id 属性修改为 userId,

private static final long serialVersionUID = 1L;
private Integer userId;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址

如果是单表查询,只需要写上不同的就行,其余的属性还是会自动对应上,如果是多表查询,就不能省略了,每个属性都要手动映射,如果没有手动写上映射关系,将得到的是 null 值。

<resultMap type="User" id="user">
<result column="id" property="userId"/>
</resultMap> <select id="selectUserList" resultMap="user">
SELECT id, username, sex, birthday, address FROM user
</select>

2 . 自动获取自增主键

在第一点中,添加用户时,在<insert>标签中还有一个标签<selectKey>标签,这个标签用户获取当前插入数据的主键值,比如 user 表中的主键 id 是自增长的 int 类型,因为采用的数据库是 mysql ,在 mysql 中 int 类型自增主键是先插入数据,然后生成主键,所以在 order 属性中填写的是 after,而不是 before,如果使用的数据库是 oracle ,就得使用 before,因为 oracle 采用的策略是先生成自增主键,然后在插入数据。

这样配置后,之前添加到数据库中的对象就具有了主键了,可以操作其他关联到的表了。

3 . 注册 mapper.xml 文件使用到的两个标签

在使用 Mapper 动态代理实现 Dao 层时,对于注册 XxxMapper.xml 文件有多种方式,也就是在 sqlMapperConfig.xml 文件中在 <mappers>标签中进行注册。一共有如下四种方式注册:

<!-- Mapper的位置  Mapper.xml 写Sql语句的文件的位置 -->
<mappers>
<!-- 第一种: <mapper resource="sqlmap/UserMapper.xml"/> -->
<!-- 第二种: <mapper class="com.msym.dao.UserMapper"/> -->
<!-- 第三种: <mapper url="" /> -->
<!-- 第四种:—> <package name="com.msym.dao"/>
</mappers>

第一种:用的比较自由,指出 XxxMapper.xml 资源文件的路径即可,

第二种:填写的是class属性,指出的是 XxxMapper.xml 对应的XxxMapper.java 文件的包路径

第三种:需要指出 XxxMapper.xml 资源文件的绝对路径

第四种:采用包名的形式,注册指出的包下所有的 mapper 接口。

注意:第二种和第四种有个严格的要求,要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

最后推荐使用第四种。

4 . 动态 sql 拼装 (标签:if、where、foreach)

因为不能确定用户输入参数个数,当进行多条件查询,就需要写多个重载的方法,这时就需要 <if> 标签,进行条件判断,如下代码:

<!-- 根据多条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user">
SELECT id, username, birthday, sex, address FROM `user`
WHERE 1=1 <!-- 这里的 1=1 是为了防止用户没有输入性别,导致 sql 异常 -->
<if test="sex != null and sex != ''">
AND sex = #{sex}
</if>
<if test="username != null and username != ''">
AND username LIKE %${username}%'
</if>
</select>

上面的 1=1 会显得比较麻烦,下面代码使用了 <where> 标签,代替了 1=1,并且在没有输入性别参数时,where标签会将 username 前的 AND 去掉,避免了 sql 异常。【如果将 sex 中的 AND写在了后面,就会出问题了,所以一定要写在条件语句的前面】

<!-- 根据条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user">
SELECT id, username, birthday, sex, address FROM `user`
<!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->
<where>
<if test="sex != null">
AND sex = #{sex}
</if>
<if test="username != null and username != ''">
AND username LIKE
'%${username}%'
</if>
</where>
</select>

5 . sql 代码片段(减少代码量)

写的 sql 语句中大部分都是重复的部分, 比如 【select * from XXX】,这时就需要使用 sql 代码片段来减少编码量了。

<sql id="selectorUser">
select * from user
</sql>
<!-- 通过ID查询一个用户 -->
<select id="findUserById" parameterType="Integer" resultType="User">
<include refid="selectorUser"/>
where id = #{v}
</select>

在引入时需要使用到 <include> 标签。

6 .

Mybatis 点点滴滴的更多相关文章

  1. Mybatis 类属性和字段映射小小分析

    在上一篇 [Mybatis 点点滴滴]博客中,写到了 Mybatis 能够将类属性和表字段自动对应起来,在 parameterType属性值直接填写 POJO 类的名称即可(首字母不区分大小写),在 ...

  2. 关于Mybatis浅谈

    1. 历史 MyBatis本是apache的一个开源项目iBatis. 2010年这个项目由apache software foundation 迁移到了google code,并且取名为MyBati ...

  3. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  4. Java MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...

  5. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  6. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程

    本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...

  7. mybatis plugins实现项目【全局】读写分离

    在之前的文章中讲述过数据库主从同步和通过注解来为部分方法切换数据源实现读写分离 注解实现读写分离: http://www.cnblogs.com/xiaochangwei/p/4961807.html ...

  8. MyBatis基础入门--知识点总结

    对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...

  9. Mybatis XML配置

    Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

随机推荐

  1. dtree加载慢的问题

    前几天测试的时候,感觉dtree还行,也不是很慢.今天把树分支扩大以后就懵逼了,慢的一匹. 仔细看了下,才发现原来画分支的时候每次都会请求那些图,反复请求下加载时候无形拉长了很多.没有办法,就只能在h ...

  2. 关于使用READ TABLE语句

    READ tabe 是用来遍历内表,取第一条符合条件的记录. READ TABLE <itab> [INTO <wa>] WITH KEY <key> [BINAR ...

  3. Tokio,Rust异步编程实践之路

    缘起 在许多编程语言里,我们都非常乐于去研究在这个语言中所使用的异步网络编程的框架,比如说Python的 Gevent.asyncio,Nginx 和 OpenResty,Go 等,今年年初我开始接触 ...

  4. 20155339 2016-2017-2 《Java程序设计》第4周学习总结

    20155339 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承.多态与is-a 继承就是避免多个类间重复定义共同行为. 可以把相同的成粗代码提升为父类 ...

  5. Caliburn.Micro - Getting Started - Introduction

    Caliburn.Micro Xaml made easy Introduction When my “Build Your Own MVVM Framework” talk was chosen f ...

  6. Mysql:存储过程游标不进循环的原因详解

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客给刚接触存储过程的朋友做个引导作用,目的是解决游标不走循环 很多人发现他的游标,无论是嵌套循环还是单层 ...

  7. Retinex图像增强和暗通道去雾的关系及其在hdr色调恢复上的应用

    很多人都认为retinex和暗通道去雾是八杆子都打不着的增强算法.的确,二者的理论.计算方法都完全迥异,本人直接从二者的公式入手来简单说明一下,有些部分全凭臆想,不对之处大家一起讨论. 首先,为描述方 ...

  8. Maven学习(二)-----Maven启用代理访问

    Maven启用代理访问 如果你的公司正在建立一个防火墙,并使用HTTP代理服务器来阻止用户直接连接到互联网.如果您使用代理,Maven将无法下载任何依赖. 为了使它工作,你必须声明在 Maven 的配 ...

  9. Cannot get connection for URL jdbc:oracle:thin:调用中无效参数

    这个报错明显是连接数据库的url没有写对,但是,我要说的是但是,同样的代码生产没有问题,而测试环境报错了.最终哥找到那个错误,jdbc连接数据库时,有ResultSet,PreparedStateme ...

  10. 利用PreparedStatement预防SQL注入

    1.什么是sql注入 SQL 注入是用户利用某些系统没有对输入数据进行充分的检查,从而进行恶意破坏的行为. 例如登录用户名采用  ' or 1=1 or username=‘,后台数据查询语句就变成 ...