Springboot+MybatisPlus高效實現增刪改查

2020-12-10 程式設計師柳大俠

Mybatis-Plus基於mybatis做了增強,大大簡化了單表CRUD操作,而且Mybatis-Plus是無侵入性的,不會影響現有項目,Mybatis-Plus提供了代碼生成器,可以根據資料庫表一鍵生成對應的service、mapper、xml文件,service和mapper提供了豐富的CRUD操作方法,xml文件也是非常簡潔。

目前最新版本是3.4.1版本。

最新版本

蠻看一下框架結構圖,

結構圖

接下去我們就以該版本來講解下Mybati-Plus的各種用法。

本文分為以下幾個部分講解:

引入Mybatis-Plus依賴代碼生成器配置Mybatis-PlusCURD示例條件構造分頁擴展功能一、引入Mybatis-Plus依賴

本文示例使用maven作為依賴管理,在pom.xml文件引入springboot和Mybatis-plus的依賴,使用的是最新版的mybatis-plus。

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.4.0</version>

<relativePath/>

</parent>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus-boot-starter</artifactId>

<version>3.4.1</version>

</dependency>

<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus-generator</artifactId>

<version>3.4.1</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-freemarker</artifactId>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<scope>runtime</scope>

</dependency>

</dependencies>

springboot的依賴:提供了使用springboot的能力。

mybatis-plus-generator依賴:用於生成集成Mybatis-plus的代碼。

freemarker依賴:因為生成代碼需要用到模板。

mysql連接依賴:用於資料庫連接,生成代碼和資料庫操作時都需要該依賴。

二、代碼生成器

Mybatis-plus代碼生成器用於生成一個集成了Mybatis-plus的框架結構,一般會生成以下幾個文件。

entity實體類:對應資料庫中的表的實體類,有各種Mybatis-plus的註解可以使用,比如主鍵生成策略、邏輯刪除、自動填充等。xml文件:Mybatis的sql配置文件,對應Mapper接口。Mapper接口:就是我們平常所說的Dao層暴露的方法所在接口,接口中的方法對應xml文件中對應的sql,封裝了一些常用的增刪改查方法。service接口+service實現類:集成了Mybatis-plus的封裝類,封裝了一些常用的增刪改查方法,默認引入了對應的Mapper。controller類:此類並沒有什麼Mybatis-plus的內容,就是普通的前端請求接口控制層入口,在此引入service。生成代碼需要三個步驟:

寫一個生成代碼的方法資料庫建表運行生成代碼方法輸入表名生成各文件

1.生成代碼示例

我這裡提供一個我的生成器代碼示例,只要修改成你自己的包名、資料庫連接,作者信息、生成路徑即可。

package com.huangtl.user;

import com.baomidou.mybatisplus.annotation.DbType;

import com.baomidou.mybatisplus.annotation.IdType;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;

import com.baomidou.mybatisplus.core.toolkit.StringPool;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;

import com.baomidou.mybatisplus.generator.AutoGenerator;

import com.baomidou.mybatisplus.generator.InjectionConfig;

import com.baomidou.mybatisplus.generator.config.*;

import com.baomidou.mybatisplus.generator.config.po.TableInfo;

import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

