以下使用的数据库是Mysql。

Mybatis字段类型映射

在resultMap 中定义数据库字段对应的字段类型。

  <resultMap id="BaseResultMap" type="com.model.Order" >
<constructor >
<idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="order_id" jdbcType="VARCHAR" javaType="java.lang.String" />
<arg column="create_date" jdbcType="DATE" javaType="java.util.Date" />
<arg column="create_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
<arg column="action" jdbcType="TINYINT" javaType="java.lang.Byte" />
<arg column="total_price" jdbcType="DECIMAL" javaType="java.math.BigDecimal" />
</constructor>
</resultMap>

也可以使用property,如下所示

    <resultMap id="BaseResultMap" type="com.model.Bill">
<result property="serialNo" column="fserial_no" jdbcType="VARCHAR"/>
<result property="type" column="ftype" jdbcType="INTEGER" />
<result property="invoiceAmount" column="finvoice_amount" jdbcType="DECIMAL" />
<result property="createTime" column="fcreate_time" jdbcType="TIMESTAMP"/>
<result property="invoiceDate" column="finvoice_date" jdbcType="DATE" />
</resultMap>

Mybatis动态Sql:

Mapper.xml如下:

<select id="selectOrderList" resultMap="BaseResultMap"
parameterType="com.model.Order">
select
<include refid="Base_Column_List" />
from t_order
where 1=1
<if test="id != null and id != '' ">and id = #{id,jdbcType=INTEGER} </if>
<if test="serialId != null and serialId != '' ">and serialId = #{serialId,jdbcType=VARCHAR} </if>
</select>

如果不想写1=1,也可以直接使用where标签。

where标签知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 标签也知道如何将他们去除。

示例如下:

<select id="selectOrderList" resultMap="BaseResultMap"
parameterType="com.model.Order">
select
<include refid="Base_Column_List" />
from t_order
<where>
<if test="id != null and id !='' "> id = #{id,jdbcType=INTEGER} </if>
<if test="serialId != null and serialId != '' ">and serialId = #{serialId,jdbcType=VARCHAR} </if>
</where>
</select>

对应的Dao层如下:

此处直接将对象作为方法参数,假设参数为Order对象,传递到xml中的参数就包括了Order对象的属性变量,如上的id、serialId。

List<Order>  selectOrderList(Order order);

如果仅有一两个变量,也可以直接传递变量,如下:

List<Order>  selectOrderList( @Param("id ")Integer id  , @Param("serialId ")String serialId );

Mybatis模糊查询:

模糊查询可以使用LIKE关键字和CONCAT()函数。

假设要查询的字段为product,从Dao层传递过来的参数为productName。

示例如下:

     WHERE 1=1
