SpringBoot Mybatis问题收集
1.在SpringBoot中打印mybatis中执行的sql
其实在application.properties 文件下,添加一下配置即可:
logging.level.org.springframework=WARN
logging.level.org.spring.springboot.dao=DEBUG
logging.file=logs/spring-boot-logging.log
注意:其中logging.level.com.你的Mapper包=日志等级
logging.level.com.shitou.huishi.domain.dataaccess=debug
2.在mybatis中返回count这个方法的结果
<select id="selectListByType" parameterType="com.shitou.huishi.domain.entity.BusinessMarketAffiliate" resultType="java.lang.Integer">
select count() as num from tb_business_market_affiliate
where busi_id=#{busiId,jdbcType=INTEGER}
and data_key=#{dataKey,jdbcType=INTEGER}
and data_type=#{dataType,jdbcType=VARCHAR}
</select>
将resultMap="java.lang.Integer" 改成 resultType="java.lang.Integer"
3.在Mybatis中单个参数使用test判断
<select id="selectByPcode" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from tb_area_divisions
where
<choose>
<when test="_parameter > 0">
pcode = #{pcode,jdbcType=INTEGER}
</when>
<otherwise>
level=
</otherwise>
</choose> </select>
注意语句中_parameter,使用pcode时会报错
程序异常,nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'pcode' in 'class java.lang.Integer'
但是单个参数和多参数的判断有个不同点,当我们的入参为entity实体,或者map的时候,使用if 参数判断没任何问题。
但是当我们的入参为java.lang.Integer 或者 java.lang.String的时候,这时候就需要注意一些事情了
首先入参是java.lang.Integer, 而不是map或者实体的入参方式,对于这类单个入参然后用if判断的,mybatis有自己的内置对象
4.MyBatis报错 Parameter '0' not found. Available parameters are [arg1, arg0, param1, param2]
这个问题跟mybatis的版本有关
比如在mybatis3.4.0时 (mybatis-spring-boot-starter 1.1.1),#{0},#{1}都是可以使用的
但是在mybatis3.4.6时(mybatis-spring-boot-starter 1.3.2),使用#{0},#{1}就不可以,就会报上述错误
根据网上的描述,在mybatis3.4.4版本为边界,从MyBatis3.4.4版后不能直接使用 #{0} 要使用 #{arg0} ;
5.parametertype 多个参数
不写parameterType参数,但是不能改变参数顺序,也不能重复使用参数
public List<XXXBean> getXXXBeanList(String xxId, String xxCode); <select id="getXXXBeanList" resultType="XXBean">不需要写parameterType参数 select t.* from tableName where id = #{} and name = #{} </select>
2.基于注解,这个比较推荐
public List<XXXBean> getXXXBeanList(@Param("id")String id, @Param("code")String code); <select id="getXXXBeanList" resultType="XXBean"> select t.* from tableName where id = #{id} and name = #{code} </select>
https://blog.csdn.net/lixld/article/details/77980443
6.模糊查询使用
subject_name like '%${subjectName}%'
或者
subject_name like CONCAT('%',#{subjectName,jdbcType=VARCHAR},'%')
https://blog.csdn.net/u010398771/article/details/70768280
7.Mybatis语句中使用到大于小于
mybatis查询的时候,需要用到运算符 小于号:< 和 大于号: >,在mybatis配置文件里面,这种会被认为是标签,所以解析错误
解决方法:
<if test="null!=beginTime and ''!=beginTime">
<![CDATA[
and create_time>=#{beginTime,jdbcType=VARCHAR}
]]>
</if>
<if test="null!=endTime and ''!=endTime">
<![CDATA[
and create_time<=#{endTime,jdbcType=VARCHAR}
]]>
</if>
用 <![CDATA[ ]]> 把sql语句包裹起来,注意不要 包裹<if这样的,必须只能包裹sql语句。
8.Mybatis中使用in进行条件查询
下面这种情况是将names作为map的其中一个参数进行传递的
List<String> userNameList=new ArrayList<String>();
Map<String,Object> map= ReflectUtil.beanToMap(request);
map.put("userNames",userNameList);
<if test="null!=userNames and userNames.size>0 ">
and create_name in
<foreach collection="userNames" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
必须对列表进行筛选,size必须大于0,不然直接就是create_name in,foreach条件查询为空,sql语句会报错!
也可以自己手动拼接,然后使用${userNames}
如果参数类型为list,则在使用的时候,collection属性必须指定为list
查询方法:
List<FolderImgInfo> selectListByImageIds(List<Integer> ids);
Mybatis部分为:
where =
<if test="null!=list and list.size>0 ">
and id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
9.使用Map进行参数传递:
code:
List<LoanOrder> getLoanOrderListForJDGL(Map<String,Object> map);
xml:
<select id="getLoanOrderListForJDGL" parameterType="java.util.Map" resultMap="BaseResultMap"> select * from (
select loan_order_id,loan_type,
case loan_type
when then (select subject_no from hs_archive_info where archive_id=main_subject_archive_id)
when then (select subject_no from hs_archive_info where archive_id=borrower_archive_id)
end subject_no,
case loan_type
when then main_subject
when then borrower_name
end subject_name,
org_source,
create_time,create_user_id, create_user_dept,create_name
from hs_loan_order
where loan_status=
order by create_time desc
) tb
<where>
=
<if test="null!=productId">
and loan_type=#{productId,jdbcType=BIGINT}
</if>
<if test="null!=loanOrderId and ''!=loanOrderId">
and loan_order_id=#{loanOrderId,jdbcType=VARCHAR}
</if>
<if test="null!=subjectName and ''!=subjectName">
and subject_name=#{subjectName,jdbcType=VARCHAR}
</if>
<if test="null!=subjectNo and ''!=subjectNo">
and subject_no=#{subjectNo,jdbcType=VARCHAR}
</if>
<if test="null!=createUserId and createUserId>0">
and create_user_id=#{createUserId,jdbcType=BIGINT}
</if>
<if test="null!=departName and ''!=departName">
and create_user_dept=#{departName,jdbcType=VARCHAR}
</if>
<if test="null!=beginTime and ''!=beginTime">
<![CDATA[
and create_time>=#{beginTime,jdbcType=VARCHAR}
]]>
</if>
<if test="null!=endTime and ''!=endTime">
<![CDATA[
and create_time<=#{endTime,jdbcType=VARCHAR}
]]>
</if>
<if test="null!=userNames and userNames.size>0 ">
and create_name in
<foreach collection="userNames" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if> </where>
</select>
10.字符串数组入参,字符串数组出参:
<select id="selectCountByOrderList" parameterType="java.util.List" resultType="java.lang.String">
select order_id from hs_app_push
<if test="null!=list and list.size>0 ">
where order_id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</select>
方法:
List<String> selectCountByOrderList(List<String> list);
11.批量插入
<insert id="insertBatchRecord" parameterType="java.util.List">
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
<selectKey keyProperty="detailId" order="AFTER" resultType="java.lang.Long">
SELECT LAST_INSERT_ID()
</selectKey>
insert into hs_excel_account_detail (batch_id, account_id, transaction_date,
transaction_time, borrow_amount, loan_amount,
currency, balance, opposite_account,
opposite_name, digest, remark1,
remark2, create_time, create_name
)
values
<foreach collection ="list" item="item" index= "index" separator =",">
(#{item.batchId,jdbcType=BIGINT}, #{item.accountId,jdbcType=BIGINT}, #{item.transactionDate,jdbcType=VARCHAR},
#{item.transactionTime,jdbcType=VARCHAR}, #{item.borrowAmount,jdbcType=DECIMAL}, #{item.loanAmount,jdbcType=DECIMAL},
#{item.currency,jdbcType=VARCHAR}, #{item.balance,jdbcType=DECIMAL}, #{item.oppositeAccount,jdbcType=VARCHAR},
#{item.oppositeName,jdbcType=VARCHAR}, #{item.digest,jdbcType=VARCHAR}, #{item.remark1,jdbcType=VARCHAR},
#{item.remark2,jdbcType=VARCHAR}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.createName,jdbcType=VARCHAR}
)
</foreach>
</insert>
方法:
void insertBatchRecord(List<ExcelAccountDetail> list);
模板:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shitou.huishi.domain.dataaccess.BusinessMarketAffiliateMapper">
<resultMap id="BaseResultMap" type="com.shitou.huishi.domain.entity.BusinessMarketAffiliate">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="busi_id" jdbcType="INTEGER" property="busiId" />
<result column="data_type" jdbcType="VARCHAR" property="dataType" />
<result column="data_key" jdbcType="INTEGER" property="dataKey" />
<result column="data_value" jdbcType="INTEGER" property="dataValue" />
<result column="create_name" jdbcType="INTEGER" property="createName" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_name" jdbcType="INTEGER" property="updateName" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap> <sql id="Base_Column_List">
id, busi_id, data_type, data_key, data_value, create_name, create_time, update_name,
update_time
</sql> <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from tb_business_market_affiliate
where id = #{id,jdbcType=INTEGER}
</select> <select id="selectListByLifeLoan" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from tb_business_market_affiliate
where data_type='life_of_loan' and busi_id=#{busiId,jdbcType=INTEGER}
</select> <select id="selectListByType" parameterType="com.shitou.huishi.domain.entity.BusinessMarketAffiliate" resultType="java.lang.Integer"> select count() as num from tb_business_market_affiliate
where busi_id=#{busiId,jdbcType=INTEGER}
and data_key=#{dataKey,jdbcType=INTEGER}
and data_type=#{dataType,jdbcType=VARCHAR}
</select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
delete
from tb_business_market_affiliate
where id = #{id,jdbcType=INTEGER}
</delete> <insert id="insert" parameterType="com.shitou.huishi.domain.entity.BusinessMarketAffiliate">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into tb_business_market_affiliate (busi_id, data_type, data_key,
data_value, create_name, create_time,
update_name, update_time)
values (#{busiId,jdbcType=INTEGER}, #{dataType,jdbcType=VARCHAR}, #{dataKey,jdbcType=INTEGER},
#{dataValue,jdbcType=INTEGER}, #{createName,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP},
#{updateName,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP})
</insert> <insert id="insertSelective" parameterType="com.shitou.huishi.domain.entity.BusinessMarketAffiliate">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into tb_business_market_affiliate
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="busiId != null">
busi_id,
</if>
<if test="dataType != null">
data_type,
</if>
<if test="dataKey != null">
data_key,
</if>
<if test="dataValue != null">
data_value,
</if>
<if test="createName != null">
create_name,
</if>
<if test="createTime != null">
create_time,
</if>
<if test="updateName != null">
update_name,
</if>
<if test="updateTime != null">
update_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="busiId != null">
#{busiId,jdbcType=INTEGER},
</if>
<if test="dataType != null">
#{dataType,jdbcType=VARCHAR},
</if>
<if test="dataKey != null">
#{dataKey,jdbcType=INTEGER},
</if>
<if test="dataValue != null">
#{dataValue,jdbcType=INTEGER},
</if>
<if test="createName != null">
#{createName,jdbcType=INTEGER},
</if>
<if test="createTime != null">
#{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateName != null">
#{updateName,jdbcType=INTEGER},
</if>
<if test="updateTime != null">
#{updateTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert> <update id="updateByPrimaryKeySelective" parameterType="com.shitou.huishi.domain.entity.BusinessMarketAffiliate">
update tb_business_market_affiliate
<set>
<if test="busiId != null">
busi_id = #{busiId,jdbcType=INTEGER},
</if>
<if test="dataType != null">
data_type = #{dataType,jdbcType=VARCHAR},
</if>
<if test="dataKey != null">
data_key = #{dataKey,jdbcType=INTEGER},
</if>
<if test="dataValue != null">
data_value = #{dataValue,jdbcType=INTEGER},
</if>
<if test="createName != null">
create_name = #{createName,jdbcType=INTEGER},
</if>
<if test="createTime != null">
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateName != null">
update_name = #{updateName,jdbcType=INTEGER},
</if>
<if test="updateTime != null">
update_time = #{updateTime,jdbcType=TIMESTAMP},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update> <update id="updateByPrimaryKey" parameterType="com.shitou.huishi.domain.entity.BusinessMarketAffiliate">
update tb_business_market_affiliate
set busi_id = #{busiId,jdbcType=INTEGER},
data_type = #{dataType,jdbcType=VARCHAR},
data_key = #{dataKey,jdbcType=INTEGER},
data_value = #{dataValue,jdbcType=INTEGER},
create_name = #{createName,jdbcType=INTEGER},
create_time = #{createTime,jdbcType=TIMESTAMP},
update_name = #{updateName,jdbcType=INTEGER},
update_time = #{updateTime,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=INTEGER}
</update>
</mapper>
https://blog.csdn.net/u010448530/article/details/52023256
https://www.2cto.com/database/201505/401604.html
https://blog.csdn.net/qq_35261296/article/details/73559247
https://blog.csdn.net/crystalssj/article/details/76549024
https://www.kunzhao.org/blog/2017/07/23/mybatis/
SpringBoot Mybatis问题收集的更多相关文章
- 基于SpringBoot+MyBatis实现一套电商系统
项目介绍 mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现. 前台商城系统包含首页门户.商品推荐.商品搜索.商品展示.购物车.订单流程.会员中心 ...
- 从 0 使用 SpringBoot MyBatis MySQL Redis Elasticsearch打造企业级 RESTful API 项目实战
大家好!这是一门付费视频课程.新课优惠价 699 元,折合每小时 9 元左右,需要朋友的联系爱学啊客服 QQ:3469271680:我们每课程是明码标价的,因为如果售价为现在的 2 倍,然后打 5 折 ...
- Thymeleaf+SpringBoot+Mybatis实现的家庭财务管理系统
项目简介 项目来源于:https://gitee.com/darlingzhangsh/graduation_project 本系统是基于Thymeleaf+SpringBoot+Mybatis.是非 ...
- Thymeleaf+SpringBoot+Mybatis实现的齐贤易游网旅游信息管理系统
项目简介 项目来源于:https://github.com/liuyongfei-1998/root 本系统是基于Thymeleaf+SpringBoot+Mybatis.是非常标准的SSM三大框架( ...
- 第五章 springboot + mybatis(转载)
本编博客转发自:http://www.cnblogs.com/java-zhao/p/5350021.html springboot集成了springJDBC与JPA,但是没有集成mybatis,所以 ...
- 第九章 springboot + mybatis + 多数据源 (AOP实现)
在第八章 springboot + mybatis + 多数据源代码的基础上,做两点修改 1.ShopDao package com.xxx.firstboot.dao; import org.spr ...
- 第五章 springboot + mybatis
springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成.集成方式相当简单. 1.项目结构 2.pom.xml <!-- 与数 ...
- 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建
基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建 前言 最近做回后台开发,重新抓起以前学过的SSM(Spring+Sp ...
- Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦
个人博客 对于技术人员来说,拥有自己的个人博客应该是一件令人向往的事情,可以记录和分享自己的观点,想到这件事就觉得有意思,但是刚开始写博客的时候脑海中是没有搭建个人博客这一想法的,因为刚起步的时候连我 ...
随机推荐
- Java基础(basis)-----抽象类和接口详解
1.抽象类 1.1 abstract修饰类:抽象类 不可被实例化 抽象类有构造器 (凡是类都有构造器) 抽象方法所在的类,一定是抽象类 抽象类中可以没有抽象方法 1.2 abstract修饰方法:抽象 ...
- 关于poi导出excel方式HSSFWorkbook(xls).XSSFWorkbook(xlsx).SXSSFWorkbook.csv的总结
1.HSSFWorkbook(xls) import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermo ...
- 【Redis学习之七】Redis持久化
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 什么是持久化? 将数据从掉电易失的 ...
- SQLServer 创建自己的数据库
1)进入数据库服务器,创建自己的数据库 use master go create database Dt_Devtest on primary(name=[Dt_new_data],filename= ...
- grouping sets 的使用
grouping sets 可以用于在计算分组聚合函数值的同时计算合计值 -- 查询结果group_id为NULL的那一行即为合计值 select group_id , count(distinct ...
- Chrome插件消息传递实例
首先吐槽"360极速浏览器应用开发平台"的开发文档,在消息传递(http://open.chrome.360.cn/extension_dev/messaging.html)一节中 ...
- C#——WebApi 接口参数传参详解
本篇打算通过get.post.put.delete四种请求方式分别谈谈基础类型(包括int/string/datetime等).实体.数组等类型的参数如何传递. 一.get请求 对于取数据,我们使用最 ...
- git push跳过用户名和密码认证配置教程
在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,git 仓库的基本结构. 新 ...
- Spring MVC 编程流程步骤
Spring MVC 编程流程步骤 1. 建立Maven工程 2. 添加Spring MVC依赖 <dependencies> <dependency> <groupId ...
- python-selenium,关于页面滑动的操作
//移动到元素element对象的“顶端”与当前窗口的“顶部”对齐 ((JavascriptExecutor) driver).executeScript("arguments[0].scr ...