WPF+Mvvm项目入门完整教程-基于SqlSugar的数据库实例(三)

目录

  • 数据库实现
    • 创建数据库类库
    • 资源获取

在上一节中,我们实现了主页UI框架和基础菜单功能,本节主要实现数据库的类库创建、数据功能接口以及泛型方法实现。本例使用的数据库为 MySql数据库,ORM框架采用 SqlSugar 实现。

数据库实现

创建数据库类库

  1. 新建项目,选择类库,命名为 DataBaseLib,如下所示:
    在这里插入图片描述

  2. 划分数据库三层结构目录,数据模型 Entities,数据访问层 DAL,业务逻辑层 BLL,分别创建三层目录文件夹,如下所示:在这里插入图片描述

  3. 创建一个基类数据模型 BaseModel,用来提取数据模型的公共部分,其他数据模型继承这个基类数据模型,如下所示:
    在这里插入图片描述

  4. SqlSugar 安装,在 DataBaseLib 类库右键,管理NuGet包,搜索 SqlSugar 安装最新版本。

  5. BaseModel 代码实现如下:

using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DataBaseLib.Entities.BaseEntity
{public class BaseModel{public BaseModel(){CreateTime = DateTime.Now;}/// <summary>/// 自增主键/// </summary>[SugarColumn(IsPrimaryKey =true,IsIdentity =true,ColumnDescription ="自增主键")]public int Id {  get; set; }/// <summary>/// 创建时间/// </summary>[SugarColumn(ColumnDescription = "创建时间")]public DateTime CreateTime {  get; set; }/// <summary>/// 更新时间 可空/// </summary>[SugarColumn(IsNullable =true,ColumnDescription = "更新时间")]public DateTime UpdateTime {  get; set; }}
}
  1. 创建一个测用户信息表 UserInfo,表结构代码如下
using DataBaseLib.Entities.BaseEntity;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DataBaseLib.Entities
{[SugarTable("UserInfo")]//设置数据库名称,当类库名称和数据库不一致是可以通过别名统一public class UserInfo : BaseModel{/// <summary>/// 编号/// </summary>[SugarColumn(ColumnDataType = "Nvarchar(100)", ColumnDescription = "编号")]public string Code { get; set; }/// <summary>/// 姓名/// </summary>[SugarColumn(ColumnDataType = "Nvarchar(100)", ColumnDescription = "姓名")]public string Name { get; set; }/// <summary>/// 密码/// </summary>[SugarColumn(ColumnDataType = "Nvarchar(50)", ColumnDescription = "密码")]public string Password { get; set; }/// <summary>/// 性别/// </summary>[SugarColumn(ColumnDescription = "性别")]public int Gender { get; set; }/// <summary>/// 角色Id/// </summary>[SugarColumn(ColumnDescription = "角色Id")]public int RoleId { get; set; }}
}

6、DAL层创建一个基础的泛型实现类 BaseDAL.cs,代码实现如下:

using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Runtime.Remoting;
using System.Text;
using System.Threading.Tasks;namespace DataBaseLib.DAL
{public class BaseDAL<T> where T : class, new(){protected MyDbContext db;protected IAdo ado{get{return db.Client.Ado;}}public SimpleClient<T> CurrentDb{get{return db.Client.GetSimpleClient<T>();}}public BaseDAL(){db = new MyDbContext();}/// <summary>/// 返回第一行数据/// </summary>/// <returns></returns>public T GetFirstModel(){try{return CurrentDb.GetList().FirstOrDefault();}catch (Exception ex){throw ex;}}/// <summary>/// 获取所有/// </summary>/// <returns></returns>public virtual List<T> GetList(){return CurrentDb.GetList();}/// <summary>/// 根据表达式查询/// </summary>/// <returns></returns>public virtual List<T> GetList(Expression<Func<T, bool>> whereExpression){return CurrentDb.GetList(whereExpression);}/// <summary>/// 根据表达式查询分页/// </summary>/// <returns></returns>public virtual List<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel pageModel){return CurrentDb.GetPageList(whereExpression, pageModel);}/// <summary>/// 根据表达式查询分页并排序/// </summary>/// <param name="whereExpression">it</param>/// <param name="pageModel"></param>/// <param name="orderByExpression">it=>it.id或者it=>new{it.id,it.name}</param>/// <param name="orderByType">OrderByType.Desc</param>/// <returns></returns>public virtual List<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel pageModel, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc){return CurrentDb.GetPageList(whereExpression, pageModel, orderByExpression, orderByType);}/// <summary>/// 根据主键查询/// </summary>/// <returns></returns>public virtual List<T> GetById(dynamic id){return CurrentDb.GetById(id);}/// <summary>/// 根据主键删除/// </summary>/// <param name="id"></param>/// <returns></returns>public virtual bool Delete(dynamic id){return CurrentDb.DeleteById(id);}/// <summary>/// 根据实体删除/// </summary>/// <param name="id"></param>/// <returns></returns>public virtual bool Delete(T data){if (data == null){Console.WriteLine(string.Format("要删除的实体对象不能为空值!"));}return CurrentDb.Delete(data);}/// <summary>/// 根据主键删除/// </summary>/// <param name="id"></param>/// <returns></returns>public virtual bool Delete(dynamic[] ids){if (ids.Count() <= 0){Console.WriteLine(string.Format("要删除的主键ids不能为空值!"));}return CurrentDb.AsDeleteable().In(ids).ExecuteCommand() > 0;}/// <summary>/// 根据表达式删除/// </summary>/// <param name="id"></param>/// <returns></returns>public virtual bool Delete(Expression<Func<T, bool>> whereExpression){return CurrentDb.Delete(whereExpression);}/// <summary>/// 根据实体更新,实体需要有主键/// </summary>/// <param name="id"></param>/// <returns></returns>public virtual bool Update(T obj){if (obj == null){Console.WriteLine(string.Format("要更新的实体不能为空,必须带上主键!"));}return CurrentDb.Update(obj);}/// <summary>///批量更新/// </summary>/// <param name="id"></param>/// <returns></returns>public virtual bool Update(List<T> objs){if (objs.Count <= 0){Console.WriteLine(string.Format("要批量更新的实体不能为空,必须带上主键!"));}return CurrentDb.UpdateRange(objs);}/// <summary>/// 插入/// </summary>/// <param name="id"></param>/// <returns></returns>public virtual bool Insert(T obj){return CurrentDb.Insert(obj);}/// <summary>/// 批量/// </summary>/// <param name="id"></param>/// <returns></returns>public virtual bool Insert(List<T> objs){return CurrentDb.InsertRange(objs);}}
}

继续实现UserInfoDAL.cs 的代码

using DataBaseLib.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DataBaseLib.DAL
{public class UserInfoDAL : BaseDAL<UserInfo>{}
}

7、BLL层实现,业务逻辑实现,实现UserInfoBLL.cs,代码如下:

using DataBaseLib.DAL;
using DataBaseLib.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DataBaseLib.BLL
{public class UserInfoBLL{public UserInfoDAL userInfoDAL = new UserInfoDAL();/// <summary>/// 获取全部信息/// </summary>/// <returns></returns>public List<UserInfo> GetAllUserList(){return userInfoDAL.GetList();}public bool DelUserById(int id){return userInfoDAL.Delete(id);}}
}

以上完成了数据库三层通用框架代码的实现,包含了泛型数据库操作实现。

资源获取

CSDN 源码下载:WPF+Mvvm项目入门完整教程-基于SqlSugar的数据库实例(三)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Socket通信基础

1 基本概念 socket是操作系统提供的一套标准化网络编程接口&#xff0c;应用程序调用这些接口&#xff0c;可以编写出服务端&#xff08;Server&#xff09;和客户端&#xff08;Client&#xff09;的socket程序&#xff0c;两端的socket通过特定的IP地址和端口连接起来&#…

短视频账号矩阵系统源码---独立saas技术部署

#短视频账号矩阵系统# #短视频矩阵源码# #短视频账号矩阵系统技术开发# 抖音seo账号矩阵系统&#xff0c;短视频矩阵系统源码&#xff0c; 短视频矩阵是一种常见的视频编码标准&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“…

html 轮播图效果

轮播效果&#xff1a; 1、鼠标没有移入到banner,自动轮播 2、鼠标移入&#xff1a;取消自动轮播、移除开始自动轮播 3、点击指示点开始轮播到对应位置 4、点击前一个后一个按钮&#xff0c;轮播到上一个下一个图片 注意 最后一个图片无缝滚动&#xff0c;就是先克隆第一个图片…

Linux -- 进程间通信、初识匿名管道

目录 进程间通信 什么是进程间通信 进程间通信的一般规律 前言&#xff1a; 管道 代码预准备&#xff1a; 如何创建管道 -- pipe 函数 参数&#xff1a; 返回值&#xff1a; wait 函数 参数&#xff1a; 验证管道的运行&#xff1a; 源文件 test.c &#xff1a; m…

独孤思维:新学员副业一周出单

所谓的一万小时定律。 即在某个技能上面&#xff0c;花费超过1万小时。 如果每天刻意练习1小时&#xff0c;则需要30年。 可行吗&#xff1f; 极难。 所以不要过分迷恋这种定律。 对于我们普通人而言&#xff0c;可以训练一个月或者三个月&#xff0c;即可掌握某项技能。…

深入解析:Linux tcpdump命令在网络流量分析中的实战应用

tcpdump是一个强大的命令行工具&#xff0c;用于捕获和分析TCP、UDP、ICMP等协议的网络流量。 功能与用途 捕获网络流量&#xff1a;tcpdump可以捕获和显示来自本地计算机或通过网络传输的数据包&#xff0c;提供有关数据包的详细信息&#xff0c;如源和目的IP地址、端口号、…

Python正则表达式(re模块)的正确匹配详解

基本匹配及一些符号的特定含义 正则表达式是用于处理文本的强大工具&#xff0c;在Python中通过 re 模块来使用。 基本匹配 - 首先要导入 re 模块。例如&#xff0c;要在字符串中查找简单的单词 apple &#xff0c;可以这样写&#xff1a; import re text "I have an a…

flutter集成极光推送

一、简述 极光推送&#xff0c;英文简称 JPush&#xff0c;免费的第三方消息推送服务&#xff0c;官方也推出众多平台的SDK以及插件。 参考链接 名称地址客户端集成插件客户端集成插件 - 极光文档 二、操作步骤 2.1 添加插件 flutter项目中集成官方提供的 极光推送flutte…

能源管理系统

一、介绍 基于SpringCloud的能管管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 二、软件架构 二、功能介绍 三、数字大屏展示 四、数据采集原理 五、软件截图

小渡Al论文写作:50个GPT学术指令——1天搞定1篇论文

选题与研究方向 假设你是某高校某专业的教授&#xff0c;请根据我感兴趣的研究方向&#xff0c;为我提供10个新颖且有研究意义的论文选题。我对某个选题感兴趣&#xff0c;请列举几个该领域当前的研究热点和争议点供我选择。假设我是某专业本科生/研究生&#xff0c;请为我提供…

springboot集成pdfbox解析pdf文件

springboot集成pdfbox解析pdf文件 1、引入依赖2、获取PDF文件3、获取需要的字段信息4、获取多字段时&#xff0c;步骤3需要优化&#xff0c;以下为优化后代码 1、引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</a…

iconfont图标放置在某个元素的最右边

在网页设计中&#xff0c;如果你想要将iconfont图标放置在某个元素的最右边&#xff0c;你可以通过CSS来实现这个布局。以下是一些基本的CSS代码示例&#xff0c;它们可以帮助你根据不同的布局需求将图标放置在最右边&#xff1a; 内联元素&#xff08;如<span>&#xff…

perl读取目录,写入文件

perl读取目录&#xff0c;写入文件 此脚本有两个输入参数&#xff0c;第一个参数为需要打印的文件目录&#xff0c;第二个参数为打印后的文件名&#xff1b; 该脚本名称为out_file_full_path #!/bin/perluse 5.010; my $dir $ARGV[0]; # 此为第一个参数&#xff1b; opendi…

Unreal Engine5安装Niagara UI Renderer插件

系列文章目录 文章目录 系列文章目录前言一、如何下载安装Niagara UI Renderer插件 前言 在2024.10.24号的今天发现unreal engine官网已经没有虚幻商城了&#xff0c;取而代之的是FAB ‌虚幻商城已经停止运营&#xff0c;Epic Games推出了新的数字资产商店FAB。‌ Epic Games…

Python URL编码

在 Python 中&#xff0c;可以使用 urllib.parse模块对 URL 进行编码。 一、依赖安装 pip install urllib 二、URL编码 from urllib.parse import quoteurl rhttps://myshop.com/shop/shopList?query query {"id":14,"pageSize":10,"pageNum&quo…

【论文+源码】基于SSM+VUE的大学生兼职管理系统

创建一个大学生兼职管理系统&#xff0c;结合 SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架和 Vue.js 前端框架&#xff0c;可以分为几个主要步骤来实现。 第一部分&#xff1a;环境准备 1. 开发环境准备 Java JDK&#xff1a;确保已安装 Java 8 或更高版本。…

2024软考网络工程师笔记 - 第8章.网络安全

文章目录 网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型3️⃣安全目标与技术 &#x1f551;现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552…

从0开始深度学习(19)——参数管理

在选择了模型架构&#xff0c;并设置了超参数之后&#xff0c;就进入了训练阶段&#xff0c;此时&#xff0c;我们的目标是找到使损失函数最小化的模型参数值。 经过训练后&#xff0c;我们将需要使用这些参数来做出未来的预测。 此外&#xff0c;有时我们希望提取参数&#xf…

电子商务类型

常见电子商务类型及其代表性的例子&#xff1a; B2B&#xff08;Business to Business&#xff09; 定义&#xff1a;B2B 模式是指企业与企业之间的商业交易。在这种模式下&#xff0c;企业通过电子商务平台相互提供产品或服务。 特点&#xff1a; 大宗交易&#xff1a;通常…

数据结构 ——— 顺序表和链表的区别以及各自的优缺点

目录 顺序表和链表的区别 一、存储空间上 二、下标的随机访问 三、任意位置插入或者删除元素 四、添加数据 五、应用场景 六、缓存利用率 顺序表和链表的优缺点 顺序表的缺点 链表的优点&#xff08;和顺序表的缺点对应&#xff09; 顺序表的优点 链表的缺点&#…