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

智能推荐

直接发个官方自带的MarkDown编辑教程_自带 markdown_菜鸡也很难受的博客-程序员宅基地

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar_自带 markdown

Spring的bean线程是否安全_bean线程是否安全和几种注册方式_念兰的博客-程序员宅基地

Spring的作用域:单例多例单例:意味内存中只有一个实例,如果你定义了一个成员变量此时线程来同时访问并还没保证成员变量的原子性操作,此时就会有线程安全问题解决方案:枷锁ThreadLocal多例:没有安全问题,。因为每个人过来都属于与自己的东西..._bean线程是否安全和几种注册方式

python找最大值的函数_python求最大值-程序员宅基地

广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!代码示例 import torch a=torch.randn((3,5)) atensor(, , ]) _,pre=a.topk(1,dim=1,largest=true) pretensor(, , ]) _tensor(, , ]) _,pre=a.topk(1,dim=1,..._python求最大值函数

长沙IT人看CSDN总部迁移长沙-程序员宅基地

CSDN 总部落户长沙,共建中国开发者产业中心城市看到这章新闻在长沙各大IT圈子,微信群疯狂转发,心里真的是足够喜悦,先看这里。 2020 年 5 月 9 日,在长沙湘麓山庄,湖南省委常委、长沙市委书记胡衡华与 CSDN 创始人蒋涛共同出席见证建设软件开发者中心城市的战略合作协议的签约和专项支持资金的颁发,并宣布 CSDN 将总部落户长沙。长沙市委副书记、代市长、湖南湘江新区党工委书记郑建新等领导出席。 CSDN 创始人蒋涛表示,此次总部落户长沙,将在长沙积极营造开发者产业生态...

什么是DUL?-程序员宅基地

经常有朋友在ITPUB上问到DUL工具,我在这里对这个工具作一个简要介绍。DUL是Data Unloader的缩写,为Oracle公司工程师 Bernard van Duijnen 开发,以标准C写成,可以直接从Orac...

系统集成项目管理工程师笔记-程序员宅基地

目录依据第二版教程_系统集成项目管理工程师笔记

随便推点

Ironic几种不同的场景下的网络拓扑-程序员宅基地

最近帮领导做了几页ppt,总结几种场景下ironic管理物理机网络的网络拓扑,简单做成一份文章记录下。只是方便自己记忆,没有认真修改。如果对ironic有一定了解,可以看下,加深理解。1. vlan模式+物理机Ironic Ocata之后支持,neutron接交换机管理物理机网络的场景。在这种模式下,通过nova创建裸机时,neutron可以配置交换机,将物理机的接口vlan切入到用...

oracle group by中rollup、cube、grouping sets、grouping-程序员宅基地

oracle group by中rollup和cube和grouping sets的区别:Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是ROLLUP(A, B, C)的话, 首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。 如果是G

《Linux运维总结:lua+nginx实现黑名单禁止访问》_lua+redis动态黑名单_东城绝神的博客-程序员宅基地

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例_lua+redis动态黑名单

百家互联网QA面试题--性能_qa笔试题 信息系统-程序员宅基地

1、基础概念:HPS、TPS、QPS、RPS、RT、并发用户数概念?简要介绍?HPS(Hits Per Second):每秒点击次数,单位是次/秒。TPS(Transaction per Second):系统每秒处理事务数,简称TPS, 每秒事务数, 是衡量系统性能的一个非常重要的指标。QPS(Query per Second):系统每秒处理查询次数,单位是次/秒。对于互联网业务中,如果某些业务有且仅有一个请求连接,那么TPS=QPS=HPS,一般情况下用TPS来衡量整个业务流程,用QPS来衡量接口查_qa笔试题 信息系统

iOS 监听UIScrollView滚动停止_ios开发 scrollview停止划动监听-程序员宅基地

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { // 停止类型1、停止类型2 BOOL scrollToScrollStop = !scrollView.tracking && !scrollView.dragging && !scrollView.deceler..._ios开发 scrollview停止划动监听

TortoiseSVN的使用_tortoisesvn怎么打开-程序员宅基地

TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。本篇经验将和大家介绍TortoiseSVN的使用,希望对大家有所帮助!下载安装 1 到官方网站上..._tortoisesvn怎么打开