Mybatis学习笔记_基础_动态sql语句_statis 代码块 mybatis_Nickyo_02的博客-程序员宅基地

技术标签: mybatis  

最近做的新项目使用的是springboot+mybatis框架的,因为之前都是用的springboot+jpa,mybatis许久未用,因此上手有点生疏,这里做一下总结。

一、项目依赖准备

二、application.yml

三、启动类

四、Mapping.xml

一、项目依赖准备

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>
<!--添加JDBC依赖-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-->hana库<-->
<dependency>
  <groupId>com.sap.cloud.db.jdbc</groupId>
  <artifactId>ngdbc</artifactId>
  <version>2.4.64</version>
</dependency>
<!--    oracle连接-->
<dependency>
  <groupId>com.oracle</groupId>
  <artifactId>ojdbc6</artifactId>
  <version>11.2.0.4</version>
</dependency>

这些是项目搭建要用到的一些依赖,springboot项目基础配置了,这里注意一个数据库连接用的是springboot的jdbc而不是alibaba的druid,之后如果用PageHelper插件话会有用到!

二、application.yml

spring:
  # 用户配置开发(dev)
  profiles:
#    active: prod
#   active:dev
    active: test
  http:
    encoding:
      charset: utf-8
      enabled: true
      force: true

然后在application-test.yml的配置为:

server:
  ###本地测试用
  #注意:后面必须有空格
  tomcat:
    uri-encoding: UTF-8
  #项目名/端口
  servlet:
    context-path: /demo
  port: 8085

spring:
  application:
    name: demo
  datasource:
# mysql配置
#    driver-class-name: com.mysql.jdbc.Driver
#    url:  jdbc:mysql://127.0.0.0:3306/dm?useUnicode=true&characterEncoding=UTF8&useSSL=false
#    username: root
#    password: root
    dbcp2:
      max-idle: 300
      max-wait-millis: 50000
      min-idle: 6
      initial-size: 10
#这里配置连接的数据库类型,还可以做成根据不同database-id从而达到实现多数据库动态切换的配置
    type: oracle.jdbc.pool.OracleDataSource
#oracle 数据库的配置
    driver-class-name: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@127.0.0.0:1521:orcl
    username: root
    password: ****


#mybatis扫描mapping文件路径的配置
mybatis:
  mapper-locations: classpath:mapping/*.xml
  type-aliases-package: com.demo.common.entity
  configuration:
    call-setters-on-nulls: true

 三、启动类

在SpringbootApplication里的配置为:

/**
 * demo 服务启动类
 */
@SpringBootApplication
@MapperScan(basePackages ={"com.demo.common.mapper"})
@RestController
public class DemoServiceApplication {

    public static void main(String[] args) {

        ConfigurableApplicationContext ctx = SpringApplication.run(DemoServiceApplication.class, args);

        String project = ctx.getEnvironment().getProperty("server.servlet.context-path");

        String port = ctx.getEnvironment().getProperty("server.port");

        System.out.println("服务启动完成! http://localhost:" + port + project);
    }

    //application文件配置格式转换
    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {

        PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();

        c.setIgnoreUnresolvablePlaceholders(true);

        return c;

    }
}

其中, @MapperScan这个注解就是扫描mybatis的mapping.xml文件。

四、Mapping映射

这里是dao层实现,首先创建mapper类

public interface ProcessTotalMapper {
    List<Map<String,Object>> getProcessTotalByMonth(Map<String,Object> map)throws DimpException;

    List<Map<String, BigDecimal>> getLimitScoreByMonth(Map<String,Object> map)throws DimpException;

    List<Map<String,Object>> getTooltipData(Map<String,Object> map)throws DimpException;

    List<Map<String ,Object>> findByPaging(Map<String,Object> param)throws DimpException;
}

然后创建mapping.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="com.dimp.demo.common.mapper.ProcessTotalMapper" >
    <select id="getProcessTotalByMonth" resultType="map" parameterType="map">
        select *
        from l2_qm3_whole_process_total T1
        where T1.STATIS_MONTH &lt;= #{STATIS_MONTH} and T1.STATIS_MONTH &gt;= #{END_MONTH} and T1.COL = '综合'  and T1.RP_ID =  #{RP_ID}
        order by T1.STATIS_MONTH asc
    </select>

    <select id="getLimitScoreByMonth" resultType="map" parameterType="map" statementType="STATEMENT">
        select distinct ${statement}
        from l2_qm3_whole_process_total wpt
        where wpt.STATIS_MONTH = ${STATIS_MONTH} and wpt.COL= '综合' and wpt.RP_ID = ${RP_ID}
    </select>
   
