首页 文章 精选 留言 我的

精选列表

搜索[增删改查],共8505篇文章
优秀的个人博客,低调大师

SpringBoot2整合MyBatis,连接MySql数据库做增删改操作

前言 什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 参考资料:https://mybatis.org/mybatis-3/zh Jar包说明 本次采用mybatis-spring-boot-starter_v2.1.1版本,对应的MyBatis版本为3.5.3。并且数据库适应MySQL_v5.6.46版本,因此还需要引入MySQL驱动包。 编码 1.添加MyBatis和MySQL依赖 打开pom.xml文件,添加 xml 复制代码 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> 2.数据库表准备 这里以account表为例子,创建account表 sql 复制代码 CREATE TABLE `account` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(128) NOT NULL COMMENT '用户名', `passwd` varchar(128) NOT NULL COMMENT '密码', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 并且创建对应的实体类Account.java java 复制代码 package org.xujun.springboot.model; /** * <p>Title : Account</p> * <p>Description : Account</p> * <p>DevelopTools : Eclipse_x64_v4.13.0R</p> * <p>DevelopSystem : Windows7</p> * <p>Company : org.xujun</p> * @author : XuJun * @date : 2019年12月18日 下午3:07:27 * @version : 1.0.0 */ public class Account { /** ID **/ private Long id; /** 用户名 **/ private String name; /** 密码 **/ private String passwd; public Account() { super(); } public Account(Long id, String name, String passwd) { super(); this.id = id; this.name = name; this.passwd = passwd; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Account [id="); builder.append(id); builder.append(", name="); builder.append(name); builder.append(", passwd="); builder.append(passwd); builder.append("]"); return builder.toString(); } } 3.配置SpringBoot的application.properties文件 因为SpringBoot2.x默认使用hikari作为连接池,所以以下为hikari的配置方式 sh 复制代码 # 数据库配置 # spring.datasource.name : 数据源名称 # spring.datasource.driverClassName : 数据库驱动 # spring.datasource.url : 数据库连接地址 # spring.datasource.username : 数据库用户名 # spring.datasource.password : 数据库密码 # spring.datasource.type : 数据库类型 # spring.datasource.hikari.pool-name : 数据库连接池名称 # spring.datasource.hikari.minimum-idle : 最小连接数 # spring.datasource.hikari.maximum-pool-size : 最大连接数 # spring.datasource.hikari.auto-commit : 是否自动提交 # spring.datasource.hikari.idle-timeout : 连接闲置超时时间 # spring.datasource.hikari.max-lifetime : 连接在连接池中的存活时间 # spring.datasource.hikari.connection-timeout : 连接数据库超时时间 # spring.datasource.hikari.connection-test-query : 连接测试语句 spring.datasource.name=mysqlDataSource spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springBoot2?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root spring.datasource.type=com.zaxxer.hikari.HikariDataSource spring.datasource.hikari.pool-name=hikariPool spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.auto-commit=true spring.datasource.hikari.idle-timeout=30000 spring.datasource.hikari.max-lifetime=1800000 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.connection-test-query=SELECT 1 4.创建MyBatis的Mapper文件 首先创建AccountMapper.java接口文件 java 复制代码 package org.xujun.springboot.dao; import org.xujun.springboot.model.Account; @Mapper public interface AccountMapper { Integer add(Account ac); } 接着创建AccountMapper.xml文件 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="org.xujun.springboot.dao.AccountMapper"> <insert id="add" parameterType="org.xujun.springboot.model.Account"> INSERT INTO account (name, passwd) VALUES (#{name}, #{passwd}) </insert> </mapper> 注意:在MyBatis的xml配置文件中,SQL语句不可用;结尾 5.编写Controller测试MyBatis插入数据 新增MyBatisController.java java 复制代码 package org.xujun.springboot.controller; import javax.annotation.Resource; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.xujun.springboot.dao.AccountMapper; import org.xujun.springboot.model.Account; @RestController public class MyBatisController { @Resource private AccountMapper accountMapper; @RequestMapping("mybatis") public String mybatis() { Account ac = new Account(); ac.setName("xujun"); ac.setPasswd("654321"); accountMapper.add(ac); return "suc"; } } 6.测试结果 运行项目,并且访问[http://127.0.0.1:8080/mybatis]。结果如下图所示 总结:本文主要讲解了SpringBoot整合MyBatis实现对数据的持久化,整合方式并不难,而对数据的持久化参考MyBatis即可。

优秀的个人博客,低调大师

NET实现Hadoop增删改