public class CodeGenerator {

/**

* <p>

* 讀取控制臺內容

* </p>

*/

public static String scanner(String tip) {

Scanner scanner = new Scanner(System.in);

StringBuilder help = new StringBuilder();

help.append("請輸入" + tip + ":");

System.out.println(help.toString());

if (scanner.hasNext()) {

String ipt = scanner.next();

if (StringUtils.isNotBlank(ipt)) {

return ipt;

}

}

throw new MybatisPlusException("請輸入正確的" + tip + "!");

}

public static void main(String[] args) {

// 代碼生成器

AutoGenerator mpg = new AutoGenerator();

// 全局配置

GlobalConfig gc = new GlobalConfig();

String projectPath = System.getProperty("user.dir");

gc.setOutputDir(projectPath + "/src/main/java");

gc.setAuthor("程式設計師柳大俠");

gc.setBaseResultMap(true);

gc.setBaseColumnList(true);

// gc.setSwagger2(true); //true 開啟 swagger2 模式

gc.setOpen(false);

gc.setIdType(IdType.NONE);

mpg.setGlobalConfig(gc);

// 數據源配置

DataSourceConfig dsc = new DataSourceConfig();

dsc.setDbType(DbType.MYSQL);

dsc.setUrl("jdbc:mysql://192.168.67.129:3306/mybatis_plus?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC");

// dsc.setSchemaName("public");

dsc.setDriverName("com.mysql.cj.jdbc.Driver");

dsc.setUsername("root");

dsc.setPassword("root");

mpg.setDataSource(dsc);

// 包配置

PackageConfig pc = new PackageConfig();

pc.setModuleName("user");

pc.setParent("com.huangtl");

mpg.setPackageInfo(pc);

// 自定義配置

InjectionConfig cfg = new InjectionConfig() {

@Override

public void initMap() {

// to do nothing

}

};

List<FileOutConfig> focList = new ArrayList<>();

focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {

@Override

public String outputFile(TableInfo tableInfo) {

// 自定義輸入文件名稱

return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;

}

});

cfg.setFileOutConfigList(focList);

mpg.setCfg(cfg);

mpg.setTemplate(new TemplateConfig().setXml(null));

// 策略配置

StrategyConfig strategy = new StrategyConfig();

strategy.setNaming(NamingStrategy.underline_to_camel);

strategy.setColumnNaming(NamingStrategy.underline_to_camel);

// strategy.setEntityLombokModel(true); //是否為lombok模型

strategy.setRestControllerStyle(true);

strategy.setInclude(scanner("表名"));

strategy.setControllerMappingHyphenStyle(true);

strategy.setTablePrefix(pc.getModuleName() + "_");

strategy.setEntityTableFieldAnnotationEnable(true);

mpg.setStrategy(strategy);

mpg.setTemplateEngine(new FreemarkerTemplateEngine());

mpg.execute();

}

}

你可以修改這裡的配置,比如類名規則(下劃線轉駝峰)、id生成策略(自增、UUID等)、生成swagger注釋、使用Lombok注釋等。

2.資料庫建表

我這裡建個user表用於後面的示例,總共三個欄位:id、nick_name、age

user表

3.運行生成器代碼

控制臺提示輸入表名時輸入表名回車即可生成。

運行生成器代碼

生成完整目錄如下:

完整目錄

三、配置Mybatis-Plus

在使用Mybatis-Plus之前我們還需要進行一些配置,包括springboot啟動類、資料庫連接和Mybatis-Plus的配置。

1.springboot啟動類:

@SpringBootApplication

public class UserServiceApp {

public static void main(String[] args) {

SpringApplication.run(UserServiceApp.class, args);

}

}

2.application.yml文件:

server:

port: 8092

spring:

datasource:

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://192.168.67.129:3306/mybatis_plus?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&nullCatalogMeansCurrent=true

username: root

password: root

mybatis-plus:

mapper-locations: classpath*:mapper/**/*.xml

#實體掃描,多個package用逗號或者分號分隔

type-aliases-package: com.huangtl.user.entity

configuration:

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

主要配置了資料庫連接和mybatis-plus的掃描,dao層的Mapper掃描還需要一個配置類。

3.MybatisPlusConfig類:

package com.huangtl.user.config;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.context.annotation.Configuration;

@Configuration

@MapperScan({"com.huangtl.user.mapper*"})

public class MybatisPlusConfig {

}

@Configuration說明是springboot的配置類。

@MapperScan指定掃描指定位置的Mapper接口。

好了,這樣你就可以使用順利使用Mybatis-Plus的代碼操作資料庫了,接下去看下Mybatis-Plus的使用示例。

四、CURD示例

生成的代碼結構上面已經解釋了,我們這裡主要看下service層的類,這裡包含了幾乎所有的新增改查方法。

先看下service實現類。

service實現類

這裡主要是繼承了Mybatis-Plus的一個service實現類,通過泛型的方式將Dao層Mapper類和實體類引入。增刪改查方法都在該類。我們可以直接調用該父類方法操作資料庫,比如根據id獲取一個用戶信息方法:

User byId = this.getById(1);

後面的的例子中都在UserServiceImpl中,所以都使用this關鍵字調用,如果需要其他類調用只需要注入該類即可。

1.新增

public void testInsert(){

User user = new User();

user.setNickName("程式設計師柳大俠");

user.setAge(90);

this.save(user);

}

效果:

2.修改

public User testUpdate(int id){

User user = new User();

user.setId(id);

user.setNickName("柳大俠");

user.setAge(20);

this.updateById(user);

return user;

}

效果:

其他修改方式:

//1.新增或修改

this.saveOrUpdate(user);

//2.lambda表達式修改

this.update(Wrappers.lambdaUpdate(User.class).set(User::getNickName,"柳大俠").eq(User::getId,id));

//3.資料庫原欄位修改

this.update(new UpdateWrapper<User>().set("nick_name","柳大俠").eq("id",id));

//4.批量修改

List<User> list = new ArrayList<>();

list.add(user);

this.updateBatchById(list);

3.刪除

物理刪除默認都是物理刪除,會刪除資料庫中的該條記錄。

public void remove(int id){

this.removeById(id);

}

其他方式:

//lambda表達式方式

this.remove(Wrappers.lambdaQuery(User.class).eq(User::getId,id));

//資料庫原欄位方式

this.remove(new QueryWrapper<User>().eq("id",id));

//批量刪除

this.removeByIds(ids);

邏輯刪除邏輯刪除不會刪除資料庫中的記錄,只會修改刪除標誌欄位。

使用方式,在欄位上加上@TableLogic註解。

@TableLogic

private Integer deleted;

默認1為已刪除,0為未刪除。

當你調用刪除方法比如removeById時不會刪除記錄,只會把deleted欄位改為1;

你也可以配置已刪除/未刪除的標誌值。

mybatis-plus:

global-config:

db-config:

logic-delete-field: flag # 全局邏輯刪除的實體欄位名(since 3.3.0,配置後可以忽略不配置註解@TableLogic)

logic-delete-value: 1 # 邏輯已刪除值(默認為 1)

logic-not-delete-value: 0 # 邏輯未刪除值(默認為 0)

4.查詢

查詢方式可以查詢單條記錄信息和多條信息,示例如下:

//單個查詢

User user = this.getById(id);

//lambda表達式

User user = this.getOne(Wrappers.lambdaQuery(User.class).eq(User::getId,id));

//資料庫原欄位

User user = this.getOne(new QueryWrapper<User>().eq("id",id));

//查詢多條記錄

List ids = new ArrayList();

ids.add(1);

ids.add(2);

List<User> users = this.listByIds(ids);

//查詢20歲到30歲之間的用戶

List<User> users = this.list(Wrappers.lambdaQuery(User.class)

.ge(User::getAge,20)

.le(User::getAge,30));

//查詢20歲或者30歲之間的用戶

List<User> users = this.list(Wrappers.lambdaQuery(User.class)

.eq(User::getAge,20)

.or().eq(User::getAge,30));

//查詢年齡最小的10條記錄

List<User> users = this.list(Wrappers.lambdaQuery(User.class).orderByAsc(User::getAge).last("limit 10"));

可以使用func方法根據參數指定對應的sql語句:

String orderColumn = "age";

List<User> users = this.list(Wrappers.lambdaQuery(User.class)

.func(w->{

//如果排序列是年齡則根據年齡排序

if("age".equals(orderColumn)){

w.orderByAsc(User::getAge);

}else if("nickName".equals(orderColumn)){

//如果排序列是暱稱則根據暱稱排序

w.orderByAsc(User::getNickName);

}

}));

五、分頁

在3.4.0版本以前使用的是PaginationInterceptor,只需要在配置類中定義:

@Bean

public PaginationInterceptor paginationInterceptor() {

PaginationInterceptor paginationInterceptor = new PaginationInterceptor();

return paginationInterceptor;

}

3.4.0以後使用的是MybatisPlusInterceptor:

@Bean

public MybatisPlusInterceptor mybatisPlusInterceptor() {

MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

return interceptor;

}

接口寫法:

@GetMapping()

public Page queryPage(@RequestBody Page page){

page = userService.page(page, Wrappers.lambdaQuery(User.class).orderByAsc(User::getAge));

return page;

}

這裡主要使用到了userService的page方法,也是Mybatis-Plus提供的,返回的也是一個Page對象。

Page類對應的是com.baomidou.mybatisplus.extension.plugins.pagination.Page;

主要屬性如下:

records:返回記錄

total:總頁數

size:每頁顯示條數

current:當前頁

pages:總頁數

前端請求體如下:

{

"size":10,

"current":1

}

一般前端只需要傳size和current即可。

返回內容體如下:

{

"records": [

{

"id": 2,

"nickName": "程式設計師柳大俠",

"age": 90

}

],

"total": 1,

"size": 10,

"current": 1,

"orders": [],

"optimizeCountSql": true,

"hitCount": false,

"countId": null,

"maxLimit": null,

"searchCount": true,

"pages": 1

}

擴展分頁參數

一般來講我們需要前端傳一些自定義參數,而不僅是page中的參數,那麼可以這樣子寫。

比如我們需要多傳一個maxAge最大年齡查詢參數。

定義一個請求參數體繼承Page類。

public class pageDto extends Page {

private int maxAge;

public int getMaxAge() {

return maxAge;

}

public void setMaxAge(int maxAge) {

this.maxAge = maxAge;

}

}

定義接口使用自定義的請求體

@GetMapping("/page")

public Page queryPage(@RequestBody pageDto page){

page = userService.page(page, Wrappers.lambdaQuery(User.class).le(User::getAge,page.getMaxAge()).orderByAsc(User::getAge));

return page;

}

前端請求參數

{

"size":10,

"current":1,

"maxAge":100

}

如果不想使用上面的寫法,Page也提供了許多構造函數,當前頁和顯示條數你可以自己定義參數,然後通過Page的構造函數new Page(...)出來,最後再調用userService.page(E page, Wrapper<T> queryWrapper)即可。

new Page(long current, long size);

new Page(long current, long size, long total);

newPage(long current, long size, boolean isSearchCount);

...

六、擴展功能

這裡講兩個常用的擴展功能,分別是自動填充屬性和枚舉屬性。

1.自動填充屬性

有時候我們需要在新增或更新資料庫時自動給一些欄位賦值,比如新增時自動賦值創建時間,更新時自動賦值更新時間。

先寫各配置類。

package com.huangtl.user.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

import org.apache.ibatis.reflection.MetaObject;

import org.springframework.context.annotation.Configuration;

import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**

* @Description 參數填充

* @Author 程式設計師柳大俠

**/

@Configuration

@Component

public class MybatisMetaObjectHandler implements MetaObjectHandler {

@Override

public void insertFill(MetaObject metaObject) {

this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推薦使用)

this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推薦使用)

}

@Override

public void updateFill(MetaObject metaObject) {

this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推薦使用)

}

}

定義了新增和更新填充方法,光這樣還不行,你需要在實體類的欄位上添加@TableField註解並指定fill屬性,如下:

@TableField(value = "create_time",fill = FieldFill.INSERT)

private LocalDateTime createTime;

FieldFill.INSERT代表新增時會賦值。如果希望新增時也賦值更新時間欄位,可以使用fill = FieldFill.INSERT_UPDATE 。

@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)

private LocalDateTime updateTime;

我們來試試,給user表增加create_time和update_time欄位。

執行新增方法

User user = new User();

user.setNickName("程式設計師柳大俠");

user.setAge(90);

this.save(user);

可以看到已經自動填充了創建時間和更新時間

我們再來執行下更新方法。

User user = new User();

user.setId(id);

user.setNickName("柳大俠");

user.setAge(20);

this.updateById(user);

需要注意的是,有部分更新方法無法自動填充, 可以使用updateById方法。

2.枚舉屬性

有時候我們有一些欄位只會出現固定的值,我們可以用枚舉屬性來表示,比如性別只有男女,資料庫我們可能用0和1表示。

首先需要修改下配置文件,增加一個mybatis-plus.typeEnumsPackage參數,掃描你的枚舉所在的包位置。

mybatis-plus:

mapper-locations: classpath*:mapper/**/*.xml

#實體掃描,多個package用逗號或者分號分隔

type-aliases-package: com.huangtl.user.entity

typeEnumsPackage: com.huangtl.user.enums

configuration:

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

我們以性別屬性為例,我們新增一個sex欄位和枚舉類。示例如下:

package com.huangtl.user.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;

import com.fasterxml.jackson.annotation.JsonValue;

import java.util.HashMap;

import java.util.Map;

public enum SexEnum {

MAN(0,"男"),

WOMAN(1,"女"),

;

SexEnum(int code, String desc) {

this.code = code;

this.desc = desc;

}

@EnumValue

private final int code;

private final String desc;

@JsonValue

public Map result() {

Map map = new HashMap();

map.put("code",code);

map.put("desc",desc);

return map;

}

}

@EnumValue 註解說明我們再資料庫中保存的是該值。

@JsonValue註解代表我們查詢返回給前端的屬性對象。

在實體類中定義sex屬性(get/set方法別漏了)。