</mapper>

namespace就是mapper.java所在的项目路径,select元素中的id就是mapper中对应的方法名,parameterType是 参数类型,resultType是返回结果类型,可以是基本数据类型,也可以是自定义的实体类型,自定义实体类型方式如下:

<resultMap id="scores" type="com.dimp.demo.common.entity.ProcessScore">
        <result column="STATIS_MONTH" property="statisMonth"/>
        <result column="RP_ID" property="rpId"/>
        <result column="RP_NAME" property="rpName"/>
        <result column="SCORE" property="score"/>
    </resultMap>
    
    <select id="getProcessTotalScoreByRpId" parameterType="map" resultMap="scores">
        select *
        from "L2_QM3_WHOLE_PROCESS_SCORE" s
        where s.STATIS_MONTH &lt; #{STATIS_MONTH}
          and s.STATIS_MONTH &gt; #{END_MONTH}
          and s.RP_ID = #{RP_ID}
    </select>

用resultMap元素实现查询结果和实体类列名对应,type就是要返回的实体类,column是数据库中的列名,property是实体类的字段名,在方法中使用时,返回结果要用resultMap属性,属性值就是resultMap的id。

 

五、动态sql的实现

在项目需求中,遇到数据库中数据列不确定的问题,但是查询的时候如果使用select * 进行全字段查询又很不效率,所以后端通过外部配置xml文件实现动态列名的查询,那么在mybatis里要动态查询,则要通过参数形式为STATEMENT实现:

 <select id="getTooltipData" resultType="map" parameterType="map" statementType="STATEMENT">
        select ${statement} from l2_qm3_whole_process_total wpt
        where
            wpt.RP_ID= ${RP_ID} and wpt.COL !='综合' and wpt.STATIS_MONTH = ${STATIS_MONTH}
        order by
            wpt.STATIS_MONTH ${orderby}
    </select>
    <select id="findByPaging" resultType="map" statementType="STATEMENT" parameterType="map">
        select ${cols }
        from ${tableName }
        where ${wherestr }
    </select>

需要注意的是,使用statementType的话,mybatis里的sql语句为 '非预编译';

1.使用    statementType="STATEMENT",需要把 #{}改成 ${};

2.传入的参数注意在java中拼接的时候加上 "'" 引号;

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42124034/article/details/121427486

智能推荐

FTP文件传输神器:8uftp_8uftp服务端 设置容量_东西方集大成者的博客-程序员宅基地

8uftp软件简介非常精辟的ftp客户端。目前体积最小的FTP客户端工具。8uftp终身免费中文版,非汉化版,非破解版。涵盖其它FTP工具功能独家支持多线程上传,使上传速度更快更稳定。同时支持直接上传压缩包,可在空间上直接解压。也可以在空间上压缩后直接下载压缩包。8UFTP工具包括客户端工具,和智能扩展服务端工具。支持多线程上传文件,支持断点续传。支持在线解压缩。配合8UFTP服务端使用,有效防止FTP被人暴力破解。防CC攻击。8UFtp的功能可以说完全不逊于市面上常见的FTP软件。【8UFtp软件特_8uftp服务端 设置容量

CCIE理论课程笔记---IGP部分_weixin_34301132的博客-程序员宅基地

这份笔记整理的是在IE理论课上的基本内容的提纲,或多或少对刚刚开始进入CCIE考试准备的准CCIE们起到一些知识构架的作用,欢迎您的批评和指正!附件如下 : 转载于:https://blog.51cto.com/reboot/134602...

邮箱怎么注册申请?怎么注册个好用的呢_kk_123JY的博客-程序员宅基地

在使用邮箱过程中,时长会有很多小问题被忽视,比如容量不够的困扰,一番清理后才能有新的邮箱进来,或者想找一封重要邮件迟迟未收到等。申请一个真正好用的邮箱真的能节省大量的时间成本PC端注册第一步:百度搜索163.net邮箱或直接网址输入 163.net 进入第二步:进入网站,右侧点击立即注册第三步:选择套餐,填写注册信息。163.net邮箱可选择3-5位的靓号注册,可用字母、数字、减号、点...

