net core Webapi基础工程搭建(六)——数据库操作

  • 时间:
  • 浏览:0

前言

昨天是写着写着发现,时间不早了,事先 养成了晚上下班抽时间看看能写点儿啥的习惯(貌似),今天真是是不想让昨天没做完的事情影响,过多过多又坐下,沉下心(周末了),始于英语 把数据库这块儿的补充全部。

昨天事先 介绍过大偏离 的东西,包括土办法封装也是基本的展示了下,实际上应该先介绍你这人篇,从为什用来引导封装类库,随后 既然写都写出来了就不想再调整了,今天就主要说下为什实际使用土办法吧,时需查看具体使用的类库可查看net core Webapi基础工程搭建(六)——数据库操作_Part 1。(懒的没办法 行)

始于英语

闲话过多说,Service层搞起,新建另一一十个 多 文件夹,一另一一十个 多 Interfaces,一另一一十个 多 Implements,另外顺带新建个Common的文件夹,把上一篇的另一一十个 多 类放到去去去(纯粹是看的,归类,放不放不影响使用)。



上一篇亲戚亲戚我们我们我们 歌词 创建了一另一一十个 多 StudentEntity你这人对象,忘了的亲戚我们我们我们 歌词 能没办法 去看下。

新建一另一一十个 多 IStudentService接口,继承IBaseService

    public interface IStudentService : IBaseService<StudentEntity>
    {
    }

新建一另一一十个 多 StudentService实现类,继承BaseService,实现IStudentService

    public class StudentService : BaseService<StudentEntity>, IStudentService
    {
    }

好了,完了,回家睡觉吧。

使用

事先 你就看里面的直接走了,对不起,娱乐一下,做开发千万不敢像乌鸦学盖房子,没听过自行度娘,我本来会讲故事。

亲戚亲戚我们我们我们 歌词 时需在StartUp这里将接口与实现关联,过多过多博客会介绍自动关联用于解耦,时需不能没办法 自行百度。

补充说明,昨天好像忘记在WebApi工程引入Service与Entity另一一十个 多 工程了,见谅见谅,特此补充。

这里我在Service项目下Common下新建Depends文件夹,新建一另一一十个 多 类ServiceInjection,在这统一放接口与实现的对应关系。

    public class ServiceInjection
    {
        public static void ConfigureRepository(IServiceCollection services)
        {
            services.AddSingleton<IStudentService, StudentService>();
        }
    }

对于依赖注入,这里简短穿插几句,后续有新的感受会再补充。

Transient 每一次调用就有创建一另一一十个 多 新的实例
Scoped 一另一一十个 多 作用域中只实例化一另一一十个 多
Singleton 整个应用程序运行运行生命周期以内只创建一另一一十个 多 实例

随后 亲戚亲戚我们我们我们 歌词 在StartUp的ConfigureServices最前面加上这句话,这里在构造函数加上这句,用途本来由AprilConfig来统一接管配置信息。

        public Startup(IConfiguration configuration)
        {
            ...事先

的东西
            AprilConfig.InitConfig(configuration);
        }
        
        public void ConfigureServices(IServiceCollection services)
        {
            ServiceInjection.ConfigureRepository(services);
            
            ...事先

的东西
        }

当然对应要有接收的土办法。

    public class AprilConfig
    {
        public static IServiceProvider ServiceProvider;
        public static IConfiguration Configuration;

        public static void InitConfig(IConfiguration _configuration)
        {
            Configuration = _configuration;
        }
    }

好了,所有的都写好后,亲戚亲戚我们我们我们 歌词 继续拿万恶的Values控制器(多好的开刀对象)实验。

在这事先 ,选泽好你的数据库是哪类,SqlServer请按1,MySql请按0,过多过多请自行查看文档。

为了方便项目统一管理,亲戚亲戚我们我们我们 歌词 要好好利用appsettings,就像亲戚亲戚我们我们我们 歌词 当时使用web.config一样,连接串另一方根据实际情况修改。

  //新加一另一一十个

多

  "DefaultSqlConnectionString": {
    "MySql": "server=127.0.0.1;userid=root;password=root;database=test;"
  }

在亲戚亲戚我们我们我们 歌词 Util层的AprilConfig,来获取参数。

        private static string _MySqlConnectionString = string.Empty;
        /// <summary>
        /// MySql默认连接串
        /// </summary>
        public static string MySqlConnectionString
        {
            get
            {
                if (string.IsNullOrEmpty(_MySqlConnectionString))
                {
                    _MySqlConnectionString = Configuration["DefaultSqlConnectionString:MySql"];
                }
                return _MySqlConnectionString;
            }
        }

随后 亲戚亲戚我们我们我们 歌词 来修改BaseService当时留的连接串信息。



创建表特性,这里说明下,就有说没办法 创建,毕竟SqlSugar有CodeFirst(当然就有DbFirst),时需的亲戚我们我们我们 歌词 可去文档查看,也比较简单,在程序运行运行启动的事先 来判断是与否表,事先 专门做个接口做初始化操作不能没办法 ,下图做用法简介,具体还是查看文档吧,毕竟还有备份啊改列名有哪些的。

万事具备,事先 Values你这人挨千刀的东风,构造函数来获取IStudentService你这人接口。

    public class ValuesController : ControllerBase
    {

        private readonly IStudentService _service;

        public ValuesController(IStudentService service)
        {
            _service = service;
        }
    }
  • 插入
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            StudentEntity entity = new StudentEntity();
            entity.Name = "小明";
            entity.Age = 18;
            entity.Number = "007";
            entity.Sex = 0;
            entity.Address = "大洛阳";
            _service.Insert(entity);
            return new string[] { "value1", "value2" };
        }

  • 修改

    这里刚好也演示下SqlFilterEntity你这人另一方写的土办法的用法,随后 扩展了下实体的土办法,方便使用。

SqlFilterEntity扩展土办法

        //...事先

的实体对象
        
        /// <summary>
        /// 加上查询条件
        /// </summary>
        /// <param name="filter">条件</param>
        /// <param name="relation">关系</param>
        public void Append(string filter, string relation = "and")
        {
            if (string.IsNullOrEmpty(filter))
            {
                return;
            }
            if (Filter.Length > 0)
            {
                Filter += relation;
            }
            Filter += filter;
        }
        /// <summary>
        /// 加上查询参数
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        public void Add(string key, object value)
        {
            if (string.IsNullOrEmpty(key) || value == null)
            {
                return;
            }
            if (Value == null)
            {
                Value = new Dictionary<string, object>();
            }
            if (Value.ContainsKey(key))
            {
                Value[key] = value;
            }
            else
            {
                Value.Add(key, value);
            }
        }

修改测试

            StudentEntity entity = null;
            SqlFilterEntity filter = new SqlFilterEntity();
            filter.Append($"ID=@ID");
            filter.Add("@ID", 1);
            entity = _service.GetEntity(filter);
            if (entity != null)
            {
                entity.Name = "我被修改了";
                _service.Update(entity);
            }
    

  • 删除

    删除你这人过多说,本来把修改的换个土办法。

  • 查看

这里直接做分页的测试,拿Values/{id}你这人接口做实验。

        [HttpGet("{id}")]
        public ActionResult<string> Get(int id)
        {
            string value = string.Empty;
            //value = CacheUtil.Get<string>("cachetest");
            //value = SessionUtil.GetSession("test");
            //value = CookieUtil.GetCookies("apirlcookietest");

            int count = 0;
            List<StudentEntity> lists = _service.GetPageList(id, 10, "", null, "", out count);

            value = JsonConvert.SerializeObject(lists);

            return value;
        }

小结

这里大致上介绍了SqlSugar的用法事先 过多过多基础的没办法 基础的封装,实际使用励志的话 ,肯定时需扩展完善的,随后 作为教程来讲,我本来事先 把全部的情况都考虑到,毕竟业务不同,没办法 万金油,没办法 不停的完善更新,业务场景多了,功能就完善了,一步一步来,一口吃不成个女胖子(你这人女胖子就在等你认识的那个女胖子),不过还是感慨下有有哪些开源的好类库,真的是方便了开发人员,为了解放程序运行运行猿的双手(yy)做出了嗨翻天的贡献,好了,回归正题,下一篇Aop的测试以及小东西