<if test="productName!=null and productName!='' "> AND product LIKE CONCAT('%',#{ productName , jdbcType=VARCHAR },'%') </if>

Mybatis使用IN关键字指定条件范围:

IN关键字,需要通过foreach标签来实现。

其中,collection对应的是Dao层传递过来的参数(一般是集合或数组),

item是自己命名的,表示范围中的变量名称。

separator是指分隔符。index是指下标。

示例如下:

<select id="queryOrderUsedCount" resultType="java.lang.String">
SELECT count(*)
FROM t_check_account
WHERE 1=1
<if test=" clientIdList!=null">
AND fclient_id IN
<foreach collection="clientIdList" item="clientId" index="index" open="(" close=")" separator="," >
#{clientId}
</foreach>
</if>
</select>

对应的Dao层为:

String  queryOrderListByCondition(@Param("clientIdList")String clientIdList);

Mybatis查询条件范围判断。

经常需要用Mysql查询在某个时间段的数据。

由于Mybatis中可能会将大于号>和小于号<视为标签,所以需要加上 字符。

示例如下:

 WHERE 1=1
<if test="beginTime!=null and beginTime!='' "> <![CDATA[ AND t1.fcreate_time >= #{ beginTime , jdbcType=VARCHAR } ]]> </if>
<if test="endTime!=null and endTime!='' "> <![CDATA[ AND t1.fcreate_time < #{ endTime, jdbcType=VARCHAR } ]]> </if>

Mybatis多表查询。

多表查询,分为一对一、一对多、多对多。

简单的Sql语句,一对一可以通过association标签实现,一对多和多对多通过collection标签实现。

详情见: https://www.cnblogs.com/expiator/p/9328338.html

复杂的Sql语句,可以直接设置返回的resultMap为Map,通过Map的键值对解析。

示例如下:

   <select id="queryOrderList" resultType="java.util.HashMap">
SELECT
t2.allnum,
t2.username
FROM t_order t1
LEFT JOIN t_order_detail t2 ON t2.orderid = t1.id
WHERE 1=1
<if test="beginTime!=null and beginTime!='' "> <![CDATA[ AND t1.fcreate_time >= #{ beginTime , jdbcType=VARCHAR } ]]> </if>
<if test="endTime!=null and endTime!='' "> <![CDATA[ AND t1.fcreate_time < #{ endTime, jdbcType=VARCHAR } ]]> </if>
<if test="productName!=null and productName!='' "> AND t1.productname LIKE CONCAT('%',#{ productName , jdbcType=VARCHAR },'%')</if>
</select>

对应的Dao层如下:

List<Map<String,Object>> queryOrderList( @Param("productName")String  productName ,
@Param("beginDate") String beginDate, @Param("endDate") String endDate );

返回类型为List<Map<String,Object>>,遍历List,获取Map中键对应的值即可。

Controller层如下所示:

       //....
//忽略其他无关逻辑
List<Map<String,Object>> orderList=orderService.queryOrderList( productName, beginDate , endDate);
if( orderList.size()>0 ) {
//取第一行的订货信息
Map<String, Object> orderMap=orderList.get(0);
//Object转换为Integer类型
Integer allNum = (Integer) orderMap.get("allnum") ;
//Object转换为String类型
String userName = String.valueOf( orderMap.get("username ") ) ;
}

Mybatis插入数据

对应sql语句:

insert into  表名 (字段1,字段2,字段3) values (字段1的值,字段2的值,字段3的值);

xml如下所示:

其中的useGeneratedKeys="true" keyProperty="id"表示主键自动产生。

而clientId 、clientSecret 、clientName 、eCheck 都是属于Developer类的属性。在Dao层传递对象过来后,可以使用该对象的属性。

<insert id="insert" parameterType="com.model.Developer" useGeneratedKeys="true" keyProperty="id">
insert into t_bd_developer
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="clientId != null">client_id,</if>
<if test="clientSecret != null">client_secret, </if>
<if test="clientName != null">client_name,</if>
<if test="eCheck != null">isCheck,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="clientId != null">#{clientId,jdbcType=VARCHAR},</if>
<if test="clientSecret != null">#{clientSecret,jdbcType=VARCHAR}, </if>
<if test="clientName != null">#{clientName,jdbcType=VARCHAR},</if>
<if test="eCheck != null">#{eCheck,jdbcType=INTEGER},</if>
</trim>
</insert>

Dao层则如下所示:

int insert(Developer developer);

Mybatis处理日期

当jdbcType="DATE"类型时,返回的时间只有年月日(yyyy-MM-dd)的,当jdbcType=“TIMESTAMP”的时候,返回的时间是年月日和时分秒(yyyy-MM-dd HH:mm:ss)

比如createDate为 2019-04-17,createTime为 2019-04-17 22:25:28,处理如下:

<resultMap  id="BaseResultMap"   type="com.model.Bill">
<result property="createDate" column="fcreate_date" javaType="Date" jdbcType="DATE"/>
<result property="createTime" column="fcreate_time" javaType="Date" jdbcType="TIMESTAMP" />
</resultMap>

参考资料:

https://www.cnblogs.com/expiator/p/9328338.html

https://blog.csdn.net/u011781521/article/details/79669180

https://www.cnblogs.com/cyttina/p/3894428.html

Mybatis常用代码的更多相关文章

  1. Mybatis常用xml

    工作中mybatis常用的xml代码 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ma ...

  2. MyBatis - 常用标签与动态Sql

    MyBatis常用标签 ● 定义sql语句:select.insert.delete.update ● 配置JAVA对象属性与查询结构及中列明对应的关系:resultMap ● 控制动态sql拼接:i ...

  3. GCD 常用代码

    GCD 常用代码 体验代码 异步执行任务 - (void)gcdDemo1 { // 1. 全局队列 dispatch_queue_t q = dispatch_get_global_queue(0, ...

  4. 转--Android实用的代码片段 常用代码总结

    这篇文章主要介绍了Android实用的代码片段 常用代码总结,需要的朋友可以参考下     1:查看是否有存储卡插入 复制代码 代码如下: String status=Environment.getE ...

  5. 刀哥多线程之03GCD 常用代码

    GCD 常用代码 体验代码 异步执行任务 - (void)gcdDemo1 { // 1. 全局队列 dispatch_queue_t q = dispatch_get_global_queue(0, ...

  6. jquery常用代码集锦

    1. 如何修改jquery默认编码(例如默认GB2312改成 UTF-8 ) 1 2 3 4 5 $.ajaxSetup({     ajaxSettings : {         contentT ...

  7. Mysql:常用代码

    C/S: Client Server B/S: Brower Server Php主要实现B/S .net IIS Jave TomCat LAMP:L Mysql:常用代码 Create table ...

  8. javascript常用代码大全

    http://caibaojian.com/288.html    原文链接 jquery选中radio //如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_ca ...

  9. Android 常用代码大集合 [转]

    [Android]调用字符串资源的几种方法   字符串资源的定义 文件路径:res/values/strings.xml 字符串资源定义示例: <?xml version="1.0&q ...

随机推荐

  1. 【json】与【枚举】的序列化和反序列化

    参考:Jackson – Deserialization from json to Java enums 问题描述 java中使用枚举时,如果涉及到restful调用,不可避免会涉及到枚举的序列化和反 ...

  2. 7.2.4 else与if配对

    规则是,如果没有花括号,else与离它最近的if匹配,除非最近的if被花括号括起来. 注意:要缩进"语句","语句"可以是一条简单语句或复合语句. 记住,编译器 ...

  3. dialog学习

    11.dialog底部弹出动画: ==== 11.dialog底部弹出动画: 点击Button调用代码 private void show() { Dialog dialog = new Dialog ...

  4. 为什么我说IPFS社区从卖矿机开始,就是错的

    要回答这个问题,首先要了解去中心化存储项目和传统的区块链项目有什么区别.其中去中心化存储项目包括IPFS,基于IPFS的FileCoin.PPIO.Storj等. 传统区块链项目没有供需问题 首先以比 ...

  5. 3阶马尔可夫链 自然语言处理python

    一.简介:       把每三个三个单词作为一个整体进行训练. 举一个例子: input:       my dream is that I can be an engineer, so I desi ...

  6. 算法——001BitMap(位图)算法

    哈希表在查找定位操作上具有O(1)的常量时间,常用于做性能优化,但是内存毕竟是有限的,当数据量太大时用哈希表就会内存溢出了.而考虑对这些大数据进行存盘分批处理又有IO上的开销,性能又不能满足要求.这个 ...

  7. LSTM编程所用函数

    1.Round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果.可是当保留位跟着的即使是5,有可能进位,也有可能舍去,机会各50% 2.python基础 (1)@property 特 ...

  8. python-web自动化-Js-滚动条操作

    滚动条操作:当待操作的元素在页面可是区域外时,要将待操作的元素滚动到可视区域当中 步骤:1.先找要将要操作的元素element = driver.find_element_by_xxxx(" ...

  9. Python爬虫的步骤和工具

    #四个步骤 1.查看crawl内容的源码格式          crawl的内容可以是 url(链接),文字,图片,视频 2.请求网页源码 (可能要设置)代理,限速,cookie 3.匹配 用正则表达 ...

  10. 删除链表的倒数第N个节点

    题目描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后 ...