@TableField("sex")

private SexEnum sex;

我們將資料庫增加一個sex欄位,新增一個帶sex的User。

User user = new User();

user.setNickName("程式設計師柳大俠");

user.setAge(90);

user.setSex(SexEnum.MAN);

this.save(user);

這裡有個坑,資料庫欄位類型要int類型,不能用tinyint。

我們來測試下剛才的分頁接口看返回的內容是什麼。

{

"records": [

{

"id": 3,

"nickName": "柳大俠",

"age": 20,

"createTime": "2020-11-26 14:44:05",

"updateTime": "2020-11-26 14:46:25",

"sex": null

},

{

"id": 2,

"nickName": "程式設計師柳大俠",

"age": 90,

"createTime": null,

"updateTime": null,

"sex": null

},

{

"id": 4,

"nickName": "程式設計師柳大俠",

"age": 90,

"createTime": "2020-11-26 15:15:25",

"updateTime": "2020-11-26 15:15:25",

"sex": {

"code": 0,

"desc": "男"

}

},

{

"id": 5,

"nickName": "程式設計師柳大俠",

"age": 90,

"createTime": "2020-11-26 15:16:46",

"updateTime": "2020-11-26 15:16:46",

"sex": {

"code": 1,

"desc": "女"

}

}

],

"total": 4,

"size": 10,

"current": 1,

"orders": [],

"optimizeCountSql": true,

"hitCount": false,

"countId": null,

"maxLimit": null,

"searchCount": true,

"pages": 1

}

可以看到我們後面新加的用戶sex返回的json格式包含值和描述,這樣前端展示時也不用判斷0顯示男、1顯示女了,直接展示後端返回的內容就可以了。

總結一下

本文主要針對以下幾個部分進行講解:

引入Mybatis-Plus依賴代碼生成器配置Mybatis-PlusCURD示例條件構造分頁擴展功能

在實際使用中還是比較方便的,配合lambda表達式代碼也比較優雅,還有一些功能本文並沒有介紹,可以自行去查閱。

