Mybatis

基本的增删改查

以下演示是在springboot上做得

application.yml

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.5.19:3306/vr_resource?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: asdfasdf
    hikari:
      minimum-idle: 5
      idle-timeout: 180000
      maximum-pool-size: 10
      auto-commit: true
      pool-name: MyHikariCP
      max-lifetime: 1800000
      connection-timeout: 30000

server:
  port: 9090
mybatis:
  config-location: classpath:mybatis-config.xml
  mapper-locations: classpath:mapper/*.xml
  #type-aliases-package: com.example.demo.entity

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>

ResourceMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--与某一个mapper接口关联,写全限定名称-->
<mapper namespace="com.example.demo.mapper.VrResourceMapper">

    <!--id对应mapper接口里的方法名字-->
    <!--resultType对应的是返回类型-->
    <!--parameterType对应的是参数类型-->
        <!-- 可以是实体类,也可以是Map,String,Integer...-->

    <select id="selectAll" resultType="com.example.demo.entity.VrResource">
        select * from japan_resource;
    </select>

    <select id="selectSome" resultType="com.example.demo.entity.VrResource" parameterType="String">
        select * from japan_resource where id= #{str};
    </select>

    <insert id="insertOne" parameterType="com.example.demo.entity.VrResource">
        insert into wholeview_resource (title,extra) values (#{vrResource.title},#{vrResource.extra});
    </insert>

</mapper>

entity

package com.example.demo.entity;

import lombok.Data;

import java.util.Date;
@Data
public class VrResource {
    private Integer id;
    private String title;
    private Date updateTime;
    private String extra;
    public VrResource(){

    }
    public VrResource( String title, String extra){
        this.title=title;
        this.extra=extra;
    }
}

controller

package com.example.demo.controller;

import com.example.demo.entity.VrResource;
import com.example.demo.service.VrResourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.List;

@RestController
public class VrResourceController {
    @Autowired
    private VrResourceService vrResourceService;

    @ResponseBody
    @RequestMapping("selectall")
    public List<VrResource> selectAll(){
        return vrResourceService.selectAll();
    }

    @ResponseBody
    @RequestMapping("selectsome/{str}")
    public List<VrResource> selectSome(@PathVariable(value = "str") String str){
        return vrResourceService.selectSome(str);
    }

    @ResponseBody
    @RequestMapping("insertone")
    public void insertOne(){

        VrResource vrResource=new VrResource("s","s");

        vrResourceService.insertOne(vrResource);
    }
}

service

package com.example.demo.service;


import com.example.demo.entity.VrResource;
import com.example.demo.mapper.VrResourceMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class VrResourceService {
    @Autowired
    VrResourceMapper vrResourceMapper;

    public List<VrResource> selectAll(){
        return vrResourceMapper.selectAll();
    }
    public List<VrResource> selectSome(String str){
        return vrResourceMapper.selectSome(str);
    }

    public void insertOne(VrResource vrResource){
        vrResourceMapper.insertOne(vrResource);
    }
}

mapper(dao)

package com.example.demo.mapper;

import com.example.demo.entity.VrResource;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
public interface VrResourceMapper {
    List<VrResource> selectAll();
    List<VrResource> selectSome(@Param("str") String str);
    void insertOne(@Param("vrResource") VrResource vrResource);
}

程序入口

package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

like模糊查询

--Mysql: 
select * from t_user where name like concat('%', #{name}, '%')
--Oracle: 
select * from t_user where name like '%' || #{name} || '%'
--SQLServer: 
select * from t_user where name like '%' + #{name} + '%' 

resultMap

当数据库里的字段和实体类字段名不一样的时候使用,可以映射

简单使用

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.UserMapper">
  <resultMap id="UserMap" type="User">
    <!-- column数据库中的字段,property实体类中的属性-->
    <result colum="id" property="id"/>
    <result colum="name" property="name"/>
    <result colum="pwd" property="password"/>
  </resultMap>
  
  <select id="xxx" resultMap="UserMap" >
    select * from mybatis.user where id = #{id}
  </select>
</mapper>

mybatis-config.xml

长什么样?

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  这里面些下面的environments,properties等等
</configuration>

环境配置(environnments)

mybatis可以配置成使用多种环境
不过要记住:尽管可以配置多个环境,但每个sqlsessionfactory实例只能选择一种环境。
学会使用配置多套运行环境
mybatis默认的食物管理器就是jdbc,连接池:pooled

属性(properties)

我们可以通过properties属性来实现引用配置文件
这些属性都是可外部配置且可动态替换的,既可以在典型的java属性文件中配置,亦可通过propreties元素的子元素来传递
如果a引用了b(外部),有相同属性的时候优先使用b里面的

类型别名(typeAliases)

类型别名是为java类型设置一个短的名字
存在的意义仅在于用来减少类完全限定名的冗余

   <typeAliases>
        <typeAlias alias="User" type="com.kuang.pojo.User" />
    </typeAliases>

也可以指定一个包名,mybatis会在包名下面搜索需要的java bean,比如:扫描实体类的包,它的默认别名为这个类的类名,首字母小写!如果非要改,name在实体类上增加注解

   <typeAliases>
        <package name="com.kuang.pojo" />
    </typeAliases>
@Alias("myUser")
public class User{}

设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为

类型处理器(typeHandlers)

对象工厂(objectFactory)

插件(plugins)

映射器(mapper)

生命周期和作用域

使用注解写sql

动态sql

if

动态 SQL 通常要做的事情是根据条件包含 where 子句的一部分。比如:

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG
  WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

这条语句提供了一种可选的查找文本功能。如果没有传入“title”,那么所有处于“ACTIVE”状态的BLOG都会返回;反之若传入了“title”,那么就会对“title”一列进行模糊查找并返回 BLOG 结果(细心的读者可能会发现,“title”参数值是可以包含一些掩码或通配符的)。

如果希望通过“title”和“author”两个参数进行可选搜索该怎么办呢?首先,改变语句的名称让它更具实际意义;然后只要加入另一个条件即可。

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>

choose (when, otherwise)

有时我们不想应用到所有的条件语句,而只想从中择其一项。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

还是上面的例子,但是这次变为提供了“title”就按“title”查找,提供了“author”就按“author”查找的情形,若两者都没有提供,就返回所有符合条件的 BLOG(实际情况可能是由管理员按一定策略选出 BLOG 列表,而不是返回大量无意义的随机结果)。

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * 
  FROM BLOG 
  WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

where

where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除。

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG
  <where>
    <if test="state != null">
         state = #{state}
    </if>
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

set

set 元素会动态前置 SET 关键字,同时也会删掉无关的逗号,因为用了条件语句之后很可能就会在生成的 SQL 语句的后面留下这些逗号。(因为用的是“if”元素,若最后一个“if”没有匹配上而前面的匹配上,SQL 语句的最后就会有一个逗号遗留)

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

trim

一句话描述trim的功能:子句首尾的删除与添加。它就是一个字符串处理工具,类似于replace()
<trim prefixOverrides="" prefix="" suffixOverrides="" suffix=""></trim>

  • prefixOverrides:子句首的命中词列表,以|分隔,忽略大小写。如果命中(轮询命中词,最多只命中一次),会删除子句首命中的词;没命中就算了。
  • prefix:删除子句句首后,在子句最前边加上prefix+单个空格。
  • suffixOverrides:子句尾的命中词列表,以|分隔,忽略大小写。如果命中(轮询命中词,最多只命中一次),会删除子句尾命中的词;没命中就算了。
  • suffix:删除子句句尾后,在子句最后边加上单个空格+suffix。

sql片段

有的时候,我们可能会将一些功能的部分出后去出来,方便服用。

  1. 阿斯蒂芬

foreach

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341