SpringBoot中关于Mybatis使用的三个问题

SpringBoot中关于Mybatis使用的三个问题

转载请注明源地址http://www.cnblogs.com/funnyzpc/p/8495453.html

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

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

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

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

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

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

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

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

代码其实就一行(以上红色着重部分),这里的“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就可以了,简洁到甚至不用在里面声明方法的,就像这样( ?° ?? ?°)?:

1 public interface ZwCisReportMapper extends Mapper<ZwCisReport> {
2 }

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

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

(p2pEyeMapper.sql.xml)

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="*.security.admin.mapper.P2pEyeDao">
 4     <select id="getProject" resultType="*.security.admin.po.p2pEye.P2PeyeProject" parameterType="java.util.Map">
 5     <!-- 这里具体SQL省略 -->
 6     </select>
 7     <select id="getOrder" resultType="*.security.admin.po.p2pEye.P2PeyeOrder" parameterType="java.util.Map">
 8         <!-- 这里具体SQL省略 -->
 9     </select>
10 </mapper>

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

1 @Mapper
2 public interface P2pEyeDao {
3     //获取项目信息(标)
4     List<P2PeyeProject> getProject(Map<String,Object> params);
5
6     //获取投标信息
7     List<P2PeyeOrder> getOrder(Map<String,Object> params);
8 }

额,这里需要注意三点:

  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中是这样子的:

1 @Mapper
2 public interface XXDao{
3     Integer insertProduct(ProductBean pb);
4 }

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

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

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

1 public interface ZwCisReportMapper extends Mapper<ZwCisReport> {
2 }

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

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

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

  OK,本章完结!

现在是:2018-03-03 20:19:54 各位晚上好

原文地址:https://www.cnblogs.com/funnyzpc/p/8495453.html

时间: 2024-09-30 15:37:29

SpringBoot中关于Mybatis使用的三个问题的相关文章

【Springboot】springboot中使用mybatis操作数据库

新建springboot项目的时候,选择好web,mybatis,JDBC 在application.properties或者application.yml中配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/studentManagerBoot?useUnicode=true&characterEncoding=utf-8&useSSL=tr

springboot中处理mybatis返回Map时key值的大小写

为了统一不同数据库返回key值大小写不一致的问题,特自定义ObjectWrapperFactory来做统一的处理 1,首先自定义MapWrapper /** * 将Map的key全部转换为小写 * */ public class MapKeyLowerWrapper extends MapWrapper { public MapKeyLowerWrapper(MetaObject metaObject, Map<String, Object> map) { super(metaObject,

Java实战之路(1):SpringBoot项目中使用Mybatis打印Sql语句

SpringBoot项目中使用Mybatis打印Sql语句 如题,实际项目中使用很多都会用到SpringBoot+Mybatis的经典搭配进行开发,数据库里明明有数据,可是程序运行就是查不到,此时我们在本地Debug时,需要将Mybatis的实际Sql打印出来,看看Sql与我们期望的是否一致,或者将Sql拿到数据库中直接执行,看看结果.这里简单介绍几种实战中的用法. 方法一 properties:在application.properties配置文件中增加如下配置 logging.level.c

MyBatis学习总结(三)——优化MyBatis配置文件中的配置(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(三)--优化MyBatis配置文件中的配置 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org

【转】MyBatis学习总结(三)——优化MyBatis配置文件中的配置

[转]MyBatis学习总结(三)——优化MyBatis配置文件中的配置 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//E

SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml配置文件.我现在使用的是spring boot ,没有了xml文件配置就方便多了.我同样尝试了两种方式,也都是简单的查询,需要更复杂的查询,还需要我研究研究.往下看,需要先配置springboot的开发环境,需要大致了解springboot,这里可以看下面两篇文章: springboot 项目新建 springboot

MyBatis学习 之 三、动态SQL语句

有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的s

spring和mybatis整合(三)

一.方法: 1.导入jar包 2.配置数据信息 1)Spring加Mybatis的第一种整合方法 <!-- 描述数据源信息 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/

springboot中的常用注解

springboot中的常用注解个人觉得springboor中常用的注解主要可以分为三种:放入容器型注解.从容器中取出型注解和功能型注解.其中的放入容器型和从容器中取出型就是我们平时所说的控制反转和依赖注入的概念(个人版本- - - 可以看一看,别太当真 0.0) 放入容器型注解简介:个人觉得就是申明一个实例对象,然后将这个对象交给spring管理. 1.@Component:放在类上,把普通类实例化到spring容器中.可以说很多注解都是基于这个注解的. 2.@Bean: 放在方法上,用@Be