packages.config <?xml version="1.0" encoding="utf-8"?> <packages> <package id="Microsoft.AspNet.WebApi.Client" version="4.0.20505.0" targetFramework="net46" /> <package id="Microsoft.Data.Edm" version="5.2.0" targetFramework="net46" /> <package id="Microsoft.Data.OData" version="5.2.0" targetFramework="net46" /> <package id="Microsoft.Hadoop.WebClient" version="0.12.5126.42915" targetFramework="net46" /> <package id="Microsoft.Net.Http" version="2.0.20505.0" targetFramework="net46" /> <package id="Microsoft.WindowsAzure.ConfigurationManager" version="1.8.0.0" targetFramework="net46" /> <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net46" /> <package id="System.Spatial" version="5.2.0" targetFramework="net46" /> <package id="WindowsAzure.Storage" version="2.0.4.1" targetFramework="net46" /> </packages> HDFSAccess.cs using Microsoft.Hadoop.WebHDFS; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; namespace Physical { public sealed class HDFSAccess { private readonly WebHDFSClient webHDFSClient; public HDFSAccess(string uriString, string userName) { this.webHDFSClient = new WebHDFSClient(new Uri(uriString), userName); } public List<string> GetDirectories(string path) { var directoryStatus = this.webHDFSClient.GetDirectoryStatus(path).Result; return directoryStatus.Directories.Select(d => d.PathSuffix).ToList(); } public List<string> GetFiles(string path) { var directoryStatus = this.webHDFSClient.GetDirectoryStatus(path).Result; return directoryStatus.Files.Select(d => d.PathSuffix).ToList(); } public bool CreateDirectory(string path) { // 传入路径不包含根目录时,预设会在根目录「/」底下 return this.webHDFSClient.CreateDirectory(path).Result; } public bool DeleteDirectory(string path) { // 传入路径不包含根目录时,预设会在根目录「/」底下 return this.webHDFSClient.DeleteDirectory(path).Result; } public string CreateFile(string localFile, string remotePath) { // 传入远端路径不包含根目录时,预设会在根目录「/」底下 return this.webHDFSClient.CreateFile(localFile, remotePath).Result; } public bool DeleteFile(string path) { // 传入路径不包含根目录时,预设会在根目录「/」底下 return this.webHDFSClient.DeleteDirectory(path).Result; } public HttpResponseMessage OpenFile(string path) { // 传入路径不包含根目录时,预设会在根目录「/」底下 return this.webHDFSClient.OpenFile(path).Result; } } } Program.cs using Physical; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyTest { class Program { // HDFS cluster 客户端进入端点设定于 主机上 // 预设端点:http://[主机名称]:50070 // 预设帐号:Wu private static HDFSAccess access = new HDFSAccess(@"http://127.0.0.1:50070", "Wu"); static void Main(string[] args) { GetDirectoriesTest(); Console.WriteLine("----------------------------------------------"); GetFilesTest(); Console.WriteLine("----------------------------------------------"); DirectoryTest(); Console.WriteLine("----------------------------------------------"); FileTest(); Console.WriteLine("----------------------------------------------"); OpenFileTest(); Console.ReadKey(); } public void TestCleanup() { //取得根目录资料夹 var directories = access.GetDirectories(@"/"); // 移除预设目录:tmp、user 外的目录 foreach (var directory in directories) { if ("tmp".Equals(directory) || "user".Equals(directory)) { continue; } else { access.DeleteDirectory(directory); } } // 取得根目录档案 var files = access.GetFiles(@"/"); // 移除所有档案 foreach (var file in files) { access.DeleteFile(file); } // 移除 OpenFile 转存档案 File.Delete(Path.Combine(Directory.GetCurrentDirectory(), "Test.jpg")); } //_传入根目录_预期回传预设目录 public static void GetDirectoriesTest() { // 预设根目录下有两个目录:tmp、user var expected = new List<string>() { "tmp", "user", }; var actual = access.GetDirectories(@"/"); foreach (var item in actual) { Console.WriteLine(item); } } //_传入根目录_预期回传空集合 public static void GetFilesTest() { // 预设根目录下没有档案 var expected = new List<string>(); var actual = access.GetFiles(@"/"); foreach (var item in actual) { Console.WriteLine(item); } } //_建立zzz目录_预期成功_预期根目录下有zzz目录_删除zzz目录_预期成功_预期根目录下无zzz目录 public static void DirectoryTest() { var directoryName = "zzz"; // 建立zzz目录 var boolCreateDirectory = access.CreateDirectory(directoryName); Console.WriteLine("建立zzz目录_预期成功:"+boolCreateDirectory); // 建立zzz目录_预期成功_预期根目录下有zzz目录 // 预设根目录下有三个目录:tmp、user、zzz var expectedCreateDirectory = new List<string>() { "tmp", "user", directoryName, }; var actualCreateDirectory = access.GetDirectories(@"/"); foreach (var item in actualCreateDirectory) { Console.WriteLine(item); } Console.WriteLine("********************************************"); // 删除zzz目录 var boolDeleteDirectory = access.DeleteDirectory(directoryName); Console.WriteLine("删除zzz目录_预期成功:" + boolDeleteDirectory); // 删除zzz目录_预期成功_预期根目录下无zzz目录 // 预设根目录下有两个目录:tmp、user var expectedDeleteDirectory = new List<string>() { "tmp", "user", }; var actualDeleteDirectory = access.GetDirectories(@"/"); foreach (var item in actualDeleteDirectory) { Console.WriteLine(item); } } //_建立Test档案_预期根目录下有Test档案_删除Test档案_预期成功_预期根目录下无Test档案 public static void FileTest() { var localFile = Path.Combine(Directory.GetCurrentDirectory(), "TestFolder", "Test.jpg"); var remotePath = "Test.jpg"; // 建立Test档案 var boolCreateFile = access.CreateFile(localFile, remotePath); // 建立Test档案_预期根目录下有Test档案 var expectedCreateFile = new List<string>() { remotePath, }; var actualCreateFile = access.GetFiles(@"/"); foreach (var item in actualCreateFile) { Console.WriteLine(item); } Console.WriteLine("********************************************"); // 删除Test档案 var boolDeleteFile = access.DeleteDirectory(remotePath); Console.WriteLine("删除Test档案_预期成功:"+boolDeleteFile); // 删除Test档案_预期成功_预期根目录下无Test档案 var expectedDeleteFile = new List<string>(); var actualDeleteFile = access.GetFiles(@"/"); foreach (var item in actualDeleteFile) { Console.WriteLine(item); } } //_建立Test档案_预期根目录下有Test档案_取得Test档案_预期成功_预期回传Test档案Stream并转存成功 public static void OpenFileTest() { var localFile = Path.Combine(Directory.GetCurrentDirectory(), "TestFolder", "Test.jpg"); var remotePath = "Test.jpg"; var saveFile = Path.Combine(Directory.GetCurrentDirectory(), "Test.jpg"); Console.WriteLine("saveFile:" + saveFile); Console.WriteLine("********************************************"); // 建立Test档案 var boolCreateFile = access.CreateFile(localFile, remotePath); // 建立Test档案_预期根目录下有Test档案 var expectedCreateFile = new List<string>() { remotePath, }; var actualCreateFile = access.GetFiles(@"/"); foreach (var item in actualCreateFile) { Console.WriteLine(item); } Console.WriteLine("********************************************"); // 取得Test档案 var response = access.OpenFile(remotePath); // 取得Test档案_预期成功 response.EnsureSuccessStatusCode(); // 取得Test档案_预期成功_预期回传Test档案Stream并转存成功 using (var fs = File.Create(saveFile)) { response.Content.CopyToAsync(fs).Wait(); } Console.WriteLine(File.Exists(saveFile)); } } } 运行结果如图:

优秀的个人博客,低调大师

Java管理Cookie增删改操作。

Cookie属性 了解这几个属性之后,就知道如何进行Cookie的操作了。 name Cookie的名称。 value Cookie的值。 maxAge Cookie的失效时间,有以下几种值,默认为-1 值 说明 负数 浏览器关闭后cookie就失效 0 马上清除cookie 正数 设置过期时间,单位:秒 path Cookie的有效路径,/表示这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问。 获取所有Cookie public static Cookie[] getCookies(HttpServletRequest request) { return request.getCookies(); } 获取cookie很简单,直接从request中获取即可。 根据名称获取指定Cookie public static Cookie getCookieByName(HttpServletRequest request, String name) { if (StringUtils.isBlank(name)) { return null; } Cookie[] cookies = getCookies(request); if (null != cookies) { for (Cookie cookie : cookies) { if (name.equals(cookie.getName())) { return cookie; } } } return null; } 从所有cookie中循环判断进行获取指定cookie。 添加Cookie public static boolean addCookie(HttpServletResponse response, String name, String value, int maxAge) { if (StringUtils.isBlank(name) || StringUtils.isBlank(value)) { return false; } Cookie cookie = new Cookie(name.trim(), value.trim()); if (maxAge <= 0) { maxAge = Integer.MAX_VALUE; } cookie.setMaxAge(maxAge); cookie.setPath("/"); response.addCookie(cookie); return true; } 这个添加很简单。 删除Cookie public static boolean removeCookie(HttpServletRequest request, HttpServletResponse response, String name) { if (StringUtils.isBlank(name)) { return false; } Cookie[] cookies = getCookies(request); if (null != cookies) { for (Cookie cookie : cookies) { if (name.equals(cookie.getName())) { cookie.setValue(null); cookie.setMaxAge(0); cookie.setPath("/"); response.addCookie(cookie); return true; } } } return false; } 删除cookie,把value设置为null,把max-age设置为0就行了。 注意 编辑操作和删除操作一样,但是需要注意的是修改、删除Cookie时,除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。 推荐阅读 阿里高级Java面试题(首发,70道,带详细答案) 2017派卧底去阿里、京东、美团、滴滴带回来的面试题及答案 Spring面试题(70道,史上最全) 17张图揭密支付宝系统架构 阿里巴巴,排行前10的开源项目! 2018年必看:关于区块链技术的10本书 分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。 扫我关注