相關焦點

  • springboot+jpa+thymeleaf實現信息增刪改查功能
    前端:thymeleaf後端:springboot+jpa資料庫:mysql5.6jdk:1.8及以上掃碼關注回復【增刪該查】獲取源碼如果你在運行這個代碼的過程中有遇到問題,請加小編微信xxf960513,我拉你進對應微信學習群!!幫助你快速掌握這個功能代碼!
  • asp.net連接MySQL,在GridView上實現增刪改查:前臺配置參數實現
    asp.net中如果想要在GridView控制項上實現增刪改查,通過給GridView添加數據源就可以實現,前提是使用的資料庫必須是數據源中有的。在SqlDataSource控制項中添加數據源最方便的是使用SQLServer、Access資料庫,但是有很多項目也會用到mysql資料庫,但是SqlDataSource中沒有提供mysql資料庫的連接,所以如果想要在GridView中通過配置來實現增刪改查mysql資料庫,是比SQLserver資料庫複雜。
  • 使用mybatis框架,完成增刪改查操作
    資料庫無外乎就是增刪改查,所以使用mybatis做一個完整的crud操作。最後使用動態代理對代碼優化,具體底層實現原理就不仔細深究了,大致知道怎麼回事就行。既然有接口,那麼也要有一個和其對應的實現類userDaoImpl,當然該實現類後續可以使用動態代理省略掉,暫且先不考慮。在寫實現類之前,我們要先在mapper配置文件中編寫對應的sql語句。
  • java 小工具 | 封裝通用的 Mybatis 生成模板 |1 秒寫完增刪改查
    項目背景前段時間我們介紹了如何使用thymeleaf去生成mybatis相關的模板:https://www.lixiang.red/articles/2019/07/23/1563857782748.html今天小刀和各位小夥伴們一起來深入下這個問題,我們來研究下怎麼去封裝一個通用的Mybatis模板,讓簡單的增刪改查操作
  • Mybatisplus-plus 1.3.1 發布,新增服務層根據複合主鍵 CRUD 操作
    Mybatisplus-plus 1.3.1新增在service層操作複合主鍵進行增刪改查相關操作的功能。
  • 「極客新課」第01.15期JDBC 連接資料庫及增刪改查操作
    為下一步課程做好準備。|本節課將帶你學習核心內容:1.如何向項目中導入jar包2.Java連接MySQL的機制和實現3.Java連接數據的工具類實現4.JDBC對資料庫的增刪改查操作5.代碼的優化6.實際調用操作
  • 史上最全的SpringBoot 中引入 MyBatisPlus 的常規流程!
    二、通用 CRUDVSPSMyBatisMyBatisPlus代碼生成器資料庫有些表的欄位發聲改變① 再次運行逆向工程的代碼 ②生成一堆代碼,還最好不要動它①只需要修改 Bean 即可(反射實現的)② 生成少量的代碼,可以人為新增內容CRUD無規律特殊時手動寫 Mapper 層 sql通過條件構造器,實現零 sql !
  • mysql資料庫的基本增刪改查操作總結
    OK,到這裡最基本的增刪改查也整理了一遍,還有很多其他的基礎知識點。今後接著整理。
  • 精講Mybatis框架對資料庫增刪改查操作
    在項目開發中我們會做一種底層方法抽取來實現不同條件的增刪改查。下面請看java代碼很簡單只有兩行代碼。下面請看執行結果刷新navicat,可以看到表中id為30的章子怡已經被刪除了。以上就是我們通過MyBatis框架對資料庫進行基本的增刪改查操作。
  • Java Mybatis CRUD增刪改查
    UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.deleteUser(5); sqlSession.commit(); sqlSession.close(); }注意點:增刪改查需要提交事務
  • 「謝燦asp.net三層架構」3、創建增刪改查及複雜操作的存儲過程
    簡而言之,存儲過程就是SQL Server為了實現特定任務,而將一些需要多次調用的固定操作語句編寫成程序段,這些程序段存儲在伺服器上,有資料庫伺服器通過程序來調用。可實現模塊化的程序設計,存儲過程可以多次調用,提供統一的資料庫訪問接口,改進應用程式的可維護性。存儲過程可以增加代碼的安全性,對於用戶不能直接操作存儲過程中引用的對象,SQL Server可以設定用戶對指定存儲過程的執行權限。
  • JNPF快速開發平臺-簡單快速高效開發java項目
    使用JNPF開發平臺可以簡單、快速、高效的構建各種類型java項目。圖標組件:echarts、highcharts 列印組件:lodop、h5列印 APP JS框架:uniapp, h5, vue APP UI框架:uniapp 後端 核心框架: springboot
  • DDL之資料庫--增刪改查
    create database dt55-mysql;2、show databases3、查看當前用戶連接的是哪個資料庫:select database();4、查看指定的資料庫下有哪些表:show tables  DDL表操作DDL之對表的增刪改查
  • Nginx+SpringBoot實現負載均衡
    前言本篇文章主要介紹的是Nginx如何實現負載均衡。,實現的一種消息隊列分發機制。upstream xuwujing {random two least_time=last_byte;server www.panchengming.com;server www.panchengming2.com;}Nginx+SpringBoot實現負載均衡環境準備這裡的項目就用本人之前的一個springboot項目,SpringBoot
  • MySQL(二):數據的增刪改查
    修改數據在MySQL中,我們使用alter table 語句來修改表名、欄位名或者數據類型,也可以增刪欄位(前面已經使用到)。該語句的使用非常廣泛,是修改表結構的常用語句。
  • 第02篇:SQL資料庫的四種基本操作「增刪改查」
    二、SQL腳本其實通過工具也可以實現增刪改查,但通過SQL語句來實現相關操作效率更高。一、插入單條數據可以通過INSERT…VALUES語句來實現數據的插入。它一次性向表中插入一條數據,可以整行插入,也可以部分插入。如果沒有特定列,則認為是整行插入。
  • SpringBoot 接口冪等性的實現方案
    /springboot-idempotent-token/一、什麼是冪等性冪等是一個數學與計算機學概念,在數學中某一元運算為冪等時,其作用在任一元素兩次後會和其作用一次的結果相同。其實現方法可以使用分布式鎖或者使用 Lua 表達式來註銷查詢與刪除操作。
  • springboot整合mybatis實現配置多數據源
    前言:實際開發中,隨著業務的擴張,使用單一的資料庫顯然有點臃腫,不便管理,經常會實現將不同的業務模塊的數據表結構放在各自的資料庫中,下邊簡單實現sprongboot實現多數據源的配置。一 項目結構:二 涉及到的資料庫:三 springboot中的application.properties文件:本次demo簡單配置下兩個數據源為例。