pvanet训练自己的数据过程记录_Bankeey的博客-程序员宅基地

报错这个问题:KeyError: 'max_overlaps'解决方法:删除py-faster-rcnn/data/VOCdevkit2007/annotations_cache annotations_cache 这个文件夹删除 py-faster-rcnn/data/cache cache 这个文件夹 测试时报错:Cannot copy param...

rxjava2/rxjava3+AutoDispose的使用优雅解决RxJava内存泄漏_android rxjava3 rxjava2_闪电_Star的博客-程序员宅基地

rxjava2/rxjava3+AutoDispose的使用优雅解决RxJava内存泄漏github 地址:github 地址:https://github.com/uber/AutoDispose添加 依赖 目前新版本// AutoDispose api 'com.uber.autodispose2:autodispose:2.1.1' api 'com.uber.autodispose2:autodispose-androidx-lifecycle:2.1.1' /_android rxjava3 rxjava2

Ubuntu系统的PCL、Eigen卸载和安装_ubuntu卸载pcl1.8_杰尼君的博客-程序员宅基地

Ubuntu系统的PCL、Eigen卸载和安装1、对已安装的PCL、Eigen库进行卸载2、对目标版本的PCL、Eigen库进行安装问题描述需要对 PCL 或者 Eigen 文件库进行降版本或者升级版本的更新1、对已安装的PCL、Eigen库进行卸载卸载当前的 PCL 库假设目前电脑安装的 PCL 库位pcl-1.8版本,进行卸载命令式要注意根据查看到的库文件位置进行输入命令sudo updatedb locate pcl-1.8 #查看pcl-1.8的位置sudo rm -r /u_ubuntu卸载pcl1.8

随便推点

C++抽象编程——算法分析(2)——Big-O表示法_c++大o表示法_gzhosp_redAnt的博客-程序员宅基地

进行如果我们按照上一篇的文章那样的详细分析的问题是您最终得到的信息太多。 虽然有一个公式来预测一个程序将要花多长时间,但是通常可以采取更多的定性措施。 本质上,选择排序的问题在于,将输入向量的大小加倍,将选择排序算法的运行时间增加了四倍,这意味着运行时间比vector中的元素数量的增长快得多。 你可以获得关于算法效率的最有价值的定性观察通常是帮助你了解当问题的规模大小的发生变化算法时的算法性能如何_c++大o表示法

hdu 5400 Arithmetic Sequence(水题一道)_FainTwinkle的博客-程序员宅基地

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5400Arithmetic SequenceTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 312 Accepted

网格化管理服务系统,携同用户创新共进步_柠檬琉璃夏的博客-程序员宅基地

近几年针对城市管理工作,从之前的粗放式的管理到现在的精细化管理,从之前的区域管理到现在的网格化管理,从方式到管理模式都发生了改变。网格化管理是实现手段数字化的一种,主要体现在管理对象、过程、评价的数字上,保证管理的敏捷、精确和高效。网格化管理是城市、社区或者街道乡镇通过使用搭建的**网格化管理平台**全面贯彻了科学发展观,平台创新社会管理方式,整合人口、社会事务、城市公共服务、民政、卫生、文化及...

pc-lint source insight设置_jlint source insight_jerry_lin3000的博客-程序员宅基地

以下参考http://campus.chsi.com.cn/xy/com/200801/20080116/3689197.html 概述  PC-Lint是一个历史悠久,功能异常强劲的静态代码检测工具。它的使用历史可以追溯到计算机编程的远古时代(30多年以前)。经过这么多年的发展,它不但能够监测出许多语法逻辑上的隐患,而且也能够有效地帮你提出许多程序在空间利用、运行效率上的改进点,在很多专业级的_jlint source insight

25 -SpringBoot学习(7)- 修改端口号_一角残叶的博客-程序员宅基地

1 修改端口号和访问路径1.1 在application.properties中server.port=8888 server.context-path=/test1.2 在application.yml中注意冒号后的只能用空格,不能用tabserver: port: 8090 context-path: /test-yml2 Springboot 打包部署先打成war包或者jar包使用java -jar *** 运行即可2.1 添加依赖 <build&g

推荐文章

热门文章

相关标签