C# 扩展方法——mysql-dapper(MySqlMapperExtensions)
其他扩展方法详见:https://www.cnblogs.com/zhuanjiao/p/12060937.html
反射比较耗费性能,反射得到属性进行缓存
根据反射得到的属性,进行动态拼接sql语句
说明:未找到原文链接,未加出处。
下面篇幅我只加了一个扩展方法。
using Dapper; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Dynamic; using System.Linq; using System.Reflection; using System.Threading.Tasks; namespace CoSubject.Common.DapperExtensions { public static class MySqlMapperExtensions { private static readonly ConcurrentDictionary<Type, List<PropertyInfo>> _paramCache = new ConcurrentDictionary<Type, List<PropertyInfo>>(); /// <summary> /// Insert data into table. /// </summary> /// <param name="connection"></param> /// <param name="data"></param> /// <param name="table"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static int Insert(this IDbConnection connection, dynamic data, string table, IDbTransaction transaction = null, int? commandTimeout = null) { var obj = data as object; var properties = GetProperties(obj); var columns = string.Join(",", properties.Select(p => table + "." + p)); var values = string.Join(",", properties.Select(p => "@" + p)); var sql = string.Format("insert into {0} ({1}) values ({2})", table, columns, values); return connection.Execute(sql, obj, transaction, commandTimeout); } public static int InsertWithOutPrimaryKey(this IDbConnection connection, dynamic data, string table, string primaryKey, IDbTransaction transaction = null, int? commandTimeout = null) { var obj = data as object; var properties = GetProperties(obj); properties.Remove(primaryKey); var columns = string.Join(",", properties.Select(p => table + "." + p)); var values = string.Join(",", properties.Select(p => "@" + p)); var sql = string.Format("insert into {0} ({1}) values ({2})", table, columns, values); return connection.Execute(sql, obj, transaction, commandTimeout); } /// <summary> /// Insert data async into table. /// </summary> /// <param name="connection"></param> /// <param name="data"></param> /// <param name="table"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static Task<int> InsertAsync(this IDbConnection connection, dynamic data, string table, IDbTransaction transaction = null, int? commandTimeout = null) { var obj = data as object; var properties = GetProperties(obj); var columns = string.Join(",", properties); var values = string.Join(",", properties.Select(p => "@" + p)); var sql = string.Format("insert into {0} ({1}) values ({2}))", table, columns, values); return connection.ExecuteAsync(sql, obj, transaction, commandTimeout); } /// <summary> /// Updata data for table with a specified condition. /// </summary> /// <param name="connection"></param> /// <param name="data"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static int Update(this IDbConnection connection, dynamic data, dynamic condition, string table, IDbTransaction transaction = null, int? commandTimeout = null) { var obj = data as object; var conditionObj = condition as object; var updatePropertyInfos = GetPropertyInfos(obj); var wherePropertyInfos = GetPropertyInfos(conditionObj); var updateProperties = updatePropertyInfos.Select(p => p.Name); var whereProperties = wherePropertyInfos.Select(p => p.Name); var updateFields = string.Join(",", updateProperties.Select(p => p + " = @" + p)); var whereFields = string.Empty; if (whereProperties.Any()) { whereFields = " where " + string.Join(" and ", whereProperties.Select(p => p + " = @w_" + p)); } var sql = string.Format("update {0} set {1}{2}", table, updateFields, whereFields); var parameters = new DynamicParameters(data); var expandoObject = new ExpandoObject() as IDictionary<string, object>; wherePropertyInfos.ForEach(p => expandoObject.Add("w_" + p.Name, p.GetValue(conditionObj, null))); parameters.AddDynamicParams(expandoObject); return connection.Execute(sql, parameters, transaction, commandTimeout); } /// <summary> /// 更新自定义列数据 /// </summary> /// <param name="connection"></param> /// <param name="data"></param> /// <param name="updateColumns">自定义列名</param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static int Update(this IDbConnection connection, dynamic data, dynamic condition, string table, List<string> updateColumns, IDbTransaction transaction = null, int? commandTimeout = null) { if (updateColumns == null || updateColumns.Count == 0) throw new ArgumentException("updateColumns 必须设定要更新的列!", "updateColumns"); var obj = data as object; var conditionObj = condition as object; var updatePropertyInfos = GetPropertyInfos(obj); var wherePropertyInfos = GetPropertyInfos(conditionObj); var updateProperties = updatePropertyInfos.Select(p => p.Name).Intersect(updateColumns); var whereProperties = wherePropertyInfos.Select(p => p.Name); var updateFields = string.Join(",", updateProperties.Select(p => p + " = @" + p)); var whereFields = string.Empty; if (whereProperties.Any()) { whereFields = " where " + string.Join(" and ", whereProperties.Select(p => p + " = @w_" + p)); } var sql = string.Format("update {0} set {1}{2}", table, updateFields, whereFields); var parameters = new DynamicParameters(data); var expandoObject = new ExpandoObject() as IDictionary<string, object>; wherePropertyInfos.ForEach(p => expandoObject.Add("w_" + p.Name, p.GetValue(conditionObj, null))); parameters.AddDynamicParams(expandoObject); return connection.Execute(sql, parameters, transaction, commandTimeout); } public static int UpdateWithColumns(this IDbConnection connection, dynamic data, object condition, string table, List<string> updateColumns, IDbTransaction transaction = null, int? commandTimeout = null) { if (updateColumns == null || updateColumns.Count == 0) throw new ArgumentException("updateColumns 必须设定要更新的列!", "updateColumns"); var obj = data as object; var conditionObj = condition as object; var updatePropertyInfos = GetPropertyInfos(obj); var wherePropertyInfos = GetPropertyInfos(conditionObj); var updateProperties = updatePropertyInfos.Select(p => p.Name).Intersect(updateColumns); var whereProperties = wherePropertyInfos.Select(p => p.Name); var updateFields = string.Join(",", updateProperties.Select(p => p + " = @" + p)); var whereFields = string.Empty; if (whereProperties.Any()) { whereFields = " where " + string.Join(" and ", whereProperties.Select(p => p + " = @w_" + p)); } var sql = string.Format("update {0} set {1}{2}", table, updateFields, whereFields); var parameters = new DynamicParameters(data); var expandoObject = new ExpandoObject() as IDictionary<string, object>; wherePropertyInfos.ForEach(p => expandoObject.Add("w_" + p.Name, p.GetValue(conditionObj, null))); parameters.AddDynamicParams(expandoObject); return connection.Execute(sql, parameters, transaction, commandTimeout); } /// <summary> /// Updata data async for table with a specified condition. /// </summary> /// <param name="connection"></param> /// <param name="data"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static Task<int> UpdateAsync(this IDbConnection connection, dynamic data, dynamic condition, string table, IDbTransaction transaction = null, int? commandTimeout = null) { var obj = data as object; var conditionObj = condition as object; var updatePropertyInfos = GetPropertyInfos(obj); var wherePropertyInfos = GetPropertyInfos(conditionObj); var updateProperties = updatePropertyInfos.Select(p => p.Name); var whereProperties = wherePropertyInfos.Select(p => p.Name); var updateFields = string.Join(",", updateProperties.Select(p => p + " = @" + p)); var whereFields = string.Empty; if (whereProperties.Any()) { whereFields = " where " + string.Join(" and ", whereProperties.Select(p => p + " = @w_" + p)); } var sql = string.Format("update {0} set {1}{2}", table, updateFields, whereFields); var parameters = new DynamicParameters(data); var expandoObject = new ExpandoObject() as IDictionary<string, object>; wherePropertyInfos.ForEach(p => expandoObject.Add("w_" + p.Name, p.GetValue(conditionObj, null))); parameters.AddDynamicParams(expandoObject); return connection.ExecuteAsync(sql, parameters, transaction, commandTimeout); } /// <summary> /// Delete data from table with a specified condition. /// </summary> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static int Delete(this IDbConnection connection, dynamic condition, string table, IDbTransaction transaction = null, int? commandTimeout = null) { var conditionObj = condition as object; var whereFields = string.Empty; var whereProperties = GetProperties(conditionObj); if (whereProperties.Count > 0) { whereFields = " where " + string.Join(" and ", whereProperties.Select(p => p + " = @" + p)); } var sql = string.Format("delete from {0}{1}", table, whereFields); return connection.Execute(sql, conditionObj, transaction, commandTimeout); } /// <summary> /// Delete data async from table with a specified condition. /// </summary> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static Task<int> DeleteAsync(this IDbConnection connection, dynamic condition, string table, IDbTransaction transaction = null, int? commandTimeout = null) { var conditionObj = condition as object; var whereFields = string.Empty; var whereProperties = GetProperties(conditionObj); if (whereProperties.Count > 0) { whereFields = " where " + string.Join(" and ", whereProperties.Select(p => p + " = @" + p)); } var sql = string.Format("delete from {0}{1}", table, whereFields); return connection.ExecuteAsync(sql, conditionObj, transaction, commandTimeout); } /// <summary> /// Get data count from table with a specified condition. /// </summary> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static int GetCount(this IDbConnection connection, object condition, string table, bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { return QueryList<int>(connection, condition, table, "count(1)", isOr, transaction, commandTimeout).Single(); } /// <summary> /// Get data count async from table with a specified condition. /// </summary> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static Task<int> GetCountAsync(this IDbConnection connection, object condition, string table, bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { return QueryListAsync<int>(connection, condition, table, "count(*)", isOr, transaction, commandTimeout).ContinueWith<int>(t => t.Result.Single()); } /// <summary> /// Query a list of data from table with a specified condition. /// </summary> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="columns"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static IEnumerable<dynamic> QueryList(this IDbConnection connection, dynamic condition, string table, string columns = "*", bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { return QueryList<dynamic>(connection, condition, table, columns, isOr, transaction, commandTimeout); } /// <summary> /// Query a list of data async from table with a specified condition. /// </summary> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="columns"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static Task<IEnumerable<dynamic>> QueryListAsync(this IDbConnection connection, dynamic condition, string table, string columns = "*", bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { return QueryListAsync<dynamic>(connection, condition, table, columns, isOr, transaction, commandTimeout); } /// <summary> /// Query a list of data from table with specified condition. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="columns"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static IEnumerable<T> QueryList<T>(this IDbConnection connection, object condition, string table, string columns = "*", bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { return connection.Query<T>(BuildQuerySQL(condition, table, columns, isOr), condition, transaction, true, commandTimeout); } /// <summary> /// Query a list of data async from table with specified condition. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="columns"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static Task<IEnumerable<T>> QueryListAsync<T>(this IDbConnection connection, object condition, string table, string columns = "*", bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { return connection.QueryAsync<T>(BuildQuerySQL(condition, table, columns, isOr), condition, transaction, commandTimeout); } /// <summary> /// Query paged data from a single table. /// </summary> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="orderBy"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <param name="columns"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static IEnumerable<dynamic> QueryPaged(this IDbConnection connection, dynamic condition, string table, string orderBy, int pageIndex, int pageSize, string columns = "*", bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { return QueryPaged<dynamic>(connection, condition, table, orderBy, pageIndex, pageSize, columns, isOr, transaction, commandTimeout); } /// <summary> /// Query paged data async from a single table. /// </summary> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="orderBy"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <param name="columns"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static Task<IEnumerable<dynamic>> QueryPagedAsync(this IDbConnection connection, dynamic condition, string table, string orderBy, int pageIndex, int pageSize, string columns = "*", bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { return QueryPagedAsync<dynamic>(connection, condition, table, orderBy, pageIndex, pageSize, columns, isOr, transaction, commandTimeout); } /// <summary> /// Query paged data from a single table. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="orderBy"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <param name="columns"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static IEnumerable<T> QueryPaged<T>(this IDbConnection connection, dynamic condition, string table, string orderBy, int pageIndex = 1, int pageSize = 20, string columns = "*", bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { var conditionObj = condition as object; var whereFields = string.Empty; var properties = GetProperties(conditionObj); if (properties.Count > 0) { var separator = isOr ? " OR " : " AND "; whereFields = " WHERE " + string.Join(separator, properties.Select(p => p + " = @" + p)); } var sql = string.Format("SELECT {0} FROM {2}{3} ORDER BY {1} LIMIT {4},{5} ", columns, orderBy, table, whereFields, (pageIndex - 1) * pageSize, pageSize); return connection.Query<T>(sql, conditionObj, transaction, true, commandTimeout); } /// <summary> /// Query paged data from a single table. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="orderBy"></param> /// <param name="count"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <param name="columns"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static IEnumerable<T> QueryPagedWithAllCount<T>(this IDbConnection connection, dynamic condition, string table, string orderBy, out int count, int pageIndex = 1, int pageSize = 20, string columns = "*", bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { count = 0; var conditionObj = condition as object; var whereFields = string.Empty; var properties = GetProperties(conditionObj); if (properties.Count > 0) { var separator = isOr ? " OR " : " AND "; whereFields = " WHERE " + string.Join(separator, properties.Select(p => p + " = @" + p)); } var sql = string.Format("SELECT SQL_CALC_FOUND_ROWS {0} FROM {2}{3} ORDER BY {1} LIMIT {4},{5};SELECT FOUND_ROWS();", columns, orderBy, table, whereFields, (pageIndex - 1) * pageSize, pageSize); var multi = connection.QueryMultiple(sql, conditionObj, transaction, commandTimeout); var ret = multi.Read<T>(); count = multi.ReadFirst<int>(); return ret; } /// <summary> /// Query paged data from multiple or single table and return the total number of entries /// </summary> /// <typeparam name="T"></typeparam> /// <param name="connection"></param> /// <param name="sql">拼接好的完整sql语句</param> /// <param name="condition"></param> /// <param name="count"></param> /// <param name="transaction"></param> /// <returns></returns> public static IEnumerable<T> QueryPagedBySqlWithCount<T>(this IDbConnection connection, string sql, dynamic condition, out int count, IDbTransaction transaction = null) { var conditionObj = condition as object; count = 0; // 删除原来sql中的select sql = sql.Trim().Remove(0, 6); // 去表末尾的分号 sql = sql.TrimEnd(new char[] { ';' }); sql = string.Format("SELECT SQL_CALC_FOUND_ROWS {0};SELECT FOUND_ROWS();", sql); var multi = connection.QueryMultiple(sql, conditionObj, transaction); // 需要按照顺序获取 var ret = multi.Read<T>(); count = multi.ReadFirst<int>(); return ret; } /// <summary> /// Query paged data async from a single table. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="connection"></param> /// <param name="condition"></param> /// <param name="table"></param> /// <param name="orderBy"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <param name="columns"></param> /// <param name="isOr"></param> /// <param name="transaction"></param> /// <param name="commandTimeout"></param> /// <returns></returns> public static Task<IEnumerable<T>> QueryPagedAsync<T>(this IDbConnection connection, dynamic condition, string table, string orderBy, int pageIndex, int pageSize, string columns = "*", bool isOr = false, IDbTransaction transaction = null, int? commandTimeout = null) { var conditionObj = condition as object; var whereFields = string.Empty; var properties = GetProperties(conditionObj); if (properties.Count > 0) { var separator = isOr ? " OR " : " AND "; whereFields = " WHERE " + string.Join(separator, properties.Select(p => p + " = @" + p)); } var sql = string.Format("SELECT {0} FROM {2}{3} ORDER BY {1} LIMIT {4},{5} ", columns, orderBy, table, whereFields, (pageIndex - 1) * pageSize, pageSize); return connection.QueryAsync<T>(sql, conditionObj, transaction, commandTimeout); } public static IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TReturn>(this IDbConnection cnn, string sql, Func<TFirst, TSecond, TThird, TFourth, TReturn> map, object param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) { return cnn.Query<TReturn>(sql, map, transaction); } public static string GetLastId(this IDbConnection connection) { string sql = "select last_insert_id();"; return connection.QueryFirst<string>(sql); } private static string BuildQuerySQL(dynamic condition, string table, string selectPart = "*", bool isOr = false) { var conditionObj = condition as object; var properties = GetProperties(conditionObj); if (properties.Count == 0) { return string.Format("SELECT {1} FROM {0}", table, selectPart); } var separator = isOr ? " OR " : " AND "; var wherePart = string.Join(separator, properties.Select(p => p + " = @" + p)); return string.Format("SELECT {2} FROM {0} WHERE {1}", table, wherePart, selectPart); } private static List<string> GetProperties(object obj) { if (obj == null) { return new List<string>(); } if (obj is DynamicParameters) { return (obj as DynamicParameters).ParameterNames.ToList(); } if (obj is ExpandoObject) { var expandoDic = (IDictionary<string, object>)obj; return expandoDic.Keys.ToList(); } return GetPropertyInfos(obj).Select(x => x.Name).ToList(); } private static List<PropertyInfo> GetPropertyInfos(object obj) { if (obj == null) { return new List<PropertyInfo>(); } List<PropertyInfo> properties; if (_paramCache.TryGetValue(obj.GetType(), out properties)) return properties.ToList(); properties = obj.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public).ToList(); _paramCache[obj.GetType()] = properties; return properties; } } }
C# 扩展方法——mysql-dapper(MySqlMapperExtensions)的更多相关文章
- FreeSql 扩展包实现 Dapper 的使用习惯
简介 FreeSql.Connection.Extensions 这是 FreeSql 衍生出来的扩展包,实现(Mysql/postgresql/sqlserver/Oracle/SQLite)数据库 ...
- linux php安装扩展方法 查找配置文件
如何在linux中查看nginx.apache.php.mysql配置文件路径了,如果你接收一个别人配置过的环境,但没留下相关文档.这时该怎么判断找到正确的加载文件路径了.可以通过以下来判断 1.判断 ...
- 给 string 添加一个 GetInputStream 扩展方法
有时候,我们须要读取一些数据,而无论这数据来源于磁盘上的数据文件,还是来源于网络上的数据.于是.就有了以下的 StringExtensions.cs: using System; using Syst ...
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇
最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...
- C#的扩展方法解析
在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...
- 扩展方法(C#)
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 下面的示例为String添加 ...
- 扩展方法解决LinqToSql Contains超过2100行报错问题
1.扩展方法 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...
随机推荐
- 关于虚拟机docker 启动mysql 启动成功但未挂载到端口
首先排查了防火墙和其他权限相关问题 然后检查了mysql 用户权限问题 docker logs 查看日志 正常应该是到3306 问题是我的mysql my.cnf 文件是挂在在本地.当第二次启动容器时 ...
- springboot_redis
1.引入redis的启动器 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- servlet学习之servletAPI编程常用的接口和类
ServletConfig接口: SevletConfig接口位于javax.servlet包中,它封装了servlet配置信息,在servlet初始化期间被传递.每一个Servlet都有且只有一个S ...
- Python全栈开发之3、深浅拷贝、变量和函数、递归、函数式编程、内置函数
一.深浅拷贝 1.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy # 定义变量 数字.字符串 # n1 = 123 n1 ...
- 1. centos7 的安装
选择上海时间 我们选择桌面版 选择手动配置分区 选择标准分区 修改主机名 开始安装 设置密码 设置用户名 接下来等待安装完 同样的操作再安装3台机器!!这里不多赘述. 安装完之后就重启 接下来给不同机 ...
- [转帖]浙江移动容器云在ARM服务器的实践
浙江移动容器云在ARM服务器的实践 2019-07-11 22:27 中文社区 分类:Kubernetes实践分享/开发实战 阅读(427) 评论(0) 国产ARM服务器上面跑K8S集群.. 貌似浪 ...
- mysql jdbc url
地址为jdbc:mysql://localhost:3306/mymiaosha?characterEncoding=utf-8时访问时可能会出现下图提示 地址改为jdbc:mysql://local ...
- 第一次编译ffmpeg
今天开始玩ffmpeg了. 从官网下载来的压缩包,不会编译诶,于是我开始研究起来了. 下面就是实时记录的随笔: 首先是从官网下载来的ffmpeg,就是下面这个版本,目前的最新版吧. http://ff ...
- 基于apache-commons-email1.4 邮件发送
MailUtil.java package com.lucky.base.common.util; import com.zuche.framework.utils.PropertiesReader; ...
- 如何用纯 CSS 创作一个晃动的公告板
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/wjZoGV 可交互视频教 ...