优秀的个人博客,低调大师

elasticsearch java 增删改 版本1

既然是开发篇,主要以代码为主,辅助一些说明。所有的内容都是代码实际应该验证过的。 引入的头文件: import static org.elasticsearch.node.NodeBuilder.nodeBuilder; import java.io.IOException; import java.net.InetAddress; import java.util.Date; import java.util.Map; import java.util.Set; import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.client.Client; import org.elasticsearch.client.ClusterAdminClient; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.cluster.health.ClusterIndexHealth; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.node.Node; import static org.elasticsearch.common.xcontent.XContentFactory.*; 创建索引 XContentBuilder mapping = XContentFactory.jsonBuilder() .startObject() .startObject("settings") .field("number_of_shards", 1)//设置分片数量 .field("number_of_replicas", 0)//设置副本数量 .endObject() .endObject() .startObject() .startObject(type)//type名称 .startObject("properties") //下面是设置文档列属性。 .startObject("type").field("type", "string").field("store", "yes").endObject() .startObject("eventCount").field("type", "long").field("store", "yes").endObject() .startObject("eventDate").field("type", "date").field("format", "dateOptionalTime").field("store", "yes").endObject() .startObject("message").field("type", "string").field("index", "not_analyzed").field("store", "yes").endObject() .endObject() .endObject() .endObject(); CreateIndexRequestBuilder cirb = client .admin() .indices() .prepareCreate(indexName)//index名称 .setSource(mapping); CreateIndexResponse response = cirb.execute().actionGet(); if (response.isAcknowledged()) { System.out.println("Index created."); } else { System.err.println("Index creation failed."); } 增加文档 IndexResponse response = client .prepareIndex(indexName, type, "1") .setSource(//这里可以直接用json字符串 jsonBuilder().startObject() .field("type", "syslog") .field("eventCount", 1) .field("eventDate", new Date()) .field("message", "secilog insert doc test") .endObject()).get(); System.out.println("index:"+response.getIndex() +" insert doc id:"+response.getId() +" result:"+response.isCreated()); 查询文档 GetResponse response = client.prepareGet("secilog", "log", "1").get(); String source = response.getSource().toString(); long version = response.getVersion(); String indexName = response.getIndex(); String type = response.getType(); String id = response.getId(); 修改文档 修改文档有两种方式,一种是直接修改,另一种是如果文档不存在则插入存在则修改。 第一种代码 UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index(indexName); updateRequest.type(type); updateRequest.id("1"); updateRequest.doc(jsonBuilder() .startObject() .field("type", "file") .endObject()); client.update(updateRequest).get(); 第二种代码: IndexRequest indexRequest = new IndexRequest(indexName, type, "3") .source(jsonBuilder() .startObject() .field("type", "syslog") .field("eventCount", 2) .field("eventDate", new Date()) .field("message", "secilog insert doc test") .endObject()); UpdateRequest updateRequest = new UpdateRequest(indexName, type, "3") .doc(jsonBuilder() .startObject() .field("type", "file") .endObject()) .upsert(indexRequest); client.update(updateRequest).get(); 删除文档 DeleteResponse dresponse = client.prepareDelete("secilog", "log", "4").get(); boolean isFound = dresponse.isFound(); //文档存在返回true,不存在返回false; 删除索引 DeleteIndexRequest delete = new DeleteIndexRequest("secilog"); client.admin().indices().delete(delete);

优秀的个人博客,低调大师

Go微服务实践之增删改

