zoukankan      html  css  js  c++  java
  • 【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.2 在框架的基础上利用SqlSugar快速实现CRUD实战篇

    目录

    .  创建项目并集成swagger

      1.1 创建

      1.2 完善

    二. 搭建项目整体架构

    三. 集成轻量级ORM框架——SqlSugar

      3.1 搭建环境

      3.2 实战篇:利用SqlSugar快速实现CRUD

      3.3 生成实体类

     


     

     

    这一章将利用目前为止搭建好的框架,实战地编写一个学生类的完整功能接口。

    这里学生类的信息就只设置三个:【Id】、【班级Id】和【姓名】,我们的目标是快速实现这个类基础的C(增)R(查)U(改)D(删)。

    源码我上传了Github,下载地址在文末。

    1)数据库建表

    Tid设置为主键,并设置自增长。

    2)编写对应的实体类

    3)编写数据接口层

    接口层我建议先把基础的CRUD写出来,后期需要其他功能在往上加。

    这里我把5个功能定义为基础功能

    一. GetPageList 获取分页列表功能

    二. Get 根据Id获取单个实体

    三. Add 添加实体

    四. Update 编辑实体(这里的编辑是根据Id编辑所有信息,只作为基础功能,大多情况的编辑需要另外编写)

    五. Dels 删除实体(兼容了批量删除)

    也就是说,每生成一个实体类,接口层里都应有对应该实体类的这五个基本功能。

    using RayPI.Entity;
    using RayPI.Model;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace RayPI.IService
    {
        public interface IStudent
        {
            #region base
            /// <summary>
            /// 获取分页列表
            /// </summary>
            /// <param name="pageIndex"></param>
            /// <param name="pageSize"></param>
            /// <returns></returns>
            TableModel<Student> GetPageList(int pageIndex, int pageSize);
            /// <summary>
            /// 获取单个
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            Student Get(long id);
            /// <summary>
            /// 添加
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            bool Add(Student entity);
            /// <summary>
            /// 编辑
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            bool Update(Student entity);
            /// <summary>
            /// 批量删除
            /// </summary>
            /// <param name="ids"></param>
            /// <returns></returns>
            bool Dels(dynamic[] ids);
            #endregion
        }
    }
    数据接口层

    4)数据层

    该层继承上面的接口层,所以需要实现数据接口层的所有方法:

    using RayPI.Entity;
    using RayPI.IService;
    using RayPI.Model;
    using SqlSugar;
    using System;
    using System.Collections.Generic;
    using System.Linq.Expressions;
    using System.Text;
    
    namespace RayPI.Service
    {
        public class StudentService : BaseDB, IStudent
        {
            //private SqlSugarClient db = BaseDB.GetClient();
            public SimpleClient<Student> sdb = new SimpleClient<Student>(BaseDB.GetClient());
            #region base
            public TableModel<Student> GetPageList(int pageIndex, int pageSize)
            {
                PageModel p = new PageModel() { PageIndex = pageIndex, PageSize = pageSize };
                Expression<Func<Student, bool>> ex = (it => 1 == 1);
                List<Student> data = sdb.GetPageList(ex, p);
                TableModel<Student> t = new TableModel<Student>();
                t.Code = 0;
                t.Count = p.PageCount;
                t.Data = data;
                t.Msg = "成功";
                return t;
            }
    
            public Student Get(long id)
            {
                return sdb.GetById(id);
            }
    
            public bool Add(Student entity)
            {
                return sdb.Insert(entity);
            }
    
            public bool Update(Student entity)
            {
                return sdb.Update(entity);
            }
    
            public bool Dels(dynamic[] ids)
            {
                return sdb.DeleteByIds(ids);
            }
            #endregion
        }
    }

    从这里开始就稍微能感受到SqlSugar的强大了~

    可以看到,除了第一个获取分页列表,其他的获取单个、增加、修改、批量删除全是一行语句完成。

    这里获取分页列表多处几行是因为,我们需要向前端返回一个List的实体集合外,还需要返回必要的记录总数、信息等参数,以方便前端对接。

    这里如此方便主要是得益于SqlSugar帮我们继承了一个基础操作类叫SimpleClient,利用它封装好的函数,我们就可以实现大部分基础的数据库实体操作。如果SimpleClient满足不了你的需求的话,我们可以使用SqlSugarClient来完成更加复杂的操作。

    BTW,

    Expression<Func<Student, bool>> ex = (it => 1 == 1);

    该句为恒成立条件,Expression<Func<Student, bool>>为表达式类型,这里因为只需要实现分页,不需要其他检索条件,所以写了1==1,也就是恒成立。

    5)业务逻辑层

    我们需要先将前面说的五种基础功能写到admin里,代码如下:

    using RayPI.Entity;
    using RayPI.IService;
    using RayPI.Model;
    using SqlSugar;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace RayPI.Bussiness.Admin
    {
        public class StudentBLL
        {
            private IStudent IService =new Service.StudentService();
    
            public Student GetById(long id)
            {
                return IService.Get(id);
            }
    
            public TableModel<Student> GetPageList(int pageIndex,int pageSize)
            {
                return IService.GetPageList(pageIndex, pageSize);
            }
    
            public MessageModel<Student> Add(Student entity)
            {
                if (IService.Add(entity))
                    return new MessageModel<Student> { Success = true, Msg = "操作成功" };
                else
                    return new MessageModel<Student> { Success = false, Msg = "操作失败" };
            }
    
            public MessageModel<Student> Update(Student entity)
            {
                if(IService.Update(entity))
                    return new MessageModel<Student> { Success = true, Msg = "操作成功" };
                else
                    return new MessageModel<Student> { Success = false, Msg = "操作失败" };
            }
    
            public MessageModel<Student> Dels(dynamic[] ids)
            {
                if (IService.Dels(ids))
                    return new MessageModel<Student> { Success = true, Msg = "操作成功" };
                else
                    return new MessageModel<Student> { Success = false, Msg = "操作失败" };
            }
        }
    }
    业务逻辑层

    6)控制器层

    代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using RayPI.Bussiness.Admin;
    using RayPI.Entity;
    
    namespace RayPI.Controllers.Admin
    {
        /// <summary>
        /// 学生模块
        /// </summary>
        [Produces("application/json")]
        [Route("api/admin/[controller]")]
        public class StudentController : Controller
        {
            private StudentBLL bll = new StudentBLL();
            #region base
            /// <summary>
            /// 获取学生分页列表
            /// </summary>
            /// <param name="pageIndex"></param>
            /// <param name="pageSize"></param>
            /// <returns></returns>
            [HttpGet]
            public JsonResult GetStudentPageList(int pageIndex=1, int pageSize=10)
            {
                return Json(bll.GetPageList(pageIndex, pageSize));
            }
            /// <summary>
            /// 获取单个学生
            /// </summary>
            /// <param name="id">Id</param>
            /// <returns></returns>
            [HttpGet("{id}")]
            public JsonResult GetStudentById(long id)
            {
                return Json(bll.GetById(id));
            }
            /// <summary>
            /// 添加
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            [HttpPost]
            public JsonResult Add(Student entity=null)
            {
                if (entity == null)
                    return Json("参数为空");
                return Json(bll.Add(entity));
            }
            /// <summary>
            /// 编辑学生
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            [HttpPut]
            [Route("Student")]
            public JsonResult Update(Student entity=null)
            {
                if (entity == null)
                    return Json("参数为空");
                return Json(bll.Update(entity));
            }
    
            /// <summary>
            /// 删除学生
            /// </summary>
            /// <param name="ids"></param>
            /// <returns></returns>
            [HttpDelete]
            public JsonResult Dels(dynamic[] ids=null)
            {
                if (ids.Length==0)
                    return Json("参数为空");
                return Json(bll.Dels(ids));
            }
            #endregion
        }
    }
    admin控制器层

    这里我做了是否为空的验证,有人不喜欢在控制器层写验证,也可以写到业务逻辑层里。

     

    到此,一个实体最基础的CRUD就算完成了,F5运行调试:

     

    需要源码的可以从下面的链接下载~

    源码下载:点击下载

     

     参考内容:http://www.codeisbug.com/Doc/8

  • 相关阅读:
    将 SharePoint 2010 网站集升级到 2013 (含沙盒方案)
    几款网络云存储服务的使用对比
    技术发展飞快,一日十年
    项目背景介绍
    初次接触,简单的了解需求
    用色彩区分 SharePoint 2010 Calendar 的日历项
    嘿,我这里有一个 Survey!
    博客页面在 IE 浏览器中样式混乱了(已经更换了样式)
    关于 Graphviz
    搭建使用 RTX51Tiny 的 C51 Keil 项目环境
  • 原文地址:https://www.cnblogs.com/RayWang/p/9227006.html
Copyright © 2011-2022 走看看