c# mysql、sqlserver、Oracle、pg批量插入

1、c#对多种数据库批量插入封装,方便调用;

MySql社区驱动MySqlConnector提供的批量插入方式是SqlBulkCopy,基于MySql自身的文件上传机制进行批量插入,参数为一个dataTable对象,原生的批量插入代码如下,计时方式与SqlServer相同,同时,MySql的连接字符串里要添加";AllowLoadLocalInfile=true",即连接字符串的形式应该是"Server= ;Database=;User ID=;Password=;AllowLoadLocalInfile=true",同时在MySql数据库上执行"set global local_infile=1"开启批量上传

 /// <summary>
        /// MySqlBulkInsert
        /// </summary>
        /// <typeparam name="T">插入的表对应的model</typeparam>
        /// <param name="list">插入的数据</param>
        /// <param name="tableName">泛型中无法获取到表,直接传表名称</param>
        /// <returns></returns>
        private bool MySqlBulkInsert<T>(IEnumerable<T> list, string tableName = "") where T : class
        {
            var connectionString = MSEApplication.GetConfigValue("ConnectionStrings:BulkConn");
            using (var conn = new MySqlConnection(connectionString))
            {
                try
                {
                    var tableEntity = DataCommonUtil.GetTableEntity<T>();
                    if (!string.IsNullOrWhiteSpace(tableName))
                        tableEntity.TableName = tableName;
                    MySqlBulkCopy sqlBulkCopy = new MySqlBulkCopy(conn, null);
                    sqlBulkCopy.DestinationTableName = tableEntity.TableName;
                    var dataTable = list.ToDataTable();

                    int i = 0;
                    foreach (DataColumn dataColumn in dataTable.Columns)
                    {
                        sqlBulkCopy.ColumnMappings.Add(new MySqlBulkCopyColumnMapping(i, dataColumn.ColumnName));
                        i = i + 1;
                    }

                    conn.Open();
                    var bulkCopyResult = sqlBulkCopy.WriteToServer(dataTable);
                    if (bulkCopyResult.RowsInserted == list.Count())
                        return true;
                    else
                        return false;
                }
                catch (Exception ex)
                {
                    conn.Close();
                    conn.Dispose();
                    return false;
                }
                finally
                {
                    conn.Close();
                    conn.Dispose();
                }
            }
        }

SqlServer官方提供的批量插入方式是SqlBulkCopy。

 /// <summary>
        /// SqlServerBulkInsert
        /// </summary>
        /// <typeparam name="T">插入的表对应的model</typeparam>
        /// <param name="list">插入的数据</param>
        /// <param name="tableName">泛型中无法获取到表,直接传表名称</param>
        /// <returns></returns>
        private bool SqlServerBulkInsert<T>(IEnumerable<T> list, string tableName = "") where T : class
        {
            var connectionString = MSEApplication.GetConfigValue("ConnectionStrings:BulkConn");
            using (var conn = new SqlConnection(connectionString))
            {
                try
                {
                    var tableEntity = DataCommonUtil.GetTableEntity<T>();
                    if (!string.IsNullOrWhiteSpace(tableName))
                        tableEntity.TableName = tableName;
                    SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.KeepIdentity, null);
                    sqlBulkCopy.DestinationTableName = tableEntity.TableName;
                    sqlBulkCopy.BatchSize = 20000;
                    var dataTable = list.ToDataTable();

                    foreach (DataColumn dataColumn in dataTable.Columns)
                    {
                        sqlBulkCopy.ColumnMappings.Add(dataColumn.ColumnName, dataColumn.ColumnName);
                    }
                    conn.Open();
                    sqlBulkCopy.WriteToServer(dataTable);
                    return true;
                }
                catch (Exception ex)
                {
                    conn.Close();
                    conn.Dispose();
                    return false;
                }
                finally
                {
                    conn.Close();
                    conn.Dispose();
                }
            }
        }