从此篇文章开始,我们来陆续介绍 go-zero 开发一个项目所需要的组件和开发实践。 首先我们从 model 层开始,来说说go-zero 的API以及封装细节。首先 model 层连接的API集中在core/stores。我们先来看看操作 mysql 这类数据库,API方法我们来到 core/stores/sqlx,所以接下来用几篇的文章总体介绍一下 sqlx 的使用和设计思想。 快速使用 func main() { // 1 const datasource = "user:password@/dbname" mysqlDB := sqlx.NewMysql(datasource) // 2 um := model.NewUserModel(mysqlDB,"User") // 3 ul := logic.NewUserLogic(um) // 4 engine.AddRoutes(nginxApi(ul)) engine.Start() } // NewUserModel,NewUserLogic 类似 func NewUserModel(conn sqlx.SqlConn, table string) *UserModel { return &amp;UserModel{conn: conn, table: table} } // nginxApi将logic注入到handle,同时绑定路由和handler func nginxApi(ul *logic.UserLogic) []rest.Route { return []rest.Route{ { Method: http.MethodGet, Path: "/user/:id", // /user/54er6; Handler: handler.NewUserHandler(ul).GetUserById, } } 总结一下: NewMysql 创建数据库连接 创建相应的 model,并将连接传入「相应的 NewModel 需要开发者编写」 model 是为上一层 logic 提供服务 将 logic 注入到 handler 中,同时 handler 与路由绑定,开启 Server 这样 model-logic-handler 最简单的结构就出来了。然后来看看在 model 层如何进行数据操作: var userBuilderQueryRows = strings.Join(builderx.FieldNames(&amp;User{}), ",") type User struct { Avatar string `db:"avatar"` // 头像 UserName string `db:"user_name"` // 姓名 Sex int `db:"sex"` // 1男,2女 MobilePhone string `db:"mobile_phone"` // 手机号 } func (um *UserModel) Insert(user *User) (int64, error) { const insertsql = `insert into `+um.table+` (`+userBuilderQueryRows+`) values(?, ?, ?)` // insert「delete使用方式一致」 res, err := um.conn.Exec(insertsql, user.Avatar, user.UserName, user.Sex, user.MobilePhone) if err != nil { logx.Errorf("insert User Position Model Model err, err=%v", err) return -1, err } id, err := res.LastInsertId() if err != nil { logx.Errorf("insert User Model to Id parse id err,err=%v", err) return -1, err } return id, nil } func (um *UserModel) FindOne(uid int64) (*User, error) { var user User // query const querysql = `select `+userBuilderQueryRows+` from `+um.table+` where id=? limit 1` err := um.conn.QueryRow(&amp;user, querysql, uid) if err != nil { logx.Errorf("userModile.findOne error ,id=%d,err=%s", uid, err.Error()) if err == sqlx.ErrNotFound { return nil, ErrNotFound } return nil, err } return &amp;user, nil } insert/update/delete:conn.Exec(insertsql/updatesql/deletesql, args...) query:conn.QueryRow(&amp;model, querysql, args...) 上述就是最简单的 crud 的结构:首先是构建 model ,然后操作 model 进行操作。 代码结构 文件名 作用 bulkinserter.go 批量插入 mysql.go NewMysql orm.go 解析,序列化model的操作 sqlconn.go 抽象crud操作的接口 tx.go 事务操作 从 sqlconn.go 的相互接口关系: 可以看出:commonSqlConn 和 txSession 是真正实现的地方。先从 API 的功能整体介绍一下: API 参数 作用 Exec(query, args...) sql, sql参数 insert/update/delete Prepare(query) sql 预编译sql QueryRow(&model, query, args...) model, sql, sql参数 查询一行数据同时赋值给「model」 QueryRowPartial(&model, query, args...) model, sql, sql参数 功能同上,但是select sql可以只选取model的部分column「映衬Partial」 QueryRows/QueryRowsPartial 同上 查询多行API Transact(func(session Session) error) 事务操作 将参数中的操作用事务包裹,开发者只需专注参数中的函数编写 总结 go-zero 的 sqlx 屏蔽了go原生的sql操作,开发者只需关注sql编写和业务封装的数据对象,不需要像原生开发中需要手动prepare,赋值数据时Scan。 本节只是简略介绍了接口的相互关系以及开发者平时关注的API,下节将着重分析go-zero是怎么帮你赋值数据,同时在并发大的情况下,如何不让流量直接把你的数据库打死。 参考 go-zero sqlx Go database/sql tutorial 欢迎大家使用 go-zero 项目地址: https://github.com/tal-tech/go-zero https://gitee.com/kevwan/go-zero 如果觉得文章不错,欢迎 github 点个 star 🤝

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册