Model1实现增删改查的小例子

合集下载

mysql增删改查实例

mysql增删改查实例

mysql增删改查实例一、概述MySQL是一种开源的关系型数据库管理系统,广泛应用于Web应用程序的开发中。

MySQL支持多种操作系统,包括Windows、Linux 和Mac OS等。

本文将介绍MySQL的增删改查操作实例。

二、连接数据库在进行任何操作之前,需要先连接到MySQL数据库。

可以使用以下代码连接到MySQL:```pythonimport mysql.connectormydb = mysql.connector.connect(host="localhost",user="yourusername",password="yourpassword",database="mydatabase")mycursor = mydb.cursor()```其中,host为数据库所在主机的IP地址或域名;user为访问数据库所需的用户名;password为访问数据库所需的密码;database为要连接到的数据库名称。

三、插入数据插入数据是指向MySQL数据库中添加新记录。

可以使用以下代码向表中插入新数据:```pythonsql = "INSERT INTO customers (name, address) VALUES(%s, %s)"val = ("John", "Highway 21")mycursor.execute(sql, val)mit()print(mycursor.rowcount, "record inserted.")```其中,customers为表名;name和address为字段名;%s表示占位符,后面需要使用val变量中的值替换占位符;val为一个元组,包含了要插入的数据。

四、查询数据查询数据是指从MySQL数据库中检索记录。

走进WPF之MVVM完整案例

走进WPF之MVVM完整案例

⾛进WPF之MVVM完整案例学习WPF如果不学MVVM,仿佛缺少了灵魂。

那什么是MVVM呢?为什么要学MVVM呢,本以⼀个简单的增删改查的⼩例⼦,简述MVVM的基本知识及如何通过进⾏MVVM架构的程序开发,仅供学习分享使⽤,如有不⾜之处,还请指正。

什么是MVVM?MVVM是Model-View-ViewModel的简写。

它本质上就是MVC (Model-View- Controller)的改进版。

即模型-视图-视图模型。

分别定义如下:【模型】指的是后端传递的数据。

【视图】指的是所看到的页⾯。

【视图模型】mvvm模式的核⼼,它是连接view和model的桥梁。

它有两个⽅向:⼀是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页⾯。

实现的⽅式是:数据绑定。

⼆是将【视图】转化成【模型】,即将所看到的页⾯转化成后端的数据。

实现的⽅式是:DOM 事件监听。

这两个⽅向都实现的,我们称之为数据的双向绑定。

MVVM⽰意图如下所⽰:安装MvvmLight插件项⽬名称右键-->管理NuGet程序包-->搜索MvvmLight-->安装。

