• FreeSql学习笔记——2.插入


    前言

      由于还没有表结构,就先从新增开始,插入一些数据后才好做查询、修改、删除操作。

    初始化

      前面注入FreeSql时设置过自动同步表结构,那么就不用管数据库了,只需要在项目中定义实体,就会自动生成表结构,这里创建一个学生类Student

    /// <summary>
    /// 学生
    /// </summary>
    [Table(Name = "Student")]
    public class Student
    {
        /// <summary>
        /// 自增主键
        /// </summary>
        [Column(IsIdentity = true, IsPrimary = true)]
        public long Id { get; set; }
    
        /// <summary>
        /// 姓名
        /// </summary>
        [Column(IsNullable = false, DbType = "varchar(20)")]
        public string Name { get; set; }
    
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }
    
        public StatusEnum Status { get; set; }
    
        /// <summary>
        /// 添加时间
        /// </summary>
        public DateTime AddTime { get; set; }
    
        /// <summary>
        /// 说明
        /// </summary>
        [Column(IsNullable =true,DbType = "varchar(100)")]
        public string Remark { get; set; }
    }
    
    /// <summary>
    /// 状态枚举    1.正常   2.冻结
    /// </summary>
    public enum StatusEnum
    {
    Normal = 1, Freeze = 2 }

      

    有了实体后新增个接口用于插入数据
    [HttpGet("AddStudent")]
    public async Task<ActionResult> AddStudent()
    {
        var student = new Student
        {
            Name = "小明",
            Age = 8,
            Status = StatusEnum.Normal,
            AddTime = DateTime.Now
        };
    
        var res = await _freeSql.Insert<Student>().AppendData(student).ExecuteInsertedAsync();
    
        return Ok();
    } 
    

     

    批量插入

      批量插入可以使用ExecuteAffrows()、ExecuteSqlBulkCopy()方法,BulkCopy操作是扩展方法,可用的数据库有SqlServer/PostgreSQL/MySql,大批量插入使用BulkCopy更快
    var studentList = new List<Student>();
    
    for (int i = 0; i < 10; i++)
    {
        studentList.Add(new Student
        {
            Name = "小明" + i,
            Age = i,
            Status = StatusEnum.Normal,
            AddTime = DateTime.Now
        });
    }
    
    //await _freeSql.Insert(studentList).ExecuteSqlBulkCopyAsync();
    var res = await _freeSql.Insert(studentList).ExecuteAffrowsAsync();
    
    return Ok();
    

      

    插入指定列、忽略列

      正常情况下不指定列、不忽略列,将实体所有的字段插入数据库
      插入指定列就是指定字段插入,未指定的列不生成sql
      忽略列指定某一些字段不插入,与指定列相反
      忽略列和指定列同时设置同一字段以优先级为准
      插入的优先级:
        全部列 < 指定列(InsertColumns)< 忽略列(IgnoreColumns)
    _freeSql.Insert(student1).ExecuteAffrowsAsync();//正常插入
    
    _freeSql.Insert(student2)
                    .InsertColumns(x => new { x.Name, x.Age, x.Status, x.AddTime })
                    .ExecuteAffrowsAsync();//指定列
    //等价于
    _freeSql.Insert(student2)
                    .IgnoreColumns(x => x.Remark)
                    .ExecuteAffrowsAsync();//忽略列
    

      

    字典插入

      直接使用字典插入,无需使用实体
    var dic = new Dictionary<string, object>();
    dic.Add("Name", "Dic");
    dic.Add("Age", 1);
    dic.Add("Status", StatusEnum.Normal);
    dic.Add("AddTime", DateTime.Now);
    
    _freeSql.InsertDict(dic).AsTable(nameof(Student)).ExecuteAffrowsAsync();
    

      

     就插入数据而言,使用的较多的还是单个实体插入(第一种方式),如果是大批量插入建议使用BulkCopy,官方提供的插入方式还有导入表数据、Mysql特有的功能,有需要的同学可以了解下
     
     
  • 相关阅读:
    学习JNA,Jnative
    JNative用法注意事项
    使用JNA替代JNI调用本地方法
    傅盛读书笔记:下一个Moonshot是什么?
    华为内部狂转好文:有关大数据,看这一篇就够了
    ws2_32.dll的妙用与删除 (禁网)
    保护颈椎重点按这三大穴位(图)
    在java中调用python方法
    在Windows中实现Java调用DLL(转载)
    java程序员,英语那点事
  • 原文地址:https://www.cnblogs.com/zousc/p/16301887.html
Copyright © 2020-2023  润新知