/// <summary>
        /// OracleBulkInsert
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <param name="tableName">泛型中无法获取到表,直接传表名称</param>
        /// <returns></returns>
        private bool OracleBulkInsert<T>(IEnumerable<T> list, string tableName = "") where T : class
        {
            var connectionString = MSEApplication.GetConfigValue("ConnectionStrings:BulkConn");
            using (var conn = new OracleConnection(connectionString))
            {
                using (var adapter = new OracleDataAdapter())
                {
                    var tableEntity = DataCommonUtil.GetTableEntity<T>();
                    if (!string.IsNullOrWhiteSpace(tableName))
                        tableEntity.TableName = tableName;
                    var dataTable = list.ToDataTable();
                    adapter.InsertCommand = new OracleCommand();
                    adapter.InsertCommand.CommandText = $"INSERT INTO {tableEntity.TableName} ({string.Join(",", dataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName))})" +
                        $" VALUES ({string.Join(",", dataTable.Columns.Cast<DataColumn>().Select(c => ":" + c.ColumnName))})";
                    adapter.InsertCommand.Connection = conn;
                    foreach (DataColumn column in dataTable.Columns)
                    {
                        adapter.InsertCommand.Parameters.Add($":{column.ColumnName}", column.DataType.ConvertToOracleDbType(), column.MaxLength, column.ColumnName);
                    }
                    adapter.UpdateBatchSize = 20000;
                    conn.Open();
                    using (var transaction = conn.BeginTransaction())
                    {
                        try
                        {
                            adapter.InsertCommand.Transaction = transaction;
                            adapter.Update(dataTable);
                            transaction.Commit();
                            return true;
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            conn.Close();
                            conn.Dispose();
                            return false;
                        }
                        finally
                        {
                            conn.Close();
                            conn.Dispose();
                        }
                    }
                }
            }
        }

 /// <summary>
        /// PostgresqlBulkInsert
        /// </summary>
        /// <typeparam name="T">插入的表对应的model</typeparam>
        /// <param name="list">插入的数据</param>
        /// <param name="tableName">泛型中无法获取到表,直接传表名称</param>
        /// <returns></returns>

        private bool PostgresqlBulkInsert<T>(IEnumerable<T> list, string tableName = "") where T : class
        {
            var connectionString = MSEApplication.GetConfigValue("ConnectionStrings:BulkConn");
            using (var conn = new NpgsqlConnection(connectionString))
            {
                conn.Open();
                try
                {
                    var tableEntity = DataCommonUtil.GetTableEntity<T>();
                    if (!string.IsNullOrWhiteSpace(tableName))
                        tableEntity.TableName = tableName;
                    PropertyInfo[] properties = typeof(T).GetProperties();
                    string[] propertyNames = properties.Select(pro => pro.Name).ToArray();
                    string joinedPropertyNames = string.Join(", ", propertyNames);
                    //缓存属性值访问器
                    Func<T, object>[] propertyValue = properties.Select(pro => (Func<T, object>)pro.GetValue).ToArray();
                    using (var writer = conn.BeginBinaryImport($"COPY {tableEntity.TableName} ({joinedPropertyNames}) FROM STDIN BINARY"))
                    {
                        foreach (var item in list)
                        {
                            writer.StartRow();
                            foreach (var valueAccessor in propertyValue)
                            {
                                var fieldValue = valueAccessor(item);
                                // 处理 null 值
                                fieldValue = fieldValue ?? DBNull.Value;
                                if (fieldValue == null)
                                {
                                    writer.WriteNull();
                                }
                                else
                                {
                                    writer.Write(fieldValue);
                                }
                            }
                        }
                        writer.Complete();
                    }
                    return true;
                }
                catch (Exception ex)
                {
                    conn.Close();
                    conn.Dispose();
                    return false;
                }
                finally
                {
                    conn.Close();
                    conn.Dispose();
                }
            }
        }
 public static partial class BulkUtil
    {

        /// <summary>
        /// 判断一个类型是否为可空类型
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="o"></param>
        /// <returns></returns>
        public static bool IsNullable<T>(this T o)
        {
            var type = typeof(T);
            return type.IsNullable();
        }

        /// <summary>
        /// 判断一个类型是否为可空类型
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="type"></param>
        /// <returns></returns>
        public static bool IsNullable(this Type type)
        {
            return Nullable.GetUnderlyingType(type) != null;
        }
        /// <summary>
        /// 判断type是否为集合类型
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static bool IsCollection(this Type type)
        {
            return type.GetInterfaces().Any(it => it == typeof(ICollection));
        }

        /// <summary>
        /// 判断type是否为迭代器类型
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static bool IsEnumerable(this Type type)
        {
            return type.GetInterfaces().Any(it => it == typeof(IEnumerable));
        }

        /// <summary>
        /// 判断type是否为查询器类型
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static bool IsQueryable(this Type type)
        {
            return type.GetInterfaces().Any(it => it == typeof(IQueryable));
        }

        /// <summary>
        /// 判断type是否为字符串类型
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static bool IsString(this Type type)
        {
            return type == typeof(string);
        }

        /// <summary>
        /// 判断type是否为支持async的类型
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static bool IsAsyncType(this Type type)
        {
            var awaiter = type.GetMethod("GetAwaiter");
            if (awaiter == null)
                return false;
            var retType = awaiter.ReturnType;
            //.NET Core 1.1及以下版本中没有 GetInterface 方法,为了兼容性使用 GetInterfaces
            if (retType.GetInterfaces().All(i => i.Name != "INotifyCompletion"))
                return false;
            if (retType.GetProperty("IsCompleted") == null)
                return false;
            if (retType.GetMethod("GetResult") == null)
                return false;

            return true;
        }

        /// <summary>
        /// 根据type 生成实例类型
        /// </summary>
        /// <param name="type"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public static object CreateInstance(this Type type, object[] args)
        {
            if (args == null || args.Length == 0)
            {
                return Activator.CreateInstance(type);
            }

            return Activator.CreateInstance(type, args: args);
        }

        /// <summary>
        /// 获得基础类型,获得比如被Task,ICollection<>,IEnumable<>,IQueryable<>等包裹的类型
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static Type GetUnderlyingType(this Type type)
        {
            var resultTmp = type.IsAsyncType() ? type.GenericTypeArguments.First() : type;
            var resultTmp2 = resultTmp.IsGenericType
                ? resultTmp.GetGenericArguments().First()
                : resultTmp;

            return resultTmp2;
        }

        /// <summary>
        /// 根据类名获得Type实例
        /// </summary>
        /// <param name="typeName"></param>
        /// <returns></returns>
        public static Type LoadTypeByName(string typeName)
        {
            if (typeName.IsNullOrWhiteSpace()) throw new Exception("typeName must be not empty");
            Type t = Type.GetType(typeName);
            if (t != null) System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(t.TypeHandle);
            return t;
        }

        /// <summary>
        /// 获取某个类的默认值
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static object GetDefaultValue(this Type type)
        {
            return type.IsValueType ? Activator.CreateInstance(type) : null;
        }

        /// <summary>
        /// 判断是否为字典类型
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static bool IsDictionary(this Type type)
        {
            return type.GetInterfaces().Any(it => it == typeof(IDictionary));
        }

        /// <summary>
        /// 通过表达式树获取实体类的属性值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="model"></param>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public static TResult GetPropertyValue<T, TResult>(this T model, string propertyName)
        {
            var result = GetPropertyValue(model, propertyName);
            return (TResult)result;
        }

        public static ConcurrentDictionary<string, object> CacheDictionary = new ConcurrentDictionary<string, object>();
        public static ConcurrentDictionary<string, Delegate> CacheDelegateDictionary = new ConcurrentDictionary<string, Delegate>();
        /// <summary>
        /// 通过表达式树获取实体类的属性值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="model"></param>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public static object GetPropertyValue<T>(this T model, string propertyName)
        {
            var type = model.GetType();
            var property = type.GetProperty(propertyName);
            if (property == null)
            {
                throw new ArgumentNullException($"could not find property with name {propertyName}");
            }

            var key = "get:" + type.FullName + property.Name;
            if (CacheDictionary.TryGetValue(key, out var func))
            {
                return ((Delegate)func).DynamicInvoke(model);
            }

            var modelExpression = Expression.Parameter(type, "model");
            var propertyExpression = Expression.Property(modelExpression, property);
            var convertExpression = Expression.Convert(propertyExpression, typeof(object));
            var lambda = Expression.Lambda(convertExpression, modelExpression).Compile();
            var result = lambda.DynamicInvoke(model);
            CacheDictionary.TryAdd(key, lambda);
            return result;
        }

        /// <summary>
        /// 通过表达式树设置实体类的属性值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="model"></param>
        /// <param name="propertyName"></param>
        /// <param name="value"></param>
        /// <exception cref="ArgumentNullException"></exception>
        public static void SetPropertyValue<T>(this T model, string propertyName, object value)
        {
            var type = model.GetType();
            var property = type.GetProperty(propertyName);

            if (property == null)
            {
                throw new ArgumentNullException($"could not find property with name {propertyName}");
            }

            var key = "set:" + type.FullName + property.Name;
            if (CacheDictionary.TryGetValue(key, out var func))
            {
                ((Delegate)func).DynamicInvoke(model, value);
            }

            var modelExpression = Expression.Parameter(type, "model");
            var propertyExpression = Expression.Parameter(typeof(object), "val");
            var convertExpression = Expression.Convert(propertyExpression, property.PropertyType);
            var methodCallExpression = Expression.Call(modelExpression, property.GetSetMethod(), convertExpression);
            var lambda = Expression.Lambda(methodCallExpression, modelExpression, propertyExpression).Compile();
            CacheDictionary.TryAdd(key, lambda);
            lambda.DynamicInvoke(model, value);
        }

        /// <summary>
        /// 构建一个object数据转换成一维数组数据的委托
        /// </summary>
        /// <param name="objType"></param>
        /// <param name="propertyInfos"></param>
        /// <returns></returns>
        public static Func<T, object[]> BuildObjectGetValuesDelegate<T>(List<PropertyInfo> propertyInfos) where T : class
        {
            var objParameter = Expression.Parameter(typeof(T), "model");
            var selectExpressions = propertyInfos.Select(it => BuildObjectGetValueExpression(objParameter, it));
            var arrayExpression = Expression.NewArrayInit(typeof(object), selectExpressions);
            var result = Expression.Lambda<Func<T, object[]>>(arrayExpression, objParameter).Compile();
            return result;
        }


        /// <summary>
        /// 构建对象获取单个值得
        /// </summary>
        /// <param name="modelExpression"></param>
        /// <param name="propertyInfo"></param>
        /// <returns></returns>
        public static Expression BuildObjectGetValueExpression(ParameterExpression modelExpression, PropertyInfo propertyInfo)
        {
            var propertyExpression = Expression.Property(modelExpression, propertyInfo);
            var convertExpression = Expression.Convert(propertyExpression, typeof(object));
            return convertExpression;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="source"></param>
        /// <param name="propertyInfos"></param>
        /// <param name="useColumnAttribute"></param>
        /// <returns></returns>
        public static DataTable ToDataTable<T>(this IEnumerable<T> source, List<PropertyInfo> propertyInfos = null, bool useColumnAttribute = false) where T : class
        {
            var table = new DataTable("template");
            if (propertyInfos == null || propertyInfos.Count == 0)
            {
                propertyInfos = typeof(T).GetProperties().Where(it => it.CanRead).ToList();
            }
            foreach (var propertyInfo in propertyInfos)
            {
                var columnName = useColumnAttribute ? (propertyInfo.GetCustomAttribute<ColumnAttribute>()?.Name ?? propertyInfo.Name) : propertyInfo.Name;
                table.Columns.Add(columnName, ChangeType(propertyInfo.PropertyType));
            }

            Func<T, object[]> func;
            var key = typeof(T).FullName + propertyInfos.Select(it => it.Name).ToList().StringJoin();
            if (CacheDictionary.TryGetValue(key, out var cacheFunc))
            {
                func = (Func<T, object[]>)cacheFunc;
            }
            else
            {
                func = BuildObjectGetValuesDelegate<T>(propertyInfos);
                CacheDictionary.TryAdd(key, func);
            }

            foreach (var model in source)
            {
                var rowData = func(model);
                table.Rows.Add(rowData);
            }

            return table;
        }

        private static Type ChangeType(Type type)
        {
            if (type.IsNullable())
            {
                type = Nullable.GetUnderlyingType(type);
            }

            return type;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="constructorInfo"></param>
        /// <returns></returns>
        public static Delegate BuildGenerateObjectDelegate(ConstructorInfo constructorInfo)
        {
            var parameterExpressions = new List<ParameterExpression>();
            foreach (var parameterInfo in constructorInfo.GetParameters())
            {
                var parameterExpression = Expression.Parameter(parameterInfo.ParameterType);
                parameterExpressions.Add(parameterExpression);
            }
            var c = Expression.New(constructorInfo, parameterExpressions);
            var lambda = Expression.Lambda(c, parameterExpressions).Compile();
            return lambda;
        }

        /// <summary>
        /// 替换dataTable里的列类型
        /// </summary>
        /// <param name="dt"></param>
        public static void ReplaceDataTableColumnType<OldType, NewType>(DataTable dt, Func<OldType, NewType> replaceFunc)
        {
            var needUpdateColumnIndexList = new List<int>();
            var needUpdateColumnNameList = new List<string>();

            for (int i = 0; i < dt.Columns.Count; i++)
            {
                var column = dt.Columns[i];
                if (column.DataType.GetUnderlyingType() == typeof(OldType))
                {
                    needUpdateColumnIndexList.Add(i);
                    needUpdateColumnNameList.Add(column.ColumnName);

                }
            }

            if (needUpdateColumnIndexList.Count == 0)
            {
                return;
            }

            var nameMapping = new Dictionary<string, string>();
            for (int i = 0; i < needUpdateColumnIndexList.Count; i++)
            {
                var oldColumnName = needUpdateColumnNameList[i];
                var newColumnName = Guid.NewGuid().ToString("N");
                nameMapping.Add(newColumnName, oldColumnName);

                dt.Columns.Add(newColumnName, typeof(byte[])).SetOrdinal(needUpdateColumnIndexList[i]);
                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    var c = (dt.Rows[j][oldColumnName]);
                    dt.Rows[j][newColumnName] = replaceFunc((OldType)(dt.Rows[j][oldColumnName]));
                }
                dt.Columns.Remove(oldColumnName);
            }

            for (int i = 0; i < dt.Columns.Count; i++)
            {
                var columnName = dt.Columns[i].ColumnName;
                if (nameMapping.ContainsKey(columnName))
                {
                    dt.Columns[i].ColumnName = nameMapping[columnName];
                }
            }

        }

        /// <summary>
        /// 判断字符串是否为空
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static bool IsNullOrWhiteSpace(this string str)
        {
            return string.IsNullOrWhiteSpace(str);
        }

        /// <summary>
        /// 对字符串集合进行拼接
        /// </summary>
        /// <param name="source"></param>
        /// <param name="separator"></param>
        /// <returns></returns>
        public static string StringJoin(this IEnumerable<string> source, char separator = ',')
        {
            return string.Join(separator, source);
        }

        public static OracleDbType ConvertToOracleDbType(this Type type)
        {
            switch (Type.GetTypeCode(type))
            {
                case TypeCode.Boolean:
                    return OracleDbType.Boolean;
                case TypeCode.Byte:
                case TypeCode.SByte:
                    return OracleDbType.Byte;
                case TypeCode.Int16:
                case TypeCode.UInt16:
                    return OracleDbType.Int16;
                case TypeCode.Int32:
                case TypeCode.UInt32:
                    return OracleDbType.Int32;
                case TypeCode.Int64:
                case TypeCode.UInt64:
                    return OracleDbType.Int64;
                case TypeCode.Single:
                    return OracleDbType.Single;
                case TypeCode.Double:
                    return OracleDbType.Double;
                case TypeCode.Decimal:
                    return OracleDbType.Decimal;
                case TypeCode.String:
                    return OracleDbType.NVarchar2;
                case TypeCode.Char:
                    return OracleDbType.Char;
                case TypeCode.DateTime:
                    return OracleDbType.Date;
                case TypeCode.Object:
                    if (type == typeof(Guid))
                    {
                        return OracleDbType.Raw;
                    }
                    else if (type == typeof(byte[]))
                    {
                        return OracleDbType.Blob;
                    }
                    else if (type == typeof(TimeSpan))
                    {
                        return OracleDbType.IntervalDS;
                    }
                    else if (type == typeof(OracleClob))
                    {
                        return OracleDbType.Clob;
                    }
                    else if (type == typeof(OracleBlob))
                    {
                        return OracleDbType.Blob;
                    }
                    else if (type == typeof(OracleXmlType))
                    {
                        return OracleDbType.XmlType;
                    }
                    else if (type == typeof(OracleRefCursor))
                    {
                        return OracleDbType.RefCursor;
                    }
                    else if (type == typeof(OracleTimeStamp))
                    {
                        return OracleDbType.TimeStamp;
                    }
                    else if (type == typeof(OracleIntervalYM))
                    {
                        return OracleDbType.IntervalYM;
                    }
                    else if (type == typeof(OracleIntervalDS))
                    {
                        return OracleDbType.IntervalDS;
                    }
                    else if (type == typeof(OracleCollectionType))
                    {
                        return OracleDbType.Object;
                    }
                    else
                    {
                        return OracleDbType.Varchar2;
                    }
                default:
                    return OracleDbType.Varchar2;
            }
        }

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter应用开发-几种保存简单配置的方式

文章目录 简单配置保存的几种方式使用 shared_preferences 插件优点缺点 使用 hive 插件优点 缺点使用文件存储&#xff1a;优点缺点 简单配置保存的几种方式 在 Flutter 开发的 Android 应用中&#xff0c;保存应用配置并下次启动时读取&#xff0c;有以下几种比较合适的方式…

rust疑难杂症解决

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

Docker | 入门:安装与配置

Docker | 入门&#xff1a;安装与配置 Docker 和传统虚拟机区别 对于传统虚拟机&#xff1a; 虚拟出一套硬件&#xff0c;运行一个完整的操作系统&#xff0c;并在这个操作系统上安装和运行软件。 对于 Docker: 将一个个容器隔离开。 容器内的应用直接运行在宿主机的内容&am…

软件模型(简洁明了)

《 软件测试基础持续更新中》 一、软件开发模型 1.1 大爆炸模型 优点&#xff1a;思路简单&#xff0c; 通常可能是开发者的“突发奇 想” 缺点&#xff1a;开发过程是非工程化的&#xff0c;随意性大&#xff0c;结果不可预知 测试&#xff1a;开发任务完成后&#xff0c;…

一个自卑的人怎么变得自信

一个自卑的人怎么变得自信 自卑感是一种常见的心理状态&#xff0c;它可能源于个人对自己能力、外貌、价值等方面的负面评价。自卑感不仅会影响一个人的情绪状态&#xff0c;还可能阻碍其在生活、学习和工作中的表现。然而&#xff0c;自信并非一蹴而就的品质&#xff0c;它需要…

基础款:Dockerfile 文件

# bash复制代码# 使用 Node.js 16 作为基础镜像 # 指定一个已经存在的镜像作为模版&#xff0c;第一条必须是from FROM node:16# 将当前工作目录设置为/app # WORKDIR /app# 方法一&#xff1a;用dockerfile命令&#xff1a;进行下载打包文件 # 将 package.json 和 package-loc…

MySQL 之 主从复制

1. 主配置文件&#xff08;win下是my.ini&#xff0c;linux下是my.cnf&#xff09; #mysql 服务ID,保证整个集群环境中唯一 server-id1 #mysql binlog 日志的存储路径和文件名 log-bin/var/lib/mysql/mysqlbin #错误日志,默认已经开启 #log-err #mysql的安装目录 #basedir #mys…

Linux软件包管理器——yum

文章目录 1.什么是软件包1.1安装与删除命令1.2注意事项1.3查看软件包1.3.1注意事项&#xff1a; 2.关于rzsz3.有趣的Linux下的指令 -sl 1.什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一…

穷人想要改命,是选择打工还是创业? 2024创业项目小成本!2024轻资产创业!2024风口行业!2024普通人做什么行业赚钱?

今日话题穷人想要改命&#xff0c;是选择打工还是创业&#xff1f; 改命的方式就是跳进水里&#xff0c;忍受呛水&#xff0c;学会游泳&#xff0c;这个过程越年轻实现越好&#xff0c;就像小鹰往山崖下跳&#xff0c;要么学会飞&#xff0c;要么就狠狠的被摔死。打工思维和创…

用vue3实现留言板功能

效果图&#xff1a; 代码&#xff1a; <script setup lang"ts"> import { ref } from vue;interface Message {name: string;phone: string;message: string; }const name ref<string>(); const phone ref<string>(); const message ref<st…

基于YOLOV5和DeepOCSort的实时目标检测跟踪检测系统

项目简介 本项目旨在研究由YOLOV5模型在多目标检测任务重的应用。通过设计YOLOV5模型及DeepOCSORT模型来实现多物体检测、追踪&#xff0c;最终达高实时性、高精度的物件检测、分割、追踪的效果。最后通过AX620A完成嵌入式硬件部署 项目研究背景 近年来&#xff0c;近年来&am…

【Linux】fork函数详解and写时拷贝再理解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

茶叶直播间电商运营带货方案营销计划书

【干货资料持续更新&#xff0c;建议先关注&#xff0c;以防走丢】 茶叶直播间电商运营带货方案营销计划书 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 直播带货方案细化 1. 直播筹划 - 目标…

基于SSM+Jsp+Mysql的汽车租赁系统的设计与实现

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

OpenHarmony实战开发-如何实现单一手势

点击手势&#xff08;TapGesture&#xff09; TapGesture(value?:{count?:number; fingers?:number})点击手势支持单次点击和多次点击&#xff0c;拥有两个可选参数&#xff1a; count&#xff1a;声明该点击手势识别的连续点击次数。默认值为1&#xff0c;若设置小于1的非…

poi-tl自定义渲染策略学习

文章目录 实现逻辑参考代码注意点 实现逻辑 自定义渲染策略实现逻辑&#xff1a; 找到模板中的表格标签render方法接收java中对应模板表格标签的所有list数据执行自定义渲染逻辑 参考代码 word模板如下&#xff1a; 实体类&#xff1a; Data public class GksxRowData {/…

结构体枚举、联合、位段

枚举 枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中&#xff1a; 一周的星期一到星期日是有限的7天&#xff0c;可以一一列举。 性别有&#xff1a;男、女、保密&#xff0c;也可以一一列举。 月份有12个月&#xff0c;也可以一一列举 这里就可以使…

Shader for Quest 2: 自定义shader在Unity Editor中可以使用,但是在Quest 2中却不可以

GameObject segment GameObject.Find("DisplayArea_" i); MeshRenderer renderer segment.GetComponent<MeshRenderer>(); Material mat new Material(Shader.Find("Custom/MyShader")); mat.mainTexture option.Image360;上面这份代码&#x…

低代码开发之腾讯云微搭工具

低代码开发之腾讯云微搭工具 微搭简介诞生缘由开发模式如何创建组件模块介绍实例讲解url传参级联联动使用事件其他方法调用数据源方法 callDataSource触发流程 callProcess 引入外部css/js代码编辑器的使用Handler 方法使用介绍Style 用法示例LifeCycle 生命周期介绍 数据模型方…

【1471】java项目进度管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 项目进度管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…