深入理解SpringBoot中关于Mybatis使用的三个问题

 原本是要讲讲PostgreSQL的一些学习总结的,不巧的是最近一段时间的进度都是一些类似于加减乘除、位移、类型转换的稍显小儿科的一些内容,额~(ಠ .̫.̫ ಠ),这也不是什么问题,只是觉得这中间没什么终点和难点可讲的,也就暂时略过了~,这里首先说声抱歉啊,后续如有什么使用难点或有趣的地方一定拿出来讲讲♥◠‿◠)ノ;额,每次开篇总要讲一堆看似没啥用的内容,有啥用,有啥用,😯,想了许久,倒觉得有些用->就是一种习惯,总能记录最近一段的心情。心情这东西捉摸不定,其实对开发也至关重要,比如元素周期表的诞生哈。。。

  由于年初才开始使用SpringBoot,这里一般的问题均是SpringBoot框架下的问题,这次我讲三点,也是我实际开发中碰到的哦( ̄﹏ ̄) =>

    1>按主键查询时报dao类型不能转换

    2>连表查询时的mapper和dao方法

    3>插入数据返回主键的配置方法

  第一个问题:“按主键查询时报dao类型不能转换”。

  嗯~,可以看做是Mybatis的一个bug,目前只在tk版的mybatis中出现过,这里先晒出代码和报错信息(◑‿◐ ):

  @RequestMapping({"dao","dao2"})
  public ZwPayLog dao(HttpServletRequest request){
   ZwPayLog pl=zwPayLogMapper.selectByPrimaryKey(Long.valueOf(-1));
   LOG.info("TestPay->get=>"+ JSON.toJSONString(pl));
   return pl;
  }

代码其实就一行(以上红色着重部分),这里的“selectByPrimaryKey”方法是tk版Mybatis实现的,我只是借用;一开始使用Mybatis的时并没有报过这种错误,有点儿摸不到头脑,当时排查了好一会儿以为是自己的代码的有问题呢,后搜索在StackOverflow中有人简述了这个问题,大致的意思是tk版与SpringBoot1.5的兼容问题,个人觉得是tk版Mybatis与SpringBoot没整好的问题,且就当是一个bug吧,这里为造福广大入坑的盆友,贴出一个最简单的解决方式=>

先在项目(或模块)的resources目录下新建一个META-INF的文件夹,文件夹里面放入一个spring-devtools.properties的文件,for example:

然后这个配置文件里面添加这么一句:“restart.include.companycommonlibs=tk/mybatis.*”,只有一句,这里我就不截图了,好了,问题解决(。◕ˇ∀ˇ◕)。

  接下来,第二个问题总结:“连表查询时的mapper和dao方法”。

  这个问题本以为很简单的,事实却不是,一开始看老大或网上的样例是这样做的->在dao接口里面直接继承Mapper<entity>这样一个通用的Mapper就可以了,简洁到甚至不用在里面声明方法的,就像这样( ͡° ͜ʖ ͡°)✧:

 public interface ZwCisReportMapper extends Mapper<ZwCisReport> {
 }

但实际需求并不是一个单独的表增删改查,而是一个连表查询,可能是对TK版Mybatis见识少,一时晕头转向,疯狂在google中检索相关内容,未遂。。。,最后,我使用原生的方法来解决的。

在这里我演示下主要代码,首先在mapper的xml文件里面写对应的连表查询语句,比如这里有两个查询语句声明(getProject和getOrder)=>

(p2pEyeMapper.sql.xml)

 <?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="*.security.admin.mapper.P2pEyeDao">
  <select id="getProject" resultType="*.security.admin.po.p2pEye.P2PeyeProject" parameterType="java.util.Map">
  <!-- 这里具体SQL省略 -->
  </select>
  <select id="getOrder" resultType="*.security.admin.po.p2pEye.P2PeyeOrder" parameterType="java.util.Map">
   <!-- 这里具体SQL省略 -->
  </select>
 </mapper>

再在映射的dao中声明这两个sql查询的id名称即可,记得namespace也要对应哦,嗯,继续展示下 P2pEyeDao.java (dao)中的代码吧=>

 @Mapper
 public interface P2pEyeDao {
  //获取项目信息(标)
  List<P2PeyeProject> getProject(Map<String,Object> params);
  //获取投标信息
  List<P2PeyeOrder> getOrder(Map<String,Object> params);
 }

额,这里需要注意三点:

  1>比如在getProject方法中放置>1个参数的时候建议使用Map来传参,嗯,如果可以的话可以写一个po来封装参数,这样最好,如果想简单点儿,比如这样getProject(param,param2)的话很容易报参数找不到(params is not fund)错误

  2>如果通过封装的参数体来传参的话,需要在对应的select(xml中)的标签中声明“parameterType”这个参数值

  3>resultType这个返回值必填,且需要和dao中声明的方法一致才可

至于怎么用,这里不再赘述了吧,读者懂得( ื▿ ื)。

  讲讲第三个问题:“插入数据返回主键的配置方法”。

  这个问题本不是问题,在这里我只是提供一个tk版的简洁解决方法。先说说网民们给的一般解决思路是什么吧,在原生mybatis中大概是这样子的:

<insert id="insertProduct" parameterType="domain.model.ProductBean" >
  <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId">
   SELECT LAST_INSERT_ID()
  </selectKey>
  INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});
 </insert>

dao中是这样子的:

 @Mapper
 public interface XXDao{
  Integer insertProduct(ProductBean pb);
 }

嗯,我想这里唯一需要注意的一点儿是调用“insertProduct”这个方法之后返回的Integer不是主键,不是主键,不是主键!!!,二是在执行这个插入后的“ProductBean”类型的pb对象中,就是调用插入后已经自动写入了主键。

以上是一般解决办法,如果用我大TK的方式(这里说的是只在单表Mapper下),可就简单多了。

由于tk用的是通用mapper来实现dao与xml对应的,xml里面只用声明对应的实体与表的映射参数就可以了,具体的sql实现是不用写的(这里需要通用Mapper的泛型),这时候dao就如下这么简单:

 public interface ZwCisReportMapper extends Mapper<ZwCisReport> {
 }

但是实际使用的时候自动生成id的那个字段一定要这样声明->

 /**
  * 主键ID
  */
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)//设置为主键自增以回写主键
  private Long id;

额,其实重点就是一个“@GeneratedValue”注解●ω●,这个是框架提供的方式,需要一看究竟的请自行搜索,至于生成的主键也是在调用后再传入的实体里面。

(0)

相关推荐

  • 深入理解SpringBoot中关于Mybatis使用的三个问题

    原本是要讲讲PostgreSQL的一些学习总结的,不巧的是最近一段时间的进度都是一些类似于加减乘除.位移.类型转换的稍显小儿科的一些内容,额~(ಠ .̫.̫ ಠ),这也不是什么问题,只是觉得这中间没什么终点和难点可讲的,也就暂时略过了~,这里首先说声抱歉啊,后续如有什么使用难点或有趣的地方一定拿出来讲讲♥◠‿◠)ノ:额,每次开篇总要讲一堆看似没啥用的内容,有啥用,有啥用,

  • 深入理解SpringBoot中关于Mybatis使用方法

    这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关于spring boot和mybatis组合的相关资料,各种各样的形式都有,看的人心累,结合了mybatis的官方demo和文档终于找到了最简的两种模式,花了一天时间总结后分享出来. orm框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句SQL的hibernate,一个是可以灵活

  • 深入理解springboot中配置文件application.properties

    目录 前言 正文 自定义属性 参数间引用 使用自定义配置文件 随机值配置 外部配置-命令行参数配置 配置文件的优先级 Profile-多环境配置 总结 前言 Spring Boot使用"习惯优于配置"(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来.所以,我们要想把Spring Boot玩的溜,就要懂得如何开启各个功能模块的默认配置,这就需要了解Spring Boot的配置文件application.properties. 正文

  • SpringBoot中的Mybatis依赖问题

    Pom导入依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> application.yml #配置数据源,yml格式 spring: datasource: ur

  • springboot 中整合mybatis多数据源不使用JPA

    目录 前言: 1 创建一个springboot项目 项目创建成功了,那么开始说下整合mybatis 上面的配置可以直接使用 如果上面的配置都完成的话那么我们来自动生成一下 在下图两个数据源完全生成好后的目录结构 前言: 小伙伴说能不能用springboot整合一下mybatis多数据源不使用JPA进行数据库连接操作.那么说干就干 1 创建一个springboot项目 流程就不介绍了,按图操作即可 创建项目后可能会发现,这个项目展示的有些不对劲啊,java类前面还有个小J号,这是由于maven包还

  • 详解在springboot中使用Mybatis Generator的两种方式

    介绍 Mybatis Generator(MBG)是Mybatis的一个代码生成工具.MBG解决了对数据库操作有最大影响的一些CRUD操作,很大程度上提升开发效率.如果需要联合查询仍然需要手写sql.相信很多人都听说过微服务,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.在一个微服务的开发过程中很可能只关注对单表的操作.所以MBG在开发过程中可以快速的生成代码提升开发效率. 本文将说到在springboot的项目中如何去配置(XML形式和Java配置类形式)和使用M

  • SpringBoot中利用MyBatis进行数据操作的示例

    本例所用环境: SpringBoot MySQL MyBatis jdk1.8 Maven 首先我们先创建一个SpringBoot 项目. 数据库连接配置 ##数据库连接配置(部署到哪台,对应的ip需修改) spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis?connectTimeout=1000&useSSL=false&useUnicode=true&characterEncoding=UTF-8 spring.d

  • 在springboot中如何给mybatis加拦截器

    目录 1.实现Interceptor接口,并添加拦截注解 @Intercepts 1.在mybatis中可被拦截的类型有四种(按照拦截顺序) 2.各个参数的含义 2.在配置文件中添加拦截器 (1)第一种 (2)第二种 (3)第三种 拦截器的作用就是我们可以拦截某些方法的调用,在目标方法前后加上我们自己逻辑 Mybatis拦截器设计的一个初衷是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑. mybatis 自定义拦截器 1.实现Interceptor 接口,并添加拦截注

  • mybatis逆向工程与分页在springboot中的应用及遇到坑

    最近在项目中应用到springboot与mybatis,在进行整合过程中遇到一些坑,在此将其整理出来,便于以后查阅与复习. 项目运行环境为:eclispe+jdk1.8+maven 搭建Spring Boot环境 首先建立maven project,在生成的pom文件中加入依赖,代码如下: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • springboot中mybatis多数据源动态切换实现

    目录 多数据源配置引入 动态数据源路由实现 动态数据源切换使用 案例源码 在开发中,动态数据源配置还是用的比较多的,比如在多数据源使用方面,又或者是在多个DB之间切换方面.这里给出一个动态数据源的配置方案,两个DB均以mysql为例. 多数据源配置引入 mybatis和mysql在springboot中的引入这里就不在说了,不了解的可以参见springboot中mysql与mybatis的引入. 数据源配置如下: datasource: master: type: com.alibaba.dru

随机推荐