如下所⽰:弹出接受许可证窗⼝,点击【接受】如下所⽰:MvvmLight安装成功后,⾃动引⽤需要的第三⽅库,并默认⽣成⽰例内容,有些不需要的需要删除,如下所⽰:MVVM⽰例截图主要通过MVVM实现数据的CRUD【增删改查】基础操作,如下所⽰:MVVM开发步骤1. 创建Model层本例主要是对学⽣信息的增删改查,所以创建Student模型类,如下所⽰: 1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace WpfApp3.Models8 {9///<summary>10///学⽣类11///</summary>12public class Student13 {14///<summary>15///唯⼀标识16///</summary>17public int Id { get; set; }1819///<summary>20///学⽣姓名21///</summary>22public string Name { get; set; }2324///<summary>25///年龄26///</summary>27public int Age { get; set; }2829///<summary>30///班级31///</summary>32public string Classes { get; set; }33 }34 }2. 创建DAL层为了简化⽰例,模拟数据库操作,构建基础数据,如下所⽰:1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using WpfApp3.Models;78namespace WpfApp3.DAL9 {10public class LocalDb11 {12private List<Student> students;1314public LocalDb() {15 init();16 }1718///<summary>19///初始化数据20///</summary>21private void init() {22 students = new List<Student>();23for (int i = 0; i < 30; i++)24 {25 students.Add(new Student()26 {27 Id=i,28 Name=string.Format("学⽣{0}",i),29 Age=new Random(i).Next(0,100),30 Classes=i%2==0?"⼀班":"⼆班"31 });32 }33 }3435///<summary>36///查询数据37///</summary>38///<returns></returns>39public List<Student> Query()40 {41return students;42 }4344///<summary>45///按名字查询46///</summary>47///<param name="name"></param>48///<returns></returns>49public List<Student> QueryByName(string name)50 {51return students.Where((t) => .Contains(name)).ToList();//FindAll((t) => .Contains(name));52 }5354public Student QueryById(int Id)55 {56var student = students.FirstOrDefault((t) => t.Id == Id);57if (student != null)58 {59return new Student() {60 Id=student.Id,61 Name=,62 Age=student.Age,63 Classes=student.Classes64 };65 }66return null;67 }686970///<summary>71///新增学⽣72///</summary>73///<param name="student"></param>74public void AddStudent(Student student)75 {76if (student != null)77 {78 students.Add(student);79 }80 }8182///<summary>83///删除学⽣84///</summary>85///<param name="Id"></param>86public void DelStudent(int Id)87 {88var student = students.FirstOrDefault((t) => t.Id == Id); //students.Find((t) => t.Id == Id);89if (student != null)90 {91 students.Remove(student);92 }9394 }95 }969798 }3. 创建View层View层与⽤户进⾏交互,⽤户数据的展⽰,及事件的响应。

增删改查测试用例

增删改查测试用例

增删改查测试用例
增删改查测试用例通常是指对软件或数据库中的数据进行增加、删除、修改和查询操作的测试用例。

以下是增删改查测试用例的示例:
增加数据:
输入数据:增加一条新记录,包括必填字段和可选字段。

验证结果:检查数据是否正确添加到数据库中,包括字段值的正确性和数据类型的符合性。

异常处理:验证在添加重复数据或格式不正确数据时的错误提示信息。

删除数据:
输入数据:提供要删除的记录的唯一标识符。

验证结果:检查数据库中是否已成功删除该记录。

异常处理:验证在尝试删除不存在的记录时的错误提示信息。

修改数据:
输入数据:提供要修改的记录的唯一标识符和修改后的字段值。

验证结果:检查数据库中是否已成功修改该记录,包括字段值的正确性和数据类型的符合性。

异常处理:验证在修改不存在的记录时的错误提示信息。

查询数据:
输入数据:提供查询条件,如关键字、日期范围等。

验证结果:检查返回的查询结果是否符合预期,包括数据数量和数据内容的正确性。

异常处理:验证在查询条件过于复杂或查询条件错误时的错误提示信息。

需要注意的是,在实际的测试工作中,需要根据具体的软件或数据库系统来确定测试用例的具体内容,并根据实际需求和业务逻辑进行相应的调整和补充。

增删改查思路及步骤

增删改查思路及步骤

增删改查思路及步骤增删改查(CRUD)是计算机科学中常用的基本操作,用于对于数据存储系统(例如数据库)中的数据进行增加、删除、修改和查询操作。

以下是增删改查的思路以及一般步骤。

这四个操作是软件开发中最常见和重要的操作之一,对于数据的操作非常关键。

一、增加(Create):数据增加是指向数据库中添加数据。

常见的步骤如下:1.设计数据表结构:创建一个表格或者类来存储新数据,并确定字段类型、长度和关系。

2. 编写添加数据的代码:使用编程语言(如SQL、Python等)编写代码,来向数据库中添加数据。

3.执行代码:运行代码,将数据添加到数据库中。

二、删除(Delete):数据删除是指从数据库中删除数据。

常见的步骤如下:1.根据需求确定删除的条件:确定要删除的数据的特定条件,如ID、日期等。

2.编写删除数据的代码:使用编程语言编写代码,将符合条件的数据从数据库中删除。

3.执行代码:运行代码,删除数据库中的数据。

三、修改(Update):数据修改是指更新数据库中的数据,使其与最新的需求相适应。

常见的步骤如下:1.确定需要修改的数据:根据需求确定要修改的数据,并确定具体的修改内容。

2.编写修改数据的代码:使用编程语言编写代码,根据需求修改数据库中的数据。

3.执行代码:运行代码,将修改后的数据更新到数据库中。

四、查询(Retrieve):数据查询是指从数据库中获取数据。

1.确定查询的条件:根据需求确定查询的条件,如ID、日期、关键词等。

2.编写查询代码:使用编程语言编写代码,根据查询条件从数据库中获取数据。

3.执行查询:运行代码,执行查询并获得结果。

以上是增删改查的基本思路与步骤。

在现实的软件开发中,通常还会包含一些额外的处理,如输入验证、错误处理、事务处理等。

不同的编程语言和数据库系统可能有所不同的实现方式,但其基本概念和步骤大致相同。

在实际使用时,我们可以根据具体需求灵活应用以上步骤。

例如,对于数据库的设计,可以根据需要创建多个表格,并在表与表之间建立适当的关系。

请列举模型中常用的增、删、改、查方法。

请列举模型中常用的增、删、改、查方法。

请列举模型中常用的增、删、改、查方法。

在模型中,常用的增删改查方法是指对数据进行增加、删除、修改和查询的操作。

这些方法是开发过程中最常用的基本操作,在不同的应用场景下,可以有效管理和维护数据。

下面将分别介绍每个方法的具体操作步骤。

增加数据(Create):在模型中增加数据通常分为两个步骤:创建数据对象和将数据对象添加到模型中。

1. 创建数据对象:首先,根据模型的定义,创建一个新的数据对象。

这可以通过实例化模型的类来完成,也可以通过调用模型类提供的特定方法来创建对象。

2. 添加数据对象:将创建的数据对象添加到模型中,使其成为模型的一部分。

这可以通过模型类提供的添加方法来完成,例如将数据对象插入到数据库表中,或将数据对象添加到内存中的数据结构中。

删除数据(Delete):在模型中删除数据也有两个步骤:定位要删除的数据对象,然后在模型中删除该对象。

1. 定位数据对象:首先,根据要删除的数据对象的唯一标识或其他特定条件,确认要删除的数据对象。

这可以通过查询模型中的数据来完成,找到符合条件的数据对象。

2. 删除数据对象:一旦找到要删除的数据对象,在模型中执行删除操作。

这可以通过模型类提供的删除方法来完成,例如在数据库中删除相应的记录,或从内存中的数据结构中移除数据对象。

修改数据(Update):修改数据的过程通常包括查找要修改的数据对象,然后在模型中对该对象的属性进行更新。

1. 查找数据对象:首先,根据要修改的数据对象的唯一标识或其他特定条件,找到需要修改的数据对象。

这可以通过查询模型中的数据来完成,找到满足条件的数据对象。

2. 更新数据对象:一旦找到了要修改的数据对象,在模型中执行更新操作。

这可以通过模型类提供的更新方法来完成,例如在数据库中更新相应的记录,或修改内存中的数据对象的属性。

查询数据(Retrieve):查询数据是模型中最常见和重要的操作,它用于从模型中检索特定的数据。

1. 构建查询条件:首先,根据需要查询的数据的属性和条件,构建查询语句或查询对象。

新手入门教程,从0开始入手APIcloud(二)

新手入门教程,从0开始入手APIcloud(二)

前面一篇主要讲了项目的创建和布局方式。

总结一下APP的布局方式最佳为wi n+frame,多写个文件多弄点优化才能让你的APP流畅度提高。

这篇主要来讲一下模块的引入、服务器数据对接及APP数据存储方式。

一、模块的引入和使用在apicloud的模块store里面提供了大量的模块,我们可以直接在html里面引入使用使用方法:在需要使用模块的页面中加入:var obj = api.require('模块名');然后参考对应模块的使用方法。

如果在一个页面中频繁使用到一个模块的功能,最好就将其声明称全局变量。

二、服务器数据对接---云数据库和本地服务器1、在APICLOUD开发的过程中,我们看到了一个新名词,数据云。

这个是api cloud提供给开发者的一个云数据库,我们可以利用它来完成数据的存储和读取。

开启数据云流程,进入控制台---左侧云设置----选择一个储存服务--确定即可开通,然后在Database里面我们会看到默认的几张表(以下注释非官方注释,个人理解的意思*.*)accessToken ---- 存储用户令牌类file ---- 文件类role ----- 角色配置roleMapping --- 相关对应的角色权限user ----- 用户(默认的表前面有个下划线不用理会他,就当不存在哈)当然我们也可以根据自己的需求创建各类表,通过添加列来自己表字段,注意根据自己需求设置下字段类型,字段类型不懂的可以百度一下,主要有字符,数字,时间,文件,数组,关联等对于数据表的操作说简单的点就是增删改查,下面说一下数据云的使用方法,在文档里面对应(mcm)我们通过model模块来实现数据云的操作,首先引入和配置下model模块var model = api.require('model');model.config({appKey: 'A991A337-0212-A29D-0C9C-A518E39FXXXX',host: 'https://'});appKey 可以在控制台里面查看。

SpringBoot实现简单的增删改查

SpringBoot实现简单的增删改查

SpringBoot实现简单的增删改查在pom.xml添加相应的依赖<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 前端使⽤thymeleaf来代替jsp --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency></dependencies>配置⽂件配置数据库等#serverserver.port=80#项⽬名:server.servlet.context-path#spring dataSourcespring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8ername=rootspring.datasource.password=rootmybatis.mapper-locations=classpath:/mapper/*/*.xml#spring log.cy=debug#spring thymeleaf(假如没有配置也会默认配置,在默认配置中prefix默认值为classpath:/templates/,后缀默认为.html)#不⽤重启服务器,⽹页就能刷新spring.thymeleaf.cache=falsespring.thymeleaf.prefix=classpath:/templates/pages/spring.thymeleaf.suffix=.html数据层添加相应注解实现sql语句(或者通过xml配置来实现)数据层封装了商品信息,并提供get和set⽅法,为Goods类1.查询所有数据@Select("select * from tb_goods")List<Goods> findAll();2.按照id删除数据@Delete("delete from tb_goods where id=#{id}")int deleteById(Integer id);3.修改数据(1)修改数据⾸先要新建⼀个界⾯,按照id查找内容,并将查找到的内容显⽰到⽂本框内@Select("select * from tb_goods where id=#{id}")Goods findById(Integer id);(2)再添加查找的⽅法@Update("update tb_goods set name=#{name},remark=# {remark},createdTime=now() where id=#{id}")int update(Goods goods);4.新增数据@Insert("insert into tb_goods(name,remark,createdTime) values (#{name},#{remark},now())")int add(Goods goods);业务层提供对应接⼝⽅法和实现类1.业务层接⼝public interface GoodsService {List<Goods> findObject();int add(Goods goods);int update(Goods goods);Goods findById(Integer id);}2.业务层实现类@Servicepublic class GoodsServiceImpl implements GoodsService {@Autowiredprivate GoodsDao goodsDao;@Overridepublic List<Goods> findObject() {long start=System.currentTimeMillis();List<Goods> list = goodsDao.findObjects();long end=System.currentTimeMillis();System.out.println("query time:"+(end-start));return list;}@Overridepublic int add(Goods goods) {return goodsDao.add(goods);}@Overridepublic int update(Goods goods) {return goodsDao.update(goods);}@Overridepublic Goods findById(Integer id) {return goodsDao.findById(id);}控制层写具体实现1.跳转到⾸页并且查找所有商品@RequestMapping("doGoodsUI")public String doGoodsUI(Model model) {List<Goods> list = goodsService.findObject();model.addAttribute("goods",list);return "goods";}2.业务层实现类@Servicepublic class GoodsServiceImpl implements GoodsService {@Autowiredprivate GoodsDao goodsDao;@Overridepublic List<Goods> findObject() {long start=System.currentTimeMillis();List<Goods> list = goodsDao.findObjects();long end=System.currentTimeMillis();System.out.println("query time:"+(end-start));return list;}@Overridepublic int add(Goods goods) {return goodsDao.add(goods);}@Overridepublic int update(Goods goods) {return goodsDao.update(goods);}@Overridepublic Goods findById(Integer id) {return goodsDao.findById(id);}控制层写具体实现1.跳转到⾸页并且查找所有商品@RequestMapping("doGoodsUI")public String doGoodsUI(Model model) {List<Goods> list = goodsService.findObject();model.addAttribute("goods",list);return "goods";}2.删除商品@RequestMapping("doDeleteById/{id}")// (@PathVariable Integer id)告诉服务器,id拿到的是从⽹页上同样叫id的数据 public String dodeletebyId(@PathVariable Integer id){int delete = goodsDao.deleteById(id);//doGoodsUI前⾯没有加/的话,跳转的⽹址是替代了最后⼀个/后⾯的内容 return "redirect:/goods/doGoodsUI";}3.修改商品(1)先将查找出来的商品显⽰在⽂本框中@RequestMapping("doFindById/{id}")public String doFindByID(@PathVariable Integer id,Model model){Goods goods = goodsService.findById(id);model.addAttribute("goods",goods);return "goods-update";}(2)实现修改@RequestMapping("doUpdateGoods")public String doUpdateGoods(Goods goods){goodsService.update(goods);return "redirect:/goods/doGoodsUI";}4.新增商品@RequestMapping("doSaveGoods")public String doSaveGoods(Goods goods){goodsService.add(goods);return "redirect:/goods/doGoodsUI";}前端采⽤html+thymeleaf模板代替jsp2.each表⽰遍历拿到的数组,goods是从控制层拿到的model的名字3.id,name和remark与数据库对应,date要格式化拿到数据,该语法是thymeleaf固定写法<tr th:each="g:${goods}"><td th:text="${g.id}">1</td><td th:text="${}">AAAAAAA</td><td th:text="${g.remark}">aa</td><td th:text="${#dates.format(g.createdTime,'yyyy-MM-dd HH:mm')}">aa</td><!-- <td><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" th:href="@{/goods/doDeleteById(id=${g.id})}" rel="external nofollow" ><button>删除</button></a></td>--><td><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" th:href="@{/goods/doDeleteById/{doDeleteById}(doDeleteById=${g.id})}" rel="external nofollow" ><button>删除</button></a></td> <td><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" th:href="@{/goods/doFindById/{id}(id=${g.id})}" rel="external nofollow" ><button>修改</button></a></td></tr>4.新增商品界⾯(1)标签⾥的name属性要和sql语句⼀致(2)这⾥由于数据库中的id列设置了⾃增长,所以不需要id属性,createdTime列使⽤了now()获取当前时间,所以也不需要传值,所以在控制层的doUpdateGoods⽅法⾥可以使⽤封装好的Goods来接收从html拿到的参数<form th:action="@{/goods/doSaveGoods}" method="post"><ul><li>name:<input type="text" name="name"></li><li>remark:<textarea rows="3" cols="20" name="remark"></textarea></li><li><input type="submit" value="Save Goods"></li></ul></form>5.修改商品界⾯(1)因为id列⾃增长,所以修改商品信息不需要id这⼀列,但传参数有需要⼀起传送过去,所以添加了⼀个输⼊框,默认设置为隐藏,将其value设置为id的值<form th:action="@{/goods/doUpdateGoods}" method="post"><input type="hidden" name="id" th:value="${goods.id}"><ul><li>name:<input type="text" name="name" th:value="${}"></li><li>remark:<textarea rows="3" cols="20" name="remark" th:text="${goods.remark}"></textarea></li><li><input type="submit" value="Update Goods"></li></ul></form>以上就是Spring Boot实现简单的增删改查的详细内容,更多关于Spring Boot增删改查的资料请关注其它相关⽂章!。

TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】

TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】

TP5框架model常见操作⽰例⼩结【增删改查、聚合、时间戳、软删除等】本⽂实例讲述了TP5框架model常见操作。

分享给⼤家供⼤家参考,具体如下:使⽤model 查询数据,添加数据,修改数据,删除数据聚合操作获取器,修改器⾃动添加时间戳(创建时间,修改时间)软删除1、使⽤model查询数据$res = User::get(1); //获取主键为1的数据,得到的是⼀个对象$res = $res->toArray(); //将对象转化为数组dump($res->name); //获取 $res ⾥ name 字段的值//使⽤闭包函数查询 id=1 的记录$res = User::get(function($query){$query->where("id","eq",1)->field('name')});$res = User::where("id",10)->value('name');$res = User::where("id",10)->field('name')->find();$res = User::column('email'); //查询所有的 email 字段值$res = User::where("id",">",5)->select(); //查询所有id⼤于5的记录$res = User::all('1,2'); //查询主键等于 1 或2 的记录foreach($res as $val) //转化为数组{dump($val->toArray());}//使⽤闭包函数查询 id<5 的记录$res = User::get(function($query){$query->where("id","<",5)->field('name')});2、使⽤model添加数据$res = User::create(['name' => 'yulong','pwd' => '123'],true); //第⼆个参数为true时,只添加数据表中已有的字段,不报错,不写则默认为false;;;true 也可以换成⼀个数组,数组⾥存放数据表中的字段,表⽰仅允许数组中的字段添加数据$res->id; //本次添加的⾃增iddump($res);$usermodel = new User;$res = $usermodel->allowField(true) //仅允许添加数据表中存在的字段,也可以写成数组->save(['name' => 'yulong','pwd' => '123']);dump($res->id); //获取新添加数据的⾃增id$usermodel = new User;$res = $usermodel->saveAll([ //⼀次保存多条数据'name' => 'yulong001','name' => 'yulong002']);dump($ers);3、使⽤model更新数据$res = User::update(['name' => 'yulong002'],['id'=>1]); //更新 id=1 的记录$res = User::update(['name' => 'yulong002'],function(){$query->where("id","LT",5); //使⽤闭包函数更新 id<5 的记录});dump($res);$res = User::where("id","<",6) //返回值是被更新数据的⾏数->update(['name' => 'hahahaha']);4、使⽤model删除数据$res = User::destriy(1); //删除主键为1的记录,返回影响数据的⾏数,也可以传递数组$usermodel = User::get(1);$res = $usermodel->delete();$res = User::where("id",5)->delete(); // where() ⾥⾯有三个参数,字段值,条件,数值dump($res);5、使⽤model聚合操作$res = User::where("id",">",5)->count(); //查询id⼤于5的记录条数// max 可以换成其他的如 min / sum / avg$res = User::max('num'); //查询 num 字段中的最⼤值$res = User::where("id","<",5)->max('num'); //id<5 的记录中的 num 最⼤值6、使⽤模型获取器//model//⽅法名: get字段名Attr//controller中获取原始数据使⽤ $res->getData()public function getSexSttr($val){switch($val){case '1':return "男";break;case '2';return '⼥';break;default:return '未知';break;}}7、使⽤模型修改器//model 修改器命名 set字段名Attr//修改器作⽤:在往数据库添加字段时,控制器中写未处理的数据,在模型中的修改器中写处理数据的⽅法,这样添加到数据库中的数据就是处理过得数据了public function setPwdAttr($val){return md5($val);}// $val代表 pwd 字段,$data代表接收到的所有数据,返回的值就是 pwd+emailpublic function setPwdAttr($val,$data){return $val.$data['email'];}8、⾃动往数据库中添加时间戳//⾃动往 time 字段中加⼊时间戳public function setTimeAttr(){return time();}//在数据添加时发⽣改变protected $insert = [ 'time_insert' ]; //设置字段public function setTimeInsertAttr(){ //将字段值设置为当前时间return time();}//在更新数据时发⽣改变protected $update = [ 'time_update' ]; //设置字段public function setTimeUpdateAttr(){ //将字段值设置为当前时间return time();}9、model时间戳// 数据库中的字段 create_time update_time// database.php 中更改配置 'auto_timeStamp' => true// 不推荐使⽤此⽅法,因为如果你的数据库表中没有对应的字段,程序可能就会报错// 可以单独在某个模型中添加属性protected $autoWriteTimeStamp = true; //开启⾃动加⼊时间戳protected $createTime = 'create_at'; //设置创建的时候写⼊的字段,值可以为false,关闭操作protedted $updateTime = 'update_at'; //设置创建和更新的时候写⼊的字段,值可以为false,关闭操作10、软删除// model// 数据表中的字段 delete_time,默认值可以为 nulluse traits\model\SoftDelete; //使⽤软删除的类class User extends Model{use SoftDelete; //在类的开头 use SoftDelete;protected $deleteTime = 'delete_at'; //设置软删除的字段,默认为 delete_time}$res = User::destroy(3,true); //删除主键为3的记录,第⼆个参数为 true 时,不是软删除,是tm真删了$ress = User::get(4);$res = $ress->delete(true); // delete() 没值时,为软删除;值为true,tm的真删// controller 获取到软删除的记录$res = User::withTrashed(true)->find(1); //得到id为1 的经过软删除删除的记录dump($res->getData()); //获取原始数据$res = User::onlyTrashed()->select(); //获取所有软删除的数据更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《》。

ThinkPHP6.0模型操作方法增删改查

ThinkPHP6.0模型操作方法增删改查

ThinkPHP6.0模型操作⽅法增删改查在模型中除了可以调⽤数据库类的⽅法之外(换句话说,数据库的所有查询构造器⽅法模型中都可以⽀持),可以定义⾃⼰的⽅法,所以也可以把模型看成是数据库的增强版1、find查询数据find 获取单条数据,返回的是当前模型的对象实例namespace app\model;use think\Model;class Goods extends Model{public function find(){$find = Goods::find(6);$find = Goods::where('id',7)->find();return $find;}}2、select查询数据select 获取多条数据,返回的是当前模型的对象实例public function select(){$select = Goods::select();$select = Goods::select(6);$select = Goods::where('id','>',7)->select();return $select;}3、增加数据create 静态⽅法添加数据,返回的是当前模型的对象实例public function create(){$create = Goods::create(['cat' => 3,'title' => '','price' => '59.99','add_time' => time()]);echo $create->id; // 可以直接获取⾃增idreturn $create;}4、修改数据update 静态⽅法修改数据,返回的是当前模型的对象实例save 在取出数据后,更改字段更新数据。

增删改查简单-解释说明

增删改查简单-解释说明

增删改查简单-概述说明以及解释1.引言1.1 概述在现代信息时代,数据的管理和处理变得越来越重要。

无论是个人用户还是企业组织,都需要对数据进行增加、删除、修改以及查询等操作。

这些操作合称为增删改查(CRUD)操作,是数据管理中最基本、最常见的操作。

增删改查操作是数据管理的核心,它们在各个领域都得到广泛应用。

在个人数据管理方面,人们通过增加数据来记录生活中的重要事件、保存联系人信息等;删除数据可以清理不再需要的内容、释放存储空间;修改数据使其与当前状态保持一致;查询数据能够快速找到所需的信息。

而在企业层面,增删改查操作更是不可或缺的。

企业需要通过增加数据来记录各项业务活动,包括客户信息、订单记录、销售数据等,为后续的决策和分析提供基础;删除数据可以清理过时的、无效的或违规的内容;修改数据可以纠正错误或更新信息;查询数据则是企业分析和决策的重要依据。

在进行增删改查操作时,不仅需要掌握相应的方法和技术,还需要注意一些注意事项。

例如,在增加数据时,应确保数据的完整性和准确性,避免重复或错误的录入;在删除数据时,要谨慎操作,避免误删重要数据;在修改数据时,需要考虑影响范围和相关性,并确保相应的审批和权限控制;在查询数据时,要充分利用相关的搜索、过滤和排序功能,以提高查询效率。

评估增删改查操作的效果也是很重要的。

通过对增删改查操作的效果进行评估,可以不断改进和优化数据管理的流程和方法,提高工作效率和数据质量。

综上所述,增删改查操作是数据管理中不可或缺的基本操作,无论是个人用户还是企业组织,都需要掌握和运用这些操作技巧。

正确地进行增删改查操作,能够更好地管理和利用数据,提高工作效率和决策能力。

1.2 文章结构文章结构部分的内容如下:2. 正文2.1 增2.1.1 增加数据的重要性2.1.2 增加数据的方法2.1.3 增加数据的注意事项2.1.4 增加数据的效果评估2.2 删2.2.1 删除数据的重要性2.2.2 删除数据的方法2.2.3 删除数据的注意事项2.2.4 删除数据的效果评估2.3 改2.3.1 修改数据的重要性2.3.2 修改数据的方法2.3.3 修改数据的注意事项2.3.4 修改数据的效果评估2.4 查2.4.1 查询数据的重要性2.4.2 查询数据的方法2.4.3 查询数据的注意事项2.4.4 查询数据的效果评估以上是本文的文章结构。

增删改查导出导出通用测试用例汇总

增删改查导出导出通用测试用例汇总

有可选数据
1.进入某某-某某-某某页面
1.有下载模板权 限的账号登录
2.点击下载模板按钮 3.点击打开模板 4.检查模板中各字段填写说明
目测试用例
预期结果
1.打开页面成功 2.提示你的账号没有下载权限,或者没有下载模板 按钮
1.打开页面成功 2.下载模板成功 3.模板为.xls或.xlsx格式,不支持其他格式
6
有导出功能的模 块
下载模 板
检查必填项、字段 长度、字段特殊格 式等是否有说明
前置条件
XX项目测试用例 操作步骤
1.没有下载权限 1.进入某某-某某-某某页面
的账号登录
2.点击下载模板按钮
1.有下载模板权 限的账号登录
1.进入某某-某某-某某页面 2.点击下载模板按钮 3.检查模板格式
1.有下载模板权 限的账号登录
1.打开页面成功 2.下载模板成功 3.模板可以正常打开
1.打开页面成功 2.下载模板成功 3.模板可以正常打开 4.表头中有填写须知内容且展示正确,表头字段显 示正确并标出必填项,示例正确显示且不会导入到 系统(或可以删除)
1.打开页面成功 2.下载模板成功 3.模板可以正常打开 4.模板中相应字段有可选数据,数据可选且与系统 中可选数据一致
1.进入某某-某某-某某页面 2.点击下载模板按钮 3.点击打开模板
1.进入某某-某某-某某页面
1.有下载模板权 限的账号登录
2.点击下载模板按钮 3.点击打开模板 4.检查表头各项内容是否正确
1.进入某某-某某-某某页面
2.点击下载模板按钮
1.有下载模板权 限的账号登录
3.点击打开模板 4.根据系统列表中有可选数据的 字段,检查模板中相应字段是否

CI框架(CodeIgniter)实现的数据库增删改查操作总结

CI框架(CodeIgniter)实现的数据库增删改查操作总结

CI框架(CodeIgniter)实现的数据库增删改查操作总结本⽂实例讲述了CI框架(CodeIgniter)实现的数据库增删改查操作。

分享给⼤家供⼤家参考,具体如下:controllers下的 cquery.php⽂件<?phpclass CQuery extends Controller {//构造函数function CQuery() {parent::Controller();// $this->load->database();}function index() {//调⽤model 其中train为外层⽂件夹 MQuery为model名称 queryList为重命名$this->load->model('train/MQuery','queryList');//获得返回的结果集这⾥确定调⽤model中的哪个⽅法$result = $this->queryList->queryList();//将结果集赋给res$this->smarty->assign('res',$result);//跳转到显⽰页⾯$this->smarty->view('train/vquery.tpl');}//进⼊新增页⾯function addPage() {$this->smarty->view('train/addPage.tpl');}//新增function add() {//获得前台数据//⽤户名$memberName = $this->input->post('memberName');//密码$password = $this->input->post('password');//真实姓名$userRealName = $this->input->post('userRealName');//性别$sex = $this->input->post('sex');//出⽣⽇期$bornDay = $this->input->post('bornDay');//e_mail$eMail = $this->input->post('eMail');//密码问题$question = $this->input->post('question');//密码答案$answer = $this->input->post('answer');//调⽤model$this->load->model('train/MQuery','addRecord');//向model中的addRecord传值$result = $this->addRecord->addRecord($memberName,$password,$userRealName,$sex,$bornDay,$eMail,$question,$answer);//判断返回的结果,如果返回true,则调⽤本页的index⽅法,不要写 $result == false 因为返回的值未必是false 也有可能是""if ($result) {$this->index();} else {echo "add failed.";}}//删除function deletePage() {//获得ID$deleteID = $this->uri->segment(4);//调⽤model$this->load->model('train/MQuery','delRecord');//将值传⼊到model的delRecord⽅法中$result = $this->delRecord->delRecord($deleteID);//判断返回值if ($result) {$this->index();} else {echo "delect failed.";}}//修改先查询function changePage() {$changeID = $this->uri->segment(4);$this->load->model('train/MQuery','changeRecord');$result = $this->changeRecord->changeRecord($changeID);//将结果集赋给res$this->smarty->assign('res',$result);//跳转到显⽰页⾯$this->smarty->view('train/changePage.tpl');}//修改function change() {//获得前台数据//ID$ID = $this->input->post('id');//⽤户名$memberName = $this->input->post('memberName');//密码$password = $this->input->post('password');//真实姓名$userRealName = $this->input->post('userRealName');//性别$sex = $this->input->post('sex');//出⽣⽇期$bornDay = $this->input->post('bornDay');//e_mail$eMail = $this->input->post('eMail');$answer = $this->input->post('answer');//调⽤model$this->load->model('train/MQuery','change');//向model中的change传值$result = $this->change->change($ID,$memberName,$password,$userRealName,$sex,$bornDay,$eMail,$question,$answer);//判断返回的结果,如果返回true,则调⽤本页的index⽅法,不要写 $result == false 因为返回的值未必是false 也有可能是""if ($result) {$this->index();} else {echo "change failed.";}}}models中的 mquery.php ⽂件<?phpclass MQuery extends Model {//构造函数function MQuery() {parent::Model();//连接数据库$this->load->database();}//查询列表function queryList() {//防⽌select出的数据存在乱码问题//mysql_query("SET NAMES GBK");//SQL语句$sql = "SELECT ID,member_name,sex,e_mail FROM user_info_t";//执⾏SQL$rs = $this->db->query($sql);//将查询结果放⼊到结果集中$result = $rs->result();//关闭数据库$this->db->close();//将结果集返回return $result;}//新增function addRecord($memberName,$password,$userRealName,$sex,$bornDay,$eMail,$question,$answer) {//防⽌select出的数据存在乱码问题//mysql_query("SET NAMES GBK");//SQL语句$sql = "INSERT INTO user_info_t (member_name,password,user_real_name,sex,born_day,e_mail,question,answer) " ."VALUES ('$memberName','$password','$userRealName','$sex','$bornDay','$eMail','$question','$answer')";//执⾏SQL$result = $this->db->query($sql);//关闭数据库$this->db->close();//返回值return $result;}//删除function delRecord($deleteID) {//防⽌select出的数据存在乱码问题//mysql_query("SET NAMES GBK");$sql = "DELETE FROM user_info_t WHERE ID = $deleteID";$result = $this->db->query($sql);$this->db->close();return $result;}//修改前查询function changeRecord($changeID) {//防⽌select出的数据存在乱码问题//mysql_query("SET NAMES GBK");$sql = "SELECT ID,member_name,password,user_real_name,sex,born_day,e_mail,question,answer FROM user_info_t WHERE ID = $changeID"; //执⾏SQL$rs = $this->db->query($sql);$result = $rs->row();//$result = $rs[0]//关闭数据库$this->db->close();//将结果集返回return $result;}//修改function change($ID,$memberName,$password,$userRealName,$sex,$bornDay,$eMail,$question,$answer) {//防⽌select出的数据存在乱码问题//mysql_query("SET NAMES GBK");//SQL语句$sql = "update user_info_t set member_name = '$memberName',password = '$password', user_real_name = '$userRealName'," ."sex = '$sex',born_day = '$bornDay',e_mail = '$eMail',question = '$question',answer = '$answer'" ."where ID = $ID";//执⾏SQL$result = $this->db->query($sql);//关闭数据库$this->db->close();//返回值return $result;}}views 下的 addPage.tpl⽂件<html><head></head><body><form action="{{site_url url='train/cquery/add'}}" method="post"><table border='1'><td><input type="text" class="text" name="memberName" id="memberName"/></td></tr><tr><td>密码</td><td><input type="text" class="text" name="password" id="password"/></td></tr><tr><td>真实姓名</td><td><input type="text" class="text" name="userRealName" id="userRealName"/></td></tr><tr><td>性别</td><td><input type="text" class="text" name="sex" id="sex"/></td></tr><tr><td>出⽣⽇期</td><td><input type="text" class="text" name="bornDay" id="bornDay"/></td></tr><tr><td>e_mail</td><td><input type="text" class="text" name="eMail" id="eMail"/></td></tr><tr><td>密码问题</td><td><input type="text" class="text" name="question" id="question"/></td></tr><tr><td>密码答案</td><td><input type="text" class="text" name="answer" id="answer"/></td></tr></table><table><tr><td><input type="submit" class="button" name="OK" value="提交" /></td></tr></table></form></body></html>changePage.tpl ⽂件<html><head></head><body><form action="{{site_url url='train/cquery/change'}}" method="post"><table border='1'><input type="hidden" name="id" value="{{$res->ID}}" /><tr><td>⽤户名</td><td><input type="text" class="text" name="memberName" id="memberName" value="{{$res->member_name}}" /></td> </tr><tr><td>密码</td><td><input type="text" class="text" name="password" id="password" value="{{$res->password}}" /></td></tr><tr><td>真实姓名</td><td><input type="text" class="text" name="userRealName" id="userRealName" value="{{$res->user_real_name}}"/></td> </tr><tr><td>性别</td><td><input type="text" class="text" name="sex" id="sex" value="{{$res->sex}}"/></td></tr><tr><td>出⽣⽇期</td><td><input type="text" class="text" name="bornDay" id="bornDay" value="{{$res->born_day}}"/></td></tr><tr><td>e_mail</td><td><input type="text" class="text" name="eMail" id="eMail" value="{{$res->e_mail}}"/></td></tr><tr><td>密码问题</td><td><input type="text" class="text" name="question" id="question" value="{{$res->question}}"/></td></tr><tr><td>密码答案</td><td><input type="text" class="text" name="answer" id="answer" value="{{$res->answer}}"/></td></tr></table><table><tr><td><input type="submit" class="button" name="OK" value="提交" /></td></tr></table></form></body></html>vquery.tpl ⽂件<html><head><title></title></head><body><table border='1'><tr><td>操作</td></tr>{{foreach from=$res item=row}}<tr><input type="hidden" value={{$row->ID}}><td>{{$row->member_name}}</td><td>{{$row->sex}}</td><td>{{$row->e_mail}}</td><td><a href="{{site_url url='train/cquery/deletePage'}}/{{$row->ID}}" rel="external nofollow" >删除</a><a href="{{site_url url='train/cquery/changePage'}}/{{$row->ID}}" rel="external nofollow" >修改</a></td> </tr>{{/foreach}}</table><a href="{{site_url url='train/cquery/addPage'}}" rel="external nofollow" rel="external nofollow" mce_href="{{site_url url='train/cquery/addPage'}}" rel="external nofollow" rel="external nofollow" >add</a></body></html>更多关于CodeIgniter相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家基于CodeIgniter框架的PHP程序设计有所帮助。

vue+element实现增删改查-详细

vue+element实现增删改查-详细

Vue+Element UI 增删改查页面实现页面效果要完成该页面,我们需要先对这个页面进行分析,看页面由哪儿几部分组成,然后到官网进行拷贝并修改。

页面总共有如下组成部分还有一个是当我们点击新增按钮,会在页面正中间弹出一个对话框,如下0 准备工作0.1准备好数据库0.1.1建立数据库study及创建表CREATE TABLE `student` (`ID` int(11)NOT NULL,`name` varchar(20)NOT NULL,`birthday` date DEFAULT NULL,`score` float DEFAULT NULL,`major` varchar(50)DEFAULT NULL,`telphone` varchar(50)DEFAULT NULL,PRIMARY KEY(`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;0.1.2准备数据库链接信息private String DBDRIVER = "com.mysql.jdbc.Driver";private String DBURL = " jdbc:mysql://localhost:3306/study"; //localhostprivate String DBUSER = "jsp";private String DBPASSWORD = "jsp123";0.2新建JavaWeb项目在netBeans中创建Java Web项目0.3导入必要的jar包gson-2.8.3.jarmysql-connector-java-5.1.7-bin.jar0.4导入axios、vue、elementaxios-0.18.0.js vue.js element-ui.rar将axios,vue的js文件复制到Java Web项目的web/js目录;将element-ui.rar解压后复制到web目录0.5copy之前的DAO模块Student.java DatabaseConnection.java StudentDao.java StudentDaoImpl.java0.6准备好基本页面<body><div id="app"></div><script src="../js/axios-0.18.0.js"></script><script src="../js/vue.js"></script><script src="../element-ui/lib/index.js"></script><link rel="stylesheet"href="../element-ui/lib/theme-chalk/index.css"/> <script>new Vue({el: "#app"});</script></body>1查询1.1 完成表格展示使用Element 整体的思路就是拷贝+ 修改。

增删改查操作或方法

增删改查操作或方法

增删改查操作或方法增加(Create)数据:1.使用INSERT语句插入新的记录到数据库表中。

2.调用API或库函数来创建一个新的对象,并将其保存到内存或数据库中。

3.使用图形界面或命令行工具,提供一个表单或交互式界面,以便用户输入新的数据。

删除(Delete)数据:1.使用DELETE语句从数据库表中删除特定的记录。

2.调用API或库函数来删除指定的对象。

3.提供一个删除功能的图形界面或命令行工具,以便用户选择并删除数据。

修改(Update)数据:1.使用UPDATE语句更新数据库表中的记录。

2.调用API或库函数更新指定的对象。

查询(Retrieve)数据:1.使用SELECT语句从数据库表中检索特定的记录。

2.调用API或库函数以检索指定的对象。

3.提供一个功能的图形界面或命令行工具,允许用户输入条件并返回相关的数据。

以下是一些常见的增删改查操作的代码示例(以关系型数据库为例):增加数据:```sqlINSERT INTO table_name (column1, column2, ...) VALUES(value1, value2, ...);```删除数据:```sqlDELETE FROM table_name WHERE condition;```修改数据:```sqlUPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;```查询数据:```sqlSELECT column1, column2, ... FROM table_name WHERE condition;```以下是一些常见的增删改查操作的代码示例(以编程语言为例):增加数据:```pythondef create_data(data):#调用数据库或API创建新数据pass```删除数据:```pythondef delete_data(id):#调用数据库或API删除指定数据pass```修改数据:```pythondef update_data(id, data):#调用数据库或API更新指定数据pass```查询数据:```pythondef retrieve_data(condition):#调用数据库或API查询满足条件的数据pass```根据实际需求,增删改查操作可以有许多变种。

vue+php+mysql增删改查表格

vue+php+mysql增删改查表格

vue+php+mysql增删改查表格以下是实现vue+php+mysql增删改查表格的一个简单示例:1. 创建一个MySQL数据库,其中包含一个名为“users”的表格,其中包含“id”(主键自增长),“name”,“age”和“email”字段。

2. 在PHP中编写一个API接口,用于执行以下操作:- 从数据库中获取所有用户列表- 添加新的用户到数据库- 更新现有用户信息- 从数据库中删除用户3. 创建一个Vue组件来处理用户列表的显示和编辑。

组件中包括以下功能:- 接收API返回的用户列表并将其显示在表格中- 允许用户添加新的用户- 允许用户编辑现有用户信息- 允许用户删除现有用户4. 在Vue组件中利用axios库来调用PHP API,进行增删改查操作。

示例代码:PHP API接口:```<?phpheader("Access-Control-Allow-Origin: *");header("Access-Control-Allow-Headers: *");header('Content-Type: application/json'); $servername = "localhost:3307";$username = "root";$password = "";$dbname = "test";// 创建连接$conn = new mysqli($servername, $username, $password, $dbname);// 检查连接是否成功if ($conn->connect_error) {die("Connection failed: " . $conn->connect_error);}$request_method = $_SERVER["REQUEST_METHOD"]; switch ($request_method) {case 'GET':getUsers();break;case 'POST':addUser();break;case 'PUT':updateUser();break;case 'DELETE':deleteUser();break;default:echo json_encode(array('status' => false, 'message' => 'Invalid Request Method'));break;}function getUsers() {global $conn;$query = "SELECT * FROM users";$result = $conn->query($query);if ($result->num_rows > 0) {$rows = array();while ($row = $result->fetch_assoc()) {array_push($rows, $row);}echo json_encode(array('status' => true, 'data' => $rows));} else {echo json_encode(array('status' => false, 'message' => 'Data not found'));}}function addUser() {global $conn;$data = json_decode(file_get_contents('php://input'), true); $name = $data["name"];$age = $data["age"];$email = $data["email"];$query = "INSERT INTO users (name, age, email) VALUES ('$name', '$age', '$email')";if ($conn->query($query) === TRUE) {echo json_encode(array('status' => true, 'message' => 'User added successfully'));} else {echo json_encode(array('status' => false, 'message' => 'User addition failed'));}}function updateUser() {global $conn;$data = json_decode(file_get_contents('php://input'), true); $id = $data["id"];$name = $data["name"];$age = $data["age"];$email = $data["email"];$query = "UPDATE users SET name='$name', age='$age', email='$email' WHERE id=$id";if ($conn->query($query) === TRUE) {echo json_encode(array('status' => true, 'message' => 'User updated successfully'));} else {echo json_encode(array('status' => false, 'message' => 'User update failed'));}}function deleteUser() {global $conn;$data = json_decode(file_get_contents('php://input'), true); $id = $data["id"];$query = "DELETE FROM users WHERE id=$id";if ($conn->query($query) === TRUE) {echo json_encode(array('status' => true, 'message' => 'User deleted successfully'));} else {echo json_encode(array('status' => false, 'message' => 'User deletion failed'));}}$conn->close();>```Vue组件:```<template><div><form v-if="editMode" @submit.prevent="updateUser"> <input type="text" placeholder="Name" v-model="" required><input type="number" placeholder="Age" v-model="userToUpdate.age" required><input type="email" placeholder="Email" v-model="userToUpdate.email" required><button type="submit">Update</button><button type="button"@click="cancelUpdate">Cancel</button></form><*************************="addUser"><input type="text" placeholder="Name" v-model="" required><input type="number" placeholder="Age" v-model="newUser.age" required><input type="email" placeholder="Email" v-model="newUser.email" required><button type="submit">Add</button></form><table><thead><tr><th>Name</th><th>Age</th><th>Email</th><th>Action</th></tr></thead><tbody><tr v-for="user in users" :key="user.id"> <td>{{ }}</td><td>{{ user.age }}</td><td>{{ user.email }}</td><td><button type="button"@click="editUser(user)">Edit</button><button type="button"@click="deleteUser(user.id)">Delete</button> </td></tr></tbody></table></div></template><script>import axios from 'axios';export default {data() {return {users: [],newUser: { name: '', age: '', email: '' },userToUpdate: {},editMode: false}},mounted() {this.getUsers();},methods: {getUsers() {axios.get('http://localhost/vuephpmysql/api.php').then(response => {if (response.data.status) {ers = response.data.data;}}).catch(error => {console.log(error);})},addUser() {axios.post('http://localhost/vuephpmysql/api.php', this.newUser) .then(response => {if (response.data.status) { = '';this.newUser.age = '';this.newUser.email = '';}}).catch(error => {console.log(error);})},editUser(user) {erToUpdate = { er };this.editMode = true;},cancelUpdate() {erToUpdate = {};this.editMode = false;},updateUser() {axios.put(`http://localhost/vuephpmysql/api.php?id=${erTo Update.id}`, erToUpdate).then(response => {if (response.data.status) {this.getUsers();erToUpdate = {};this.editMode = false;}}).catch(error => {})},deleteUser(id) {axios.delete(`http://localhost/vuephpmysql/api.php?id=${id}`) .then(response => {if (response.data.status) {this.getUsers();}}).catch(error => {console.log(error);})}}}</script>```。

人人框架中使用element-ui树形数据表格展示两级分类并实现增删改查的一个示例

人人框架中使用element-ui树形数据表格展示两级分类并实现增删改查的一个示例

⼈⼈框架中使⽤element-ui树形数据表格展⽰两级分类并实现增删改查的⼀个⽰例basefishproducttype.vue<template><el-card shadow="never" class="aui-card--fill"><div class="mod-base__basefishproducttype}"><el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()"><el-form-item><el-input v-model="dataForm.id" placeholder="id" clearable></el-input></el-form-item><el-form-item><el-button @click="getDataList()">{{ $t('query') }}</el-button></el-form-item><el-form-item><el-button type="info" @click="exportHandle()">{{ $t('export') }}</el-button></el-form-item><el-form-item><el-button v-if="$hasPermission('base:basefishproducttype:save')" type="primary" @click="addOrUpdateHandle()">{{ '新增⼀级类型' }}</el-button></el-form-item><el-form-item><el-button v-if="$hasPermission('base:basefishproducttype:delete')" type="danger" @click="deleteHandle()">{{ $t('deleteBatch') }}</el-button></el-form-item></el-form><el-table v-loading="dataListLoading" :data="fishProductTypeListTree" row-key="id" :tree-props="{children: 'childBaseFishProductTypeDTOList'}" border @selection-change="dataListSelectionChangeHandle" style="width: 100%;"> <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column><!--<el-table-column prop="id" label="主键" header-align="center" align="center"></el-table-column>--><!--<el-table-column prop="delFlg" label="逻辑位 0失效1有效" header-align="center" align="center"></el-table-column>--><!--<el-table-column prop="delFlg" label="是否删除" header-align="center" align="center"></el-table-column>--><el-table-column prop="name" label="类型名称" header-align="center" align="center"></el-table-column><!--<el-table-column prop="pid" label="⽗级类型ID" header-align="center" align="center"></el-table-column>--><el-table-column prop="picUrl" label="类型图⽚" header-align="center" align="center"><template slot-scope="scope"><img :src="scope.row.picUrl" height="50px"></template></el-table-column><!--<el-table-column prop="fishType" label="渔品类型业务类型 0共有类型 1竞拍类型 2商城类型" header-align="center" align="center"></el-table-column>--><el-table-column prop="fishType" label="渔品类型业务类型" header-align="center" align="center" :formatter="showFishType"></el-table-column><!--<el-table-column prop="createUser" label="创建⼈" header-align="center" align="center"></el-table-column>--><!--<el-table-column prop="jsonCreateTime" label="创建时间" header-align="center" align="center"></el-table-column>--><!--<el-table-column prop="updateUser" label="更新⼈" header-align="center" align="center"></el-table-column>--><!--<el-table-column prop="jsonUpdateTime" label="更新时间" header-align="center" align="center"></el-table-column>--><el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150"><template slot-scope="scope"><el-button v-if="$hasPermission('base:basefishproducttype:update')" type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">{{ $t('update') }}</el-button><el-button v-if="$hasPermission('base:basefishproducttype:delete')" type="text" size="small" @click="deleteHandle(scope.row.id)">{{ $t('delete') }}</el-button><el-button v-if="scope.row.pid == ''" @click="addChildHandle(scope.row.id)">添加⼦类型</el-button></template></el-table-column></el-table><!--<el-pagination:current-page="page":page-sizes="[10, 20, 50, 100]":page-size="limit":total="total"layout="total, sizes, prev, pager, next, jumper"@size-change="pageSizeChangeHandle"@current-change="pageCurrentChangeHandle"></el-pagination>--><!-- 弹窗, 新增 / 修改 --><add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="selectTree"></add-or-update></div></el-card></template><script>import mixinViewModule from '@/mixins/view-module'import AddOrUpdate from './basefishproducttype-add-or-update'export default {mixins: [mixinViewModule],data () {return {mixinViewModuleOptions: {getDataListURL: '/base/basefishproducttype/page',getDataListIsPage: true,exportURL: '/base/basefishproducttype/export',deleteURL: '/base/basefishproducttype',deleteIsBatch: true,createdIsNeed: true},dataForm: {id: ''},fishProductTypeListTree: []}},components: {AddOrUpdate},created () {if (this.mixinViewModuleOptions.createdIsNeed) {this.init()}},methods: {init () {this.selectTree()},selectTree () {// 查询所有⽗分类及其⼦分类this.$http.get('/base/basefishproducttype/selectTree').then(({ data: res }) => {if (res.code !== 0) {return this.$message.error(res.msg)}// console.log(res)this.fishProductTypeListTree = res.data}).catch(() => {})},showFishType (row) {if (row.fishType === '0') {return '共有类型'} else if (row.fishType === '1') {return '竞拍类型'} else if (row.fishType === '2') {return '商城类型'}},// ⽗分类添加⼦分类addChildHandle (pid) {this.addOrUpdateVisible = truethis.$nextTick(() => {this.$refs.addOrUpdate.dataForm = {}this.$refs.addOrUpdate.dataForm.pid = pidthis.$refs.addOrUpdate.init()})},// 删除deleteHandle (id) {if (this.mixinViewModuleOptions.deleteIsBatch && !id && this.dataListSelections.length <= 0) {return this.$message({message: this.$t('prompt.deleteBatch'),type: 'warning',duration: 500})}this.$confirm(this.$t('', { handle: this.$t('delete') }), this.$t('prompt.title'), {confirmButtonText: this.$t('confirm'),cancelButtonText: this.$t('cancel'),type: 'warning'}).then(() => {this.$http.delete(`${this.mixinViewModuleOptions.deleteURL}${this.mixinViewModuleOptions.deleteIsBatch ? '' : '/' + id}`,this.mixinViewModuleOptions.deleteIsBatch ? {data: id ? [id] : this.dataListSelections.map(item => item[this.mixinViewModuleOptions.deleteIsBatchKey])} : {}).then(({ data: res }) => {if (res.code !== 0) {return this.$message.error(res.msg)}this.$message({message: this.$t('prompt.success'),type: 'success',duration: 500,onClose: () => {// 删除完成后进⾏查询this.selectTree()}})}).catch(() => {})}).catch(() => {})},}}</script>basefishproducttype-add-or-update.vue<template><el-dialog :visible.sync="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false"><el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmitHandle()" :label-width="$i18n.locale === 'en-US' ? '120px' : '80px'"> <!--<el-form-item label="创建⼈" prop="createUser"><el-input v-model="dataForm.createUser" placeholder="创建⼈"></el-input></el-form-item><el-form-item label="创建时间" prop="createTime"><el-input v-model="dataForm.createTime" placeholder="创建时间"></el-input></el-form-item><el-form-item label="更新⼈" prop="updateUser"><el-input v-model="dataForm.updateUser" placeholder="更新⼈"></el-input></el-form-item><el-form-item label="更新时间" prop="updateTime"><el-input v-model="dataForm.updateTime" placeholder="更新时间"></el-input></el-form-item>--><!--<el-form-item label="逻辑位 0失效1有效" prop="delFlg"><el-input v-model="dataForm.delFlg" placeholder="逻辑位 0失效1有效"></el-input></el-form-item>--><el-form-item label="类型名称" prop="name"><el-input v-model="" placeholder="类型名称"></el-input></el-form-item><!--<el-form-item label="⽗级类型ID" prop="pid"><el-input v-model="dataForm.pid" placeholder="⽗级类型ID"></el-input></el-form-item>--><!--<el-form-item label="⽗级类型" prop="pid"><el-select v-model="dataForm.pid" placeholder="⽗级类型"><el-optionv-for="item in fishProductTypeList":key="item.id":label="":value="item.id"></el-option></el-select></el-form-item>--><!--<el-form-item label="类型图⽚" prop="picUrl"><el-input v-model="dataForm.picUrl" placeholder="类型图⽚地址"></el-input></el-form-item>--><el-form-item label="类型图⽚" prop="picUrl"><el-uploadclass="avatar-uploader":action="uploadUrl":show-file-list="false":on-success="handleAvatarSuccess":before-upload="beforeAvatarUpload"><img v-if="imageUrl" :src="imageUrl" class="avatar"><i v-else class="el-icon-plus avatar-uploader-icon"></i></el-upload></el-form-item><!--<el-form-item label="渔品类型业务类型 0共有类型 1竞拍类型 2商城类型" prop="fishType"><el-input v-model="dataForm.fishType" placeholder="渔品类型业务类型 0共有类型 1竞拍类型 2商城类型"></el-input></el-form-item>--><!--<el-form-item label="渔品类型业务类型" prop="fishType"><el-input v-model="dataForm.fishType" placeholder="渔品类型业务类型"></el-input></el-form-item>--><el-form-item label="渔品类型业务类型" prop="fishType"><el-select v-model="dataForm.fishType" placeholder="渔品类型业务类型"><el-option label="共有类型" value="0"></el-option><el-option label="竞拍类型" value="1"></el-option><el-option label="商城类型" value="2"></el-option></el-select><template slot="footer"><el-button @click="visible = false">{{ $t('cancel') }}</el-button><el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button></template></el-dialog></template><script>import debounce from 'lodash/debounce'import Cookies from 'js-cookie'export default {data () {return {visible: false,dataForm: {id: '',createUser: '',createTime: '',updateUser: '',updateTime: '',delFlg: '',name: '',pid: '',picUrl: '',fishType: ''},fishProductTypeList: [],fishProductTypeListTree: [],uploadUrl: '',imageUrl: ''}},computed: {dataRule () {return {createUser: [{ required: true, message: this.$t('validate.required'), trigger: 'blur' }],createTime: [{ required: true, message: this.$t('validate.required'), trigger: 'blur' }],updateUser: [{ required: true, message: this.$t('validate.required'), trigger: 'blur' }],updateTime: [{ required: true, message: this.$t('validate.required'), trigger: 'blur' }],delFlg: [{ required: true, message: this.$t('validate.required'), trigger: 'blur' }],name: [{ required: true, message: this.$t('validate.required'), trigger: 'blur' }],/* pid: [{ required: true, message: this.$t('validate.required'), trigger: 'blur' }], *//* picUrl: [{ required: true, message: this.$t('validate.required'), trigger: 'blur' }], */fishType: [{ required: true, message: this.$t('validate.required'), trigger: 'blur' }]}}},methods: {init () {// 上传图⽚this.uploadUrl = `${window.SITE_CONFIG.apiURL}/sys/oss/upload?token=${Cookies.get('token')}` this.visible = true// 把上传表单中图⽚清空this.imageUrl = ''this.$nextTick(() => {this.$refs.dataForm.resetFields()if (this.dataForm.id) {this.getInfo()}})},handleAvatarSuccess (res) {// console.log(res)this.dataForm.picUrl = res.data.srcthis.imageUrl = res.data.src},beforeAvatarUpload (file) {const isJPG = file.type === 'image/jpeg'const isLt2M = file.size / 1024 / 1024 < 2if (!isJPG) {this.$message.error('上传头像图⽚只能是 JPG 格式!')}if (!isLt2M) {this.$message.error('上传头像图⽚⼤⼩不能超过 2MB!')}return isJPG && isLt2M},// 获取信息getInfo () {this.$http.get(`/base/basefishproducttype/${this.dataForm.id}`).then(({ data: res }) => {if (res.code !== 0) {return this.$message.error(res.msg)}// console.log(res)// 修改时上传表单中图⽚显⽰!!!this.imageUrl = res.data.picUrlthis.dataForm = {...this.dataForm,...res.data}}).catch(() => {})},// 表单提交dataFormSubmitHandle: debounce(function () {this.$refs.dataForm.validate((valid) => {}this.$http[!this.dataForm.id ? 'post' : 'put']('/base/basefishproducttype/', this.dataForm).then(({ data: res }) => { if (res.code !== 0) {return this.$message.error(res.msg)}this.$message({message: this.$t('prompt.success'),type: 'success',duration: 500,onClose: () => {this.visible = false// 新增或修改完成后查询数据刷新页⾯this.$emit('refreshDataList')}})}).catch(() => {})})}, 1000, { leading: true, trailing: false })}}</script><style>.avatar-uploader .el-upload {border: 1px dashed #d9d9d9;border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;}.avatar-uploader .el-upload:hover {border-color: #409EFF;}.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 178px;height: 178px;line-height: 178px;text-align: center;}.avatar {width: 178px;height: 178px;display: block;}</style>。

python轻量级orm框架peewee常用功能速查

python轻量级orm框架peewee常用功能速查

python 轻量级orm 框架peewee 常⽤功能速查peewee 常⽤功能速查peewee 简介Peewee 是⼀种简单⽽⼩的ORM 。

它有很少的(但富有表现⼒的)概念,使它易于学习和直观的使⽤。

常见orm 数据库框架Django ORM peeweeSQLAlchemyDjango ORM:易⽤,学习曲线短和Django 紧密集合,⽤Django 时使⽤约定俗成的⽅法去操作数据库:QuerySet 速度不给⼒,会逼我⽤Mysqldb 来操作原⽣sql 语句。

Peewee:Django 式的API ,使其易⽤轻量实现,很容易和任意web 框架集成:不⽀持⾃动化 schema 迁移不能像Django 那样,使线上的mysql 表结构⽣成结构化的模型。

SQLAlchemy:巨⽜逼的API ,使得代码有健壮性和适应性灵活的设计,使得能轻松写复杂查询:⼯作单元概念不常见重量级 API ,导致长学习曲线peewee 简单demo优点缺点优点缺点优点缺点import datetimefrom peewee import *db = MySQLDatabase("test", host="127.0.0.1", port=3306, user="root", passwd="123456")db.connect()class BaseModel(Model): class Meta:database = dbclass Person(BaseModel): name = CharField() age = IntegerField() height = IntegerField()sex = BooleanField(default='male')if __name__ == "__main__": Person.create_table()# 创建Person.create(name='tom', age=30, height=177)# 查询res = Person.select().where(=='tom') print(res) print(res[0])print(res[0].name) print(res[0].age) print(res[0].height) print(res[0].sex)>>>>SELECT `t1`.`id`, `t1`.`name`, `t1`.`age`, `t1`.`High`, `t1`.`sex` FROM `person` AS `t1` WHERE (`t1`.`name` = 'ljk')1tom 30177TrueModel 和 Field 关系在ORM 对象关系数据库中 Model 是⼀个类,映射到数据库表中就是⼀个表。

常见的ei eo eq 增删改查

常见的ei eo eq 增删改查

常见的ei eo eq 增删改查1. 前言在计算机科学领域,增删改查(CRUD)是指针对数据的基本操作,它们分别代表创建(Create)、读取(Read)、更新(Update)和删除(Delete)。

在数据库操作和软件开发中,对数据进行增删改查是非常常见和重要的操作,本文将讨论常见的ei、eo、eq(Entry Insert、Entry Update、Entry Query)操作,这些操作是针对数据库表中数据的增加、修改和查询的操作。

2. 常见的ei、eo、eq操作ei、eo、eq操作是针对数据库表中数据的增删改查操作,下面将分别介绍这三种操作的含义和常见实现方法。

2.1 ei(Entry Insert)ei操作是指向数据库表中插入新的数据记录。

当系统需要向数据库中添加新的数据时,就需要进行ei操作。

在实际应用中,通常会使用SQL语句或ORM框架来实现ei操作。

下面是一个使用SQL语句实现ei操作的示例:```sqlINSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);在上面的示例中,table_name是表名,column1、column2、column3等是表中的列名,value1、value2、value3等是待插入的数据值。

通过执行上面的SQL语句,就可以向数据库表中插入新的数据记录。

2.2 eo(Entry Update)eo操作是指对数据库表中现有的数据记录进行更新。

当系统需要修改数据库中已有的数据时,就需要进行eo操作。

同样,可以使用SQL 语句或ORM框架来实现eo操作。

下面是一个使用SQL语句实现eo 操作的示例:```sqlUPDATE table_nameSET column1 = value1, column2 = value2, ...WHERE condition;```在上面的示例中,table_name是表名,column1、column2等是需要更新的列名,value1、value2等是新的数据值,condition是更新的条件。

vue+element-ui实现数据的增删改查以及分页(举例新增学生)

vue+element-ui实现数据的增删改查以及分页(举例新增学生)

vue+element-ui实现数据的增删改查以及分页(举例新增学⽣)1.⾸先获取所有的学⽣信息并显⽰在表格上,进⾏分页。

后台要求传的参数:后台接⼝封装:element-ui创建数据。

必须有HTML表格<el-table :data="studentData" border style="width: 100%"><el-table-column prop="id" label="学号"></el-table-column><el-table-column prop="name" label="姓名"></el-table-column><el-table-column prop="age" label="年龄"></el-table-column><el-table-column prop="sex" label="性别"></el-table-column><el-table-column prop="major" label="专业"></el-table-column><el-table-column prop="depart" label="院系"></el-table-column><el-table-column prop="term" label="学期"></el-table-column><el-table-column prop="year" label="年级"></el-table-column><el-table-column prop="role" label="⾓⾊"></el-table-column><el-table-column label="操作"><template scope="scope"><el-button type="primary" size="small" @click="studentEdit(scope.$index, scope.row)">编辑</el-button><el-button type="danger" size="small" @click="studentDelete(scope.row)">删除</el-button> //scope.row代表当前对应⾏</template></el-table-column></el-table><div class="block" style="height:70px;"><el-pagination@size-change="sizeChange"@current-change="currentChange":page-sizes="[10,20,30,40]":page-size="page.pageSize"layout="total, sizes, prev, pager, next":total="page.totalRecords"></el-pagination></div>//新增学⽣信息模态框<el-dialog title="新增学⽣信息" :visible="addstudentForm" size="tiny" :modal-append-to-body='false' @close='closeDialog'><el-form id="#addsForm" ref="addsForm" :model="addsForm" label-width="80px"><el-form-item label="学号" prop="id"><el-input v-model="addsForm.id" max-length="10"></el-input></el-form-item><el-form-item label="姓名" prop="name"><el-input v-model=""></el-input></el-form-item><el-form-item label="年龄" prop="age"><el-input v-model="addsForm.age"></el-input></el-form-item><el-form-item label="性别" prop="sex"><el-input v-model="addsForm.sex"></el-input></el-form-item><el-form-item label="专业" prop="major"><el-input v-model="addsForm.major"></el-input></el-form-item><el-form-item label="院系" prop="depart"><el-input v-model="addsForm.depart"></el-input></el-form-item><el-form-item label="学期"><el-select v-model="addsForm.term" value-key="id"><el-option v-for="item in termArry" :key="item.id" :label="" :value="item.id"></el-option></el-select></el-form-item><el-form-item label="年级" prop="year"><el-input v-model="addsForm.year"></el-input></el-form-item><el-form-item label="⾓⾊" prop="role"><el-input v-model="addsForm.role" disabled="disabled"></el-input></el-form-item><el-form-item><el-button type="primary" @click="studentAdd()">确定</el-button><el-button @click="addstudentForm = false;canceladdT('formt')">取消</el-button></el-form-item></el-form></el-dialog>//编辑学⽣信息模态框<el-dialog title="编辑学⽣信息" :visible="editstudentForm" size="tiny" :modal-append-to-body='false' @close='closeDialog'><el-form ref="editsForm" :model="editsForm" label-width="80px"><el-form-item label="学号"><el-input v-model="editsForm.id" max-length="10" disabled="disabled"></el-input></el-form-item><el-form-item label="姓名"><el-input v-model=""></el-input></el-form-item><el-form-item label="年龄"><el-input v-model="editsForm.age"></el-input></el-form-item><el-form-item label="性别"><el-input v-model="editsForm.sex"></el-input></el-form-item><el-form-item label="专业"><el-input v-model="editsForm.major"></el-input></el-form-item><el-form-item label="院系"><el-input v-model="editsForm.depart"></el-input></el-form-item><el-form-item label="学期"><el-select v-model="editsForm.term" value-key="id"><el-option v-for="item in termArry" :key="item.id" :label="" :value="item.id"></el-option> </el-select></el-form-item><el-form-item label="年级"><el-input v-model="editsForm.year"></el-input></el-form-item><el-form-item label="⾓⾊"><el-input v-model="editsForm.role" disabled="disabled"></el-input></el-form-item><el-form-item label="密码"><el-input v-model="editsForm.passwd" disabled="disabled"></el-input></el-form-item><el-form-item><el-button type="primary" @click="studentcEdit()">确定</el-button><el-button @click="editstudentForm = false">取消</el-button></el-form-item></el-form></el-dialog>export default{data(){return{ studentData:[], //所有学⽣信息数组置空addstudentForm:false, //新增学⽣信息模态框page: {pageSize: 10, //每页条数, 默认10条totalRecords: 0, //总条数totalPages: 0, //总页数pageNum:0},addsForm:{id:'',name:'',age:"",sex:'',major:'',depart:'',term:'',year:'',role:'0'},editsForm:{id:'',name:'',age:"",sex:'',major:'',depart:'',term:'',year:'',role:'0',passwd:''},}}mounted(){ this.init() //页⾯内初始加载就调⽤这个函数}methods:{init(){this.studentData = [],let {pageNum,pageSize} = this.page; //es6写法// pageNum:页数从0开始//pageSize:每页显⽰10条this.$http.get(Main.getStudent(pageNum,pageSize)).then(res =>{let {errCode,errMsg}=res.data;this.page.totalRecords=res.data.totalRecords; //总条数if(errCode==0){const studentArray=res.data.dataList;this.studentData=studentArray;}else{alert(errMsg);}}, response => {})}// 每页显⽰多少条数据sizeChange(val) {this.page.pageSize = val;this.init();},//翻页currentChange(val) {this.page.pageNum=val-1;console.log(this.page.pageNum);this.init();},// 点击模态框关闭按钮关闭模态框closeDialog(){this.addstudentForm = false;this.editstudentForm = false;},//新增数据条数//新增学⽣信息后台提交参数// 点击新增按钮addStudent(){this.addstudentForm = true; //原来隐藏的新增信息模态框显⽰},// 点击新增学⽣信息模态框的确定按钮(确定新增信息)将所增信息提交给后台studentAdd(){let studentList=this.addsForm;let {id,name,age,sex,major,depart,term,year} = studentList;//判断数据是否为空if(id==''||name==''||age==''||sex==''||major==''||depart==''||term==''||year==''){this.$message.error('新增内容每⼀项都不准为空')}else{//每⼀条都不为空时才向后台发送http请求this.$http.post(Main.addStudent(),this.addsForm).then(res => {let {errCode,errMsg} = res.data;if(!errCode==1){this.$set(this.addsForm,{});this.init(); //重新渲染数据列表this.addstudentForm = false;}else{this.$message.error(errMsg); //弹出后台返回错误}}, response => {});}},//编辑修改数据和新增数据不⼀样的地⽅在于,编辑要获得原有数据在原有数据上⾯修改//编辑修改信息需要向后台提交的参数// 点击编辑按钮studentEdit(index,row){this.editstudentForm = true; //编辑信息模态框显⽰this.editsForm = Object.assign({}, row); 获得所有数据显⽰在编辑信息模态框⾥⾯},// 点击编辑信息弹框的确定按钮studentcEdit(){let studenteList=this.editsForm;console.log(studenteList);let {name,age,sex,major,depart,term,year} = studenteList;if(name==''||age==''||sex==''||major==''||depart==''||term==''||year==''){this.$message.error("修改内容除了不可编辑的每⼀项都不准为空")}else{this.$http.put(Main.changeStudenet(),this.editsForm).then(res => {let {errCode,errMsg} = res.data;if(!errCode==1){this.init();this.editstudentForm = false;}else{this.$message.error(errMsg);}}, response => {});}},//删除当前对应⾏数据//后台传 id和role进⾏删除studentDelete(user){this.$confirm('此操作将永久删除学⽣ ' + + ', 是否继续?', '提⽰', { type: 'warning' }) .then(() => { // 向服务端请求删除this.$http.delete(Main.deleteStudent(user.id,0)).then((response) => {this.$message.success('成功删除了学⽣' + + '!');this.init()}).catch((response) => {this.$message.error('删除失败!');});}) .catch(() => {this.$('已取消操作!');});},}},//页⾯图效果分页编辑删除:付出不⼀定有回报,但不付出⼀定没有回报!以上内容为⾃⼰项⽬中所得,若有不⾜望指出!。

c#轻量级ORM框架实现(一)

c#轻量级ORM框架实现(一)

c#轻量级ORM框架实现(⼀)发布⼀个⾃⼰写的⼀个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋友会很好理解.设计该框架的⽬的:不想重复的写增删改查,把精⼒放到功能实现上.发布改框架的原因:希望给初学者⼀个参考,希望能给予好的建议,给⾃⼰⼀个展⽰机会.在我开始之前,先说明⼀下,我对"软件⼯程学"概念东西⼏乎不通,最⾼⽂化程度:初⼆,所以不喜勿喷.开始我的orm设计最底层最底层的是⼀个DalBase,它是⼀个抽象的,实现了增删改查的基本操作.它既然是⼀个抽象的,那么它的内部就不应该有任何具体成员.它内部核⼼对象有:访问数据库的对象,⽣成sql⽂的对象的抽象定义,创建sql参数的抽象⽅法,where参数化查询对象的抽象定义./// <summary>/// 访问数据的DBHelper对象/// </summary>public abstract DbHelperBase DBHelper { get; } //⼦类实现/// <summary>/// 获得⽣成sql⽂本的对象/// </summary>protected internal abstract BuildSQL BuildSQLTextObj { get; }/// <summary>/// 获得数据参数对象/// </summary>protected internal abstract DbParameter GetDbParam(string paramName, object paramValue);/// <summary>/// 创建WhereHelper对象/// </summary>internal abstract WhereHelper CreateWhereHelper(); 如需扩展⽀持的数据库种类,只需要分别对这⼏个抽象对象进⾏具体代码的实现.以下代码是增删改(查询相对来说⽐较复杂,单独放出来) /// <summary>/// 执⾏sql语句返回所影响⾏数/// </summary>public virtual int ExecuteBySQL(string sqlText, Dictionary<string, object> dbParams){//执⾏sql语句的操作都由此⽅法实现DbParameter[] parameters = GetDbParam(dbParams);int rows = DBHelper.ExecNonQuery(sqlText, parameters);return rows;}/// <summary>/// 新增1条或多条/// </summary>public virtual int Add<TModel>(params TModel[] models) where TModel : ModelBase, new(){ThrowModelIsNullException(models);string sqlText;Dictionary<string, object> dbParams; //这句话其实内部实现访问了 BuildSQLObj 的 InsertSQLTExtAndParam ,它⽣成sql语句和sql参数对象,把它⼜写成⽅法是为了让⼦类还可以对它进⾏重写,这个或许之前想多了,直接重写Add也是可以的. GenerateInsertSQLTextAndParam(out sqlText, out dbParams, models);int rows = ExecuteBySQL(sqlText, dbParams);return rows;}/// <summary>/// 更新⼀条或多条记录,根据sql条件,指定更新字段(sqlWhere为空,则按主键更新)/// </summary>public virtual int Update<TModel>(string[] fields, string sqlWhere, Dictionary<string, object> dbParams, params TModel[] models) where TModel : ModelBase, new(){ThrowModelIsNullException(models);string sqlText;GenerateUpdateSQLTextAndParam(out sqlText, ref dbParams, sqlWhere, fields, models);int rows = ExecuteBySQL(sqlText, dbParams);return rows;}/// <summary>/// 更新⼀条或多条记录,根据sql条件,指定忽略更新的字段/// </summary>public virtual int UpdateByIgnoreField<TModel>(string[] ignoreFields, string sqlWhere, Dictionary<string, object> dbParams, params TModel[] models) where TModel : ModelBase, new(){string[] allFields = BuildSQLTextObj.GetAllFields<TModel>();string[] updateFields = BuildSQLTextObj.RemoveFields(allFields, ignoreFields);return Update(updateFields, sqlWhere, dbParams, models);}/// <summary>/// 根据主键删除记录/// </summary>public virtual int Delete<TModel>(params object[] pkValues) where TModel : ModelBase, new(){string sqlText;Dictionary<string, object> dbParams;if (pkValues == null || pkValues.Length < 0){throw new DbDataException("删除操作时主键为空!");}GenerateDeleteSQLTextAndParam<TModel>(out sqlText, out dbParams, pkValues);int rows = ExecuteBySQL(sqlText, dbParams);return rows;}查询提供了,3中⽅法,返回DataSet,返回List,返回DataReader,以及分页的⽅法public virtual DataTable GetDataTable<TModel>(string sqlWhere, Dictionary<string, object> dbParams, string[] orderFields, bool isDesc, params string[] selectFields) where TModel : ModelBase, new(){ string sqlText; GenerateSearchSQLTextAndParam<TModel>(sqlWhere, dbParams, orderFields, isDesc, out sqlText, selectFields); return GetDataTableBySQL(sqlText, dbParams);}public virtual DbDataReader GetDataReader<TModel>(string sqlWhere, Dictionary<string, object> dbParams, string[] orderFields, bool isDesc, params string[] selectFields) where TModel : ModelBase, new() { string sqlText; GenerateSearchSQLTextAndParam<TModel>(sqlWhere, dbParams, orderFields, isDesc, out sqlText, selectFields); return GetDataReaderBySQL(sqlText, dbParams);}public virtual List<TModel> GetList<TModel>(string sqlWhere, Dictionary<string, object> dbParams, string[] orderFields, bool isDesc, params string[] selectFields) where TModel : ModelBase, new(){ DbDataReader dbReader = GetDataReader<TModel>(sqlWhere, dbParams, orderFields, isDesc, selectFields); List<TModel> list = GetListByDataReader<TModel>(dbReader); return list;} 为什么有个DataReader⽅法呢,返回它有两个⽤处,1是把它转换成List,2因为DataSet的获取内部也是调⽤了DataReader⽅法,(通过反编译可以看到的)因为DataReader 转换 List 要⽐ DataTable to List的效率要快;DalBase的的基本功能其实就差不多了,下边来介绍下BLLbase的实现,BLLBase主要实现了dal⽅法的⼀些重载⽽已,从字⾯意思来说,业务逻辑的基类,我这⾥定义了业务逻辑的规则,⽐如Insert前(后)的事件,查询前的事件,等等..BLLBase⾥增删改其实和DalBase并⽆特别差别,就不介绍了.主要说下Get的⽅法.public virtual DataTable GetDataTable<TModel>(string[] selectFields, string[] orderFields, bool isDesc, WhereHelper dbWhereModel) where TModel : ModelBase, new(){StringBuilder sqlWhere = null;Dictionary<string, object> dbParam = null;GetSqlWhereParam(ref sqlWhere, ref dbParam, dbWhereModel);return GetDataTable<TModel>(sqlWhere.ToString(), dbParam, orderFields, isDesc, selectFields);}这是⼀个带where条件的查询,返回datatable,其它获取List,DataReader,⽅法都是⼀样的,WhereHelper这个类的创建,我⾃豪了很久,在下⾯将调⽤时会举例它的使⽤及实现.举个测试例⼦: 1.创建⼀个WinForm程序,引⽤ mon 和ZhCunFramework.DataAccess2.创建Models⽂件夹,分别建Test1.cs和Test2.cs ,这两个是表的映射.如下:namespace ZhCun.Framework.WinTest.Models{public class Test1 : ModelBase{[ModelAttribute(IsPrimaryKey = true, IsIdentity = true)]public int Id { set; get; }public string Name { set; get; }public string Age { set; get; }public string Remark { set; get; }}}映射的Model必须继承ModelBase,这就是为什么在DalBase⾥⾯加泛型约束的原因,其实ModelBase我并没有想好⽤它来实现什么,就当个限制条件吧.另外 ModelAttribute 特性,指定该属性的映射数据库表的类型及其它规则,这⾥Id表⽰是⼀个⾃增长的主键.3.创建⼀个BLLCommon 类,这个类名或许叫什么 XXXXServer ,或许更好⼀些,它继承了BLLBase并指定了连接字符串.那两个表就⼿⼯建⼀下吧,连接字符串可以直接指定写死喽public class BLLCommon : BLLBase{static string ConnStr{get{// "Data Source=192.168.0.55;Initial Catalog=aa;uid=sa;pwd=123";return Configurations.GetConnectString("Test");}}public BLLCommon(): base(DatabaseTypeEnum.SQLServer, ConnStr){ }}BLLCommon指定了连接字符串和数据库类型,如果⼀个项⽬使⽤多个(或多种)数据库,可以创建多个BLLCommon,BLLBase的所有⽅法都定义的虚⽅法,所以在这⾥可以重写你要改的东西,来完成业务逻辑的限制或约束.如,我想要在增加Test1表数据时,Remark赋值'aa'public override int Add<TModel>(params TModel[] models){foreach (var item in models){Test1 m = item as Test1;if (m != null){m.Remark = "aa";}}return base.Add<TModel>(models);}下⾯是调⽤代码:此代码实现了,新增和更新,及事务的使⽤⽅法. BLLCommon _BllObj = new BLLCommon();private void btnAdd_Click(object sender, EventArgs e){Test1 t1 = new Test1();Test2 t2 = new Test2(); = txtName.Text;t1.Age = txtAge.Text;t1.Remark = txtRemark.Text; = txtName.Text;t2.Age = txtAge.Text;t2.Remark = txtRemark.Text;try{_BllObj.TransStart();_BllObj.Add(t2);_BllObj.Add(t1);var model = _BllObj.GetModel<Test1>(1);if (model != null){model.Remark = "更新时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");_BllObj.Update(new string[] { "Remark" }, model);}_BllObj.TransCommit();MessageBox.Show("提交成功!");}catch (Exception ex){_BllObj.TransRollback();MessageBox.Show(ex.Message);}}带where查询的⽅法调⽤:WhereHelper wh1 = _BllObj.CreateWhereHelper();wh1.Add("Name").Equal("张三");List<Test1> list1 = _BllObj.GetList<Test1>(wh1);WhereHelper对象为啥要⽤BLLObj来创建,这个解释⼀下,考虑到不同数据库的查询应该有不同的语法,把WhereHelper抽象出来,也是为了扩展.引⽤BLLBase的时候指定了数据库,所以BLL是知道创建哪中数据库的WhereHelper的,所以⽤BLL对象来创建WhereHelper是最合适的,这样如果切换数据库不会受任何影响. wh1.Add("字段1").Equal(1).And("字段2").EqualNot(2); 这个是收到jquery的启发,来设计的类,每⼀个操作都返回了当前对象(即WhereHelper),也就是说,它可以⽆限的"点"下去.使⽤它的最⼤好处是:你不⽤考虑参数名的重复,不⽤考虑换库的兼容性,操作起来是如此简单. 关于WHereHelper的使⽤及设计思想请看:费劲的写了这么多,如果有⼈看有⼈有要求,或有什么建议,请留⾔.昨天看了⼀篇关于程序员的⽂章,⼀个优秀的程序员6⼤特质,其中之⼀是:懂的分享.把这套框架源码共享下下载说明: 本框架没有⽤于过任何商业⽤途(当然以后就不⼀定了) 欢迎指正,批评,优化,建议,抄袭及商业使⽤ 共享的⽬的是为了优化⼀下框架,接收⼀下建议,了解下不⾜.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Model1例子作者:深蓝王子SqlBean.javapackage com.jq92.bean;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class SqlBean {Connection con;PreparedStatement pre;ResultSet rs;public SqlBean(){try {Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");con=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;Dat abaseName=jq92Model1","sa","sa");} catch (ClassNotFoundException e) {// TODO自动生成 catch 块e.printStackTrace();} catch (SQLException e) {// TODO自动生成 catch 块e.printStackTrace();}}public int getInsert(String sql,JavaBean jBean){int count=0;try {//获得prepareStatementpre=con.prepareStatement(sql);//为前面的?赋值pre.setString(1,jBean.getName());pre.setString(2,jBean.getPassword());pre.setString(3,jBean.getSex());pre.setInt(4,jBean.getAge());count=pre.executeUpdate();} catch (SQLException e) {// TODO自动生成 catch 块e.printStackTrace();}return count;}public int getDelete(String sql,int id){ int count=0;try {pre=con.prepareStatement(sql);pre.setInt(1, id);count = pre.executeUpdate();} catch (SQLException e) {// TODO自动生成 catch 块e.printStackTrace();}return count;}public int getUpdate(String sql,JavaBean jBean){ int count=0;try {pre=con.prepareStatement(sql);pre.setString(1,jBean.getName());pre.setString(2,jBean.getPassword());pre.setString(3,jBean.getSex());pre.setInt(4,jBean.getAge());pre.setInt(5,jBean.getId());count=pre.executeUpdate();} catch (SQLException e) {e.printStackTrace();}return count;}public ResultSet getUpdate2(String sql,int id){ try {pre=con.prepareStatement(sql);pre.setInt(1, id);rs = pre.executeQuery();} catch (SQLException e) {// TODO自动生成 catch 块e.printStackTrace();}return rs;}public ResultSet getSearch(String sql){ try {pre=con.prepareStatement(sql);rs=pre.executeQuery();} catch (SQLException e) {// TODO自动生成 catch 块e.printStackTrace();}return rs;}}JavaBean.javapackage com.jq92.bean;public class JavaBean {private int id;private String name;private String password;private String sex;private int age;public JavaBean(){}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}}Insert.jsp<body><center><font size=7 color=red>92期学生管理页面用Model1实现</font><hr><form action="control.jsp" method="post"><table border=1><tr><td>姓名:</td><td><input name="name"></td></tr><tr><td>密码:</td><td><input type="password" name="password"></td></tr> <tr><td>性别:</td><td><input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女</td></tr><tr><td>年龄:</td><td><input name="age"></td></tr><tr><td colspan=2><center><input type="submit" name="submit" value="提交"> <input type="reset" value="重置"></center></td></tr></table></form></center></body></html>Control.jsp<body><%//修改编码方式r equest.setCharacterEncoding("gb2312");S tring name=request.getParameter("name");S tring password=request.getParameter("password");S tring sex=request.getParameter("sex");S tring Sage=request.getParameter("age");i nt age=Integer.parseInt(Sage);//封装到JavaBean对象当中去J avaBean jBean=new JavaBean();j Bean.setName(name);j Bean.setPassword(password);j Bean.setSex(sex);j Bean.setAge(age);//注册SQL语句S tring sql="insert into student values(?,?,?,?)";//实例化SqlBean对象S qlBean sBean=new SqlBean();i nt count=sBean.getInsert(sql,jBean);i f(count>0){%><jsp:forward page="SearchList.jsp"/><% }else{%><jsp:forward page="Error.jsp"><jsp:param name="error" value="注册"/></jsp:forward><%}%></body>Delete.jsp<body><%request.setCharacterEncoding("gb2312");String sid=request.getParameter("id");int id=Integer.parseInt(sid);String sql="delete from student where id=?";SqlBean sBean=new SqlBean();int count=sBean.getDelete(sql,id);if(count>0){%><jsp:forward page="SearchList.jsp"/><% }else{%><jsp:forward page="Error.jsp"><jsp:param name="error" value="删除"/></jsp:forward><%}%></body></html>SearchList.jsp<body><center><font size=7 color=red>92期学生信息如下:</font><table border=1><tr><td>id</td><td>姓名</td><td>密码</td><td>性别</td><td>年龄</td><td>操作</td><td>操作</td></tr><%S qlBean sBean=new SqlBean();S tring sql="select * from student order by id";R esultSet rs=sBean.getSearch(sql);w hile(rs.next()){%><tr><td><%=rs.getInt("id")%></td><td><%=rs.getString("name") %></td><td><%=rs. getString("password") %></td><td><%=rs.getString("sex") %></td><td><%=rs.getInt("ag e") %></td><td><a href='UpdatePage.jsp?id=<%=rs.getInt("id") %>'>更新</a></td><td><a href='Delete.jsp?id=<%=rs.getInt("id") %>'>删除</a></td></tr><%}%></table></center></body>UpdatePage.jsp<body><%S tring sql="select * from student where id=?";SqlBean sBean = new SqlBean();int id=Integer.parseInt(request.getParameter("id"));ResultSet rs=sBean.getUpdate2(sql,id);rs.next();%><center><font size=7 color=red>92期学生管理更新页面用Model1实现</font><hr><form action="Update.jsp" method="post" name="f1"><table border=1><tr><td>id</td><td><input type=text name=id value=<%=rs.getInt("id") %>></td> </tr><tr><td>姓名:</td><td><input name="name" value=<%=rs.getString("name")%>></td> </tr><tr><td>密码:</td><td><input type="password" name="password"value=<%=rs.getString("password") %>></td></tr><tr><td>性别:</td><td><input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女</td></tr><%i nt i1=1;if(rs.getString("sex").trim().equals("男"))i1=0;%><script>document.f1.sex[<%=i1%>].checked=true</script><tr><td>年龄:</td><td><input name="age" value=<%=rs.getInt("age") %>></td></tr><tr><td colspan=2><center><input type="submit" name="submit" value="提交"><input type="reset" value="重置"></center></td></tr></table></form></center></body>Update.jsp<body><%r equest.setCharacterEncoding("utf-8");S tring sid=request.getParameter("id");int id=Integer.parseInt(sid);String name=request.getParameter("name");String password=request.getParameter("password");String sex=request.getParameter("sex");String sAge=request.getParameter("age");int age=Integer.parseInt(sAge);JavaBean jBean=new JavaBean();j Bean.setName(name);j Bean.setPassword(password);j Bean.setSex(sex);j Bean.setAge(age);j Bean.setId(id);String sql="update student set name=?,password=?,sex=?,age=? where id=?";SqlBean sBean=new SqlBean();int count=sBean.getUpdate(sql,jBean);i f(count>0){%><jsp:forward page="SearchList.jsp"/><% }else{%><jsp:forward page="Error.jsp"><jsp:param name="error" value="修改"/></jsp:forward><%}%></body>Error.jsp<body><font size=5 color=red>对不起,您<%=request.getParameter("error") %>失败</font> </body>。

相关文档
最新文档