整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

MySql基础使用「增删改查」20211221

. 安装 msi版本

2. 添加删除数据库(DB)

	`create database database_name;` 	建立`database_name`数据库  
	`show databases;`   显示当前所有的数据库  
	`drop database database_name;`	删除database_name数据库  
	`use database_name;`使用`database_name`数据库  

3. mysql的数据类型

**数值类型 文本类型 时间类型**

https://www.cnblogs.com/-xlp/p/8617760.html

4. 添加和删除数据表(table)

https://www.cnblogs.com/whgk/p/6158107.html

 ```sql
 create table table_name(
 		id bigint(20),
 		..
 		..);
 drop table table_name(
```

5. 给数据表添加或者删除列'

  ```sql
  alter table table_name add column_name;'添加表'
  alter table table_name drop column_name;'删除表'
  alter table table_name rename new_table_name;'重命名表'
  ```

6. 修改某个数据列的名字或者数据类型


  ```sql
  alter table table_name change old_table_name new_table_name data type
  alter table account change city newcity varchar(255);'修改列的名字,但不修改数据类型'
  alter table account change newcity newcity text;'修改数据类型'
  alter table account change newcity city varchat;'列的名字和数据类型同时修改;'
  ```

7. 查看或者插入表格

 ```sql
  select * from tabel_name;查看所有表内容
  select col_name1,col_name2,....from table_name;'查看表内某几列的内容;'
  insert into table_name values (值1,值2)
  insert into table_name values(列1,列2...)values (值1,值2...)
 ```

8. wherer 查询条件

  ```sql
  select * form table_name 
  where col_name 运算符 ;
  = ,!,=,  >, <, <=, >=,between, like '通过 and   or 多个条件筛选'
  ex:  
  select *form table_name where col1=xxx and col2 = xx or col3>xxx;
  ```

9. null 的判断

  ```sql 
  ' 对于null的判读不能用= 或者!=来判断 需要用  is  或者is not '
  select * form  table_name where col_name is null;
  ```

10. select distinct去掉重复查询结果

 ```sql
	 select distinct col_name from table_name;'将重复的结果筛选掉。多次只输出一次。'
 ```

11. 使用order by对查询结果排序

```sql
	'按照单一列名排序'
	select *form table_name [where 子句] order by col_name[asc/desc] 
	'where 子句不能与order by子句置换'
	'按照多列排序'
	select *form table_name [where 子句] order by col_name[asc/desc] ,col2[asc/desc]
 ```

12. 使用limit截取查询结果

只显示前三行

`select * form table_name [where 子句][order by 子句]limit[offset,]rowcount`  

`offset` 表示记录从第一行 0开始 要开始截取的位置 比如 从第三行开始 offset =2,

`rowcount` 是从 `offset` 开始获取截取的在那个条数

举例 `limit 1,2` 是从第二条开始截取两条 结果输出第二 第三行记录。

13. 插入命令`insert`和查询命令`select`的组合使用

-将一个表格内的数据插入到另一个表格。-

``` 
insert into table_name values (值1,值2)
insert into table_name values(列1,列2...)values (值1,值2...)
'组合用法'
insert into table_name1 select col1,col2 from table_name2
insert into table_name1 (col1,col2) select col3,col4 from table_name2
``` 

14. 更新表的数据

修改单列

 `updata table_name set col_name=xxx[where 字句]`  

修改多列

`updata table_name set col_name=xxx,col2_name=xxx[where 字句]`

15. where语句中in操作符使用

 ```sql
  select * form tabel_name [where col_name in(value1,value2...)]
  select * from table_name [where col_name in(select筛选语句)]
 ```

16. where语句中between操作符使用

```sql
 select * form tabel_name [where col_name between value1 and value2]
 select * from table_name[where col_name not between value1 and value2]
```

17. where语句中like操作符使用

、系统结构:

① B/S架构:Browser/Server(浏览器/服务器的交互形式。)

  • Browser支持的语言:HTML、CSS、JavaScript;S是服务器端Server支持的语言有:C、C++、Java等
  • B/S架构系统有什么优点和缺点? 优点:升级方便,只升级服务器代码即可,维护成本低。缺点:速度慢、体验不好、界面不炫酷
  • 企业大部分使用B/S架构
  • B/S架构的系统代表有:京东、百度、天猫等

② C/S架构:Client/Server(客户端/服务器的交互形式。)

  • C/S架构的优点和缺点?
  • 优点:速度快、体验好、界面炫酷(娱乐性多数是C/S架构)
  • 缺点:升级麻烦、维护成本较高。
  • C/S架构的系统代表有:QQ、微信、支付宝等

2、 HTML概述

① 什么是HTML?② 怎么开发HTML?③ 怎么运行HTML?

  • ① HTML:Hyper Text Markup Language(超文本标记语言)

•由大量的标签组成,每一个标签都有开始标签和结束标签。

•超文本:图片、声音、视频等

  • ② HTML开发使用普通的文本编辑器就行,创建扩展名是.html或.htm

•编辑器有:HBuilder、vscode等

③ 直接采用浏览器打开HTML文件就能运行

④ HTML是谁制定的?

  • ④ W3C:世界万维网联盟

•W3C制定了HTML的规范:每个浏览器生产厂家都会遵守规范。HTML也会按照规范去写代码

•HTML规范目前最高的版本是:HTML5.0,简称H5

•我们现在主要学的HTML4.0(基本用法)

  • 为了方便中国Web前端程序员开发,提供了大量帮助文档。为开发提供方便。

•w3school:先出现的,和W3C无关

•w3cschool:后出现的,和W3C无关

•W3C制定了很多规范:HTML/XML/http协议/https协议……

3、 第一个HTML

4、基本标签

  • p:段落标记
  • h1~h6:标题字,与word的标题字相同
  • br:换行标记(独目标记)
  • hr:横线(独目标记)
  • color:横线颜色
  • width:横线宽度(可以px和%)
  • pre:预留格式
  • del:删除字
  • ins:插入字(有下划线)
  • b:粗体字
  • i:斜体字
  • sup:上标
  • sub:下标
  • font:字体标签
  • color:字体颜色
  • size:字体大小(1~7)

页面效果图:

5、实体符号:为了避免和标签冲突,所以需要使用实体符号

  • <:<
  • >:>
  • 空格:
  • 注:html中按多个空格键,在网页中只显示一个空格

6、HTML表格

  • table:表格
  • tr:行
  • td:列
  • th:列(比td加粗居中)
  • 合并行:rowspan(一个格占两个位置)
  • 注:row合并的时候,删除下面的单元格
  • 合并列:colspan(一个格占两个位置)
  • 注:col合并的时候,删除哪个没有要求

7、thead、tbody、tfoot标签

  • thead、tbody、tfoot不是必须的,便于后期JS编写。

8、body的背景颜色和背景图片

  • bgcolor:背景色
  • background:背景图片
  • 背景图片在背景色的上面

9、img标签

  • src:图片的路径
  • 只设置width,height会等比例缩放
  • 只设置height,不起作用
  • title:鼠标悬停时显示的信息
  • alt:设置图片加载失败时显示的提示信息

10、 超链接或热链接

  • href:hot references 热引用;
  • 后面一定是一个资源的地址。
  • 后面的路径可以是绝对路径也可以是相对路径,可以是网络某个资源的路径。
  • target:
  • _blank:新窗口
  • _self:当前窗口(默认)
  • _top:顶级窗口
  • _parent:父级窗口

超链接的作用:

通过超链接可以从浏览器向服务器发送请求。

11、request与response的概念

  • request:浏览器向服务器发送数据(请求)
  • B --》S
  • response:服务器向浏览器发送数据(响应)
  • S--》B

12、列表

  • 有序列表:ol
  • type:1、A、a、I、i
  • 无序列表:ul
  • type:circle(○)、square(□)、disc(●)

13、表单(重点)

  • action:写提交的URL地址
  • method:默认get;还有post
  • 表单有什么用?
  • 答:收集用户的信息。表单展现之后,用户填写表单,点击提交。 (submit)
  • 怎么画一个表单?
  • 答:用form标签
  • 一个网页可以有多个表单form
  • 表单最终是需要提交数据给服务器的,form标签有一个action属性,这个属性用来指定服务器地址。
  • action属性用来指定数据提交给哪个服务器
  • action属性和超链接中的href属性一样。都可以向服务器发送请求(request)
  • http://192.168.111.3:8080/oa/save 这是请求路径,
  • 表单提交数据最终提交给192.168.111.3机器上的8080端口对应的软件。
  • input中的type取值:
  • radio:单选控件
  • checkbox:多选控件
  • submit:提交控件
  • reset:重置控件
  • button:普通控件
  • text:文本控件
  • password:密码控
  • file:文件控件
  • 上传文件专用
  • hidden:隐藏域
  • 网页上看不到,但是表单提交的时候数据会自动提交给服务器。
  • input中的value属性用来指定按钮上显示的文本信息。
  • 超链接a与表单form的区别?
  • 答:表达form可以收集信息,而超链接a无法收集信息。
  • 表单提交里面的按钮input中属性必须定义name,不然提交不了。
  • 表单是以什么格式提交数据给服务器的?
  • 格式:action?name=value&name=value&name=value..
  • HTTP协议规定的,必须以这种格式提交给服务器
  • java中String split('&');
  • 重点强调:表单项写了name属性的,一律会提交给服务器。不想提交就不要写name属性。
  • 文本框和密码框的value不需要程序员指定,用户输入什么value就是什么。
  • 当name没有写的时候,该项不会提交给服务器
  • 但是当value没有写的时候,value的默认值是空字符串"",将空字符串提交给服务器。java代码得到的是:String s = "";

效果图:

地址栏提交的信息:

?username=abc&userpassowrd=1234&sex=1&aihao=study&aihao=dream&myText=我没有value属性;&position=ln&myFile=&myHidden=

14、表单的说明:

  • ① 用户手动输入的文本框,都不需要给value赋值
  • ② textarea没有value属性
  • ③ radio、checkbox默认选项需要使用,checked="checked"(简写:checked)
  • ④ select中的option属性:• selected="selected" 为默认选中 •size:显示条目数量
  • multiple="multiple" 支持多选(select的属性)
  • ⑤ input的属性
  • readonly和disabled:
  • 都是只读不能修改
  • 数据不会提交
  • maxlength:设置文本框中输入的字符数量。

15、HTML中的结点

  • 在HTML文档中,任何元素(结点)都有id属性,id属性是该节点的唯一标识。所以在同一个HTML文档中id值不能重复。
  • 注意:表单提交数据的时候,只和name有关系,和id无关
  • id有什么作用?
  • javascript语言:可以对HTML文档中的任何节点进行增删改操作。
  • 获取节点时,通常通过id来获取节点
  • HTML文档是一棵树,树上有很多节点,每一个节点都有唯一的id(DOM树)

16、div和span

  • div和span有什么用?
  • div和span都可以称为图层。
  • 有什么用?
  • 图层的作用为了保证页面可以灵活的布局。
  • div和span是可以定位的,只要定下div的左上角的x轴和y轴坐标即可。
  • div和span的区别?
  • di独占一行
  • span不会独占一行

有用吗?对于学完Spring、SpringMVC、Mybatis还无从下手的同学来说这是一个很好引子。对于正在学习同一个案例的同学,可能解决一些问题。对于需要这个案例的同学可以直接获取。

  有什么?xml配置文件编写,引入一个简单的前端框架,使用MyBatis Generator逆向工程生成一些代码,使用框架简单快速搭建一个页面,好用的分页工具PageHelper,简单的前后端分离,发送ajax请求,利用json传递数据,增、删、改、查的简单实现。

  简单吗?内容很简单,涉及Java代码不多,但是对于新手来说,最困难的部分是各种环境搭建、配置文件、版本冲突,如果能够根据错误提示动手解决,那就是一大进步。

  怎么学?如果有时间可以在B站搜索:ssm整合crud,雷丰阳讲的。如果想看到每个功能的实现过程和源码,可以在这里学习,每个步骤都有注释。也可以作为复习快速浏览。

3、新增

前端格式校验、用户名校验、后端校验、JSR303校验,效果如图

1. 员工新增模态框

使用弹出模态框作为新增模块,参考Bootstrap代码

  1. index.jsp添加新增模态框代码
 <!-- 为新增按钮增加模态框 ,利用按钮绑定单击事件-->
    <!-- Modal -->
    <div class="modal fade" id="empAddModal" tabindex="-1" role="dialog"
         aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"
                            aria-label="Close">
                        <span aria-hidden="true">×</span>
                    </button>
                    <h4 class="modal-title" id="myModalLabel">员工添加</h4>
                </div>
                <div class="modal-body">
                    <!-- 添加表单 -->
                    <form class="form-horizontal" id="model-form">
                        <!-- 姓名 -->
                        <div class="form-group">
                            <label for="empName_add_input" class="col-sm-2 control-label">EmpName</label>
                            <div class="col-sm-10">
                                <input type="text" class="form-control" name="empName" id="empName_add_input"
                                       placeholder="empName">
                                <!-- 用来显示错误提示 -->
                                <span class="help-block"></span>
                            </div>
                        </div>
                        <!-- 邮箱 -->
                        <div class="form-group">
                            <label for="email_add_input" class="col-sm-2 control-label">Email</label>
                            <div class="col-sm-10">
                                <input type="email" class="form-control" name="email" id="email_add_input"
                                       placeholder="empName@123.com">
                                <!-- 用来显示错误提示 -->
                                <span class="help-block"></span>
                            </div>
                        </div>
                        <!-- 性别 -->
                        <div class="form-group">
                            <label class="col-sm-2 control-label">Gender</label>
                            <div class="col-sm-10">
                                <!-- 单选 -->
                                <label for="gender1_add_input"> <input type="radio"
                                                                       name="gender" id="gender1_add_input"
                                                                       name="gender" value="M" checked>
                                    男
                                </label>
                                <label for="gender2_add_input"> <input type="radio"
                                                                       name="gender" id="gender2_add_input"
                                                                       name="gender" value="F">
                                    女
                                </label>
                            </div>
                        </div>
                        <!-- 部门下拉框 -->
                        <div class="form-group">
                            <label class="col-sm-2 control-label">DeptName</label>
                            <div class="col-sm-10">
                                <!-- 部门下拉列表使用ajax查询出来的动态拼接,值为部门id --> 
                                <select class="form-control" name="dId" id="deptName_add_select"></select>
                            </div>
                        </div>

                    </form>

                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                    <button type="button" class="btn btn-primary" id="emp_save_btn">保存</button>
                </div>
            </div>
        </div>
    </div>
  1. 绑定单击事件
    //添加模态栏    $("#emp_add_modal_btn").click(function() {
		//显示模态框
        $("#empAddModal").modal({
            //模态框参数,点击背景不关闭
            backdrop : "static"
        });
    });


    1. 创建一个查询部门的方法
   //新增模态框    $("#emp_add_modal_btn").click(function() {
        //添加模态栏之前将所表单信息清空,包括两项验证的css样式,显示模态栏之后就是空的
        //reset()方法是dom下的,使用[0]
        $("#empAddModal form")[0].reset();
        //清空输入格式、重名校验的css样式
        reset_form("#empAddModal form");
        //获取所有部门信息
        getDepts("#deptName_add_select");
        //添加模态框,在模态框中需要所有部门,所以需要查询所有部门信息
        $("#empAddModal").modal({
         //模态框参数,点击背景不关闭
            backdrop : "static"
     });
    });
  	//后面用
    //新增模态框--清除表单数据,样式
    function reset_form(ele) {
        $(ele)[0].reset();
        //该元素下所有css清除
        $(ele).find("*").removeClass("has-error has-success");
        //显示警告信息部分清空
        $(ele).find(".help-block").text("");
    }
    1. 发送查询部门的ajax请求
    //新增模态框--请求所有部门信息 function getDepts(ele){

     //---注意这里要清空---
        $(ele).empty();
        $.ajax({
            url:"${PATH}/depts",
            type:"GET",
            success:function(result){
                //console.log(result);
                //动态拼接
            }
        });
    }


  • 创建DepartmentController
  • package com.ssm.controller;
    
    import com.ssm.bean.Department;
    import com.ssm.bean.Msg;
    import com.ssm.service.DepartmentService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.util.List;
    
    /**
     * 部门信息
     */
    @Controller
    public class DepartmentController {
    
        @Autowired
     private DepartmentService departmentService;
    
     /**
         * 获取所有部门信息
         * @return
         */
        @ResponseBody
        @RequestMapping("/depts")
        public Msg getDepts() {
            List<Department> depts = departmentService.getDepts();
            return Msg.success().add("depts", depts);
        }
    }
      1. 创建DepartmentService
    package com.ssm.service;
    
    import com.ssm.bean.Department;
    import com.ssm.dao.DepartmentMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * 部门信息
     */
    @Service
    public class DepartmentService {
    
        @Autowired
     DepartmentMapper departmentMapper;
    
        /**
         * 查询所有部门
         */
        public List<Department> getDepts(){
            //方法本身可以添加查询条件,如果为null代表查所有
            List<Department> list = departmentMapper.selectByExample(null);
            return list;
        }
    }


    1. 动态拼接
       //新增模态框--请求所有部门信息    function getDepts(ele){
    
            //---注意这里要清空---
            $(ele).empty();
            $.ajax({
            url:"${PATH}/depts",
            type:"GET",
                success:function(result){
                    //console.log(result);
                    $.each(result.extend.depts,function(index,item){
                        //创建出option并添加到select中
                        var optionEle = $("<option></option>").append(item.deptName).attr("value",item.deptId);
                        optionEle.appendTo(ele);
                    });
                }
            });
        }

    效果

    2. 基本员工新增

    绑定保存按钮

     //------------------增删改查都使用REST风格-------------------    //新增保存信息 
        $("#emp_save_btn").click(function(){
            //1、模态框中填写的表单数据提交给服务器进行保存
            //2、发送ajax请求保存员工
            $.ajax({
                url:"${PATH}/saveemp",
                type:"POST",
                data:$("#empAddModal form").serialize(),
                //.serialize()方法能将表单中数据序列化,直接发送给controll封装成Bean
                //console.log($("#empAddModal form").serialize());
                //empName=Tom&email=Tom%40123.com&gender=M&dId=1
                success:function(result){
                    //1.添加成功,关闭模态框
                    $("#empAddModal").modal("hide");
                    //2.来到最后一页,显示插入的数据,可以直接跳到一个很大的页数,因为
                    //合理性,所以不会超出,这里使用全局参数,数据总条数
                    to_page(totalRecord+1);
                }
            });
          

    EmployeeController

      @ResponseBody    @RequestMapping(value = "/saveemp",method = RequestMethod.POST)
        public Msg saveEmp(Employee employee, BindingResult result) {
            employeeService.saveEmp(employee);
            return Msg.success();
        }

    EmployeeService

        /**
         * 保存emp员工,insert
         * @param employee
         */
        public void saveEmp(Employee employee) {
            //这个是有选择插入,insert()全插入,包括id
            employeeMapper.insertSelective(employee);
        }

    前端校验

    一共有两种验证方式 1.输入框焦点单独验证 2.提交按钮总验证,为了不两种方式的css样式相互覆盖,每种方式都验两遍,格式在前,用户名在后

    (内部Java格式验证)+ ajax用户名验证(实现方法看下一小节)

       //1.(内部Java格式验证)+ ajax用户名验证    //新增保存信息--ajax用户名校验
        //由于在java内又做了一次格式验证,所以这个方法相当于即验证了格式,又验证了重名
        $("#empName_add_input").blur(function () {
    
            //发送ajax请求,验证用户名是否可用
            var empName = this.value;
            $.ajax({
                url: "${PATH}/checkname",
                data: "empName=" + empName,
                type: "POST",
                success: function (result) {
                    console.log(result);
                    //获取到返回值,Msg中的状态码
                    if (result.code == 2333) {
                        show_validate_msg("#empName_add_input", "success", "用户名可用");
                        //因为使用了两种方式验证,格式和重名,会有css样式冲突覆盖,所以再加一次验证
                        //自定义属性,或全局变量
                        //给添加按钮添加自定义属性,在提交时判断是否通过两项验证。
                        $("#emp_save_btn").attr("ajax-vl", "success");
    
    
                    } else if (result.code == 5555) {
                        show_validate_msg("#empName_add_input", "error", result.extend.msg);
    
                        $("#emp_save_btn").attr("ajax-vl", "error");
    
                    }
                }
            });
        });

    邮箱格式独立校验

     //2. 邮箱独立验证    //新增保存信息--独立邮箱格式验证
        $("#email_add_input").blur(function () {
            var email = $("#email_add_input").val();
            var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
            if (!regEmail.test(email)) {
                //alert("邮箱格式不正确");
                show_validate_msg("#email_add_input", "error", "邮箱格式不正确");
                //return false;
            } else {
                show_validate_msg("#email_add_input", "success", "");
            }
            //最后方法通过
            //return true;
        })

    格式+用户名验证+提交保存请求

        //3. 格式+用户名验证+提交保存请求,一共有两种验证方式 1.输入框焦点单独验证 2.提交按钮总验证,    //为了不两种方式的css样式相互覆盖,每种方式都验两遍,格式在前,用户名在后
        //新增保存信息--请求
        $("#emp_save_btn").click(function () {
            //点击就发送请求,保存使用POST请求
    
    
            //1.先验证ajax重名校验,防止用户输入重复用户名之后,直接输入正确的邮箱,点击提交,重名的验证提示会被覆盖
            //ajax-vl是ajax重名校验之后添加的自定义属性,用于表示提交按钮是否可用
            if ($(this).attr("ajax-vl") == "error") {
                return false;
            }
            //2.点击保存按钮请求之前完整验证一遍输入格式
            //JQuery格式总验证
            if (!validate_add_form()) {
                return false;
            }
            //3.重名验证
            //ajax重名校验
            if ($(this).attr("ajax-vl") == "error") {
                return false;
            }
            //1、模态框中填写的表单数据提交给服务器进行保存
            //2、发送ajax请求保存员工
            $.ajax({
                url: "${PATH}/saveemp",
                type: "POST",
                data: $("#empAddModal form").serialize(),
                //.serialize()方法能将表单中数据序列化,直接发送给controll封装成Bean
                //console.log($("#empAddModal form").serialize());
                //empName=Tom&email=Tom%40123.com&gender=M&dId=1
                success: function (result) {
                    //1.添加成功,关闭模态框
                    $("#empAddModal").modal("hide");
                    //2.来到最后一页,显示插入的数据,可以直接跳到一个很大的页数,因为
                    //合理性,所以不会超出,这里使用全局参数,参数值在上面分页时获取的,数据总条数+1保证不出现极端情况
                    to_page(totalRecord + 1);
                }
            });
        });

    请求按钮JQuery格式总校验方法

      //新增保存信息--请求按钮JQuery格式总校验方法    function validate_add_form() {
            console.log("validate_add_form()")
            //1.拿到校验的数据,使用正则表达式
            //根据bootstrap提供的组件
            //校验用户名
            var empName = $("#empName_add_input").val();
            var regName = /(^[a-zA-Z0-9_-]{2,8}$)|(^[\u2E80-\u9FFF]{2,5})/;
            if (!regName.test(empName)) {
                //alert("用户名可以是2-5位中文或者2-8位英文和数字的组合");
                show_validate_msg("#empName_add_input", "error", "用户名可以是2-5位中文或者2-8位英文和数字的组合");
                return false;
            } else {
                show_validate_msg("#empName_add_input", "success", "");
            }
            //2、校验邮箱信息
            var email = $("#email_add_input").val();
            var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
            if (!regEmail.test(email)) {
                //alert("邮箱格式不正确");
                show_validate_msg("#email_add_input", "error", "邮箱格式不正确");
                return false;
            } else {
                show_validate_msg("#email_add_input", "success", "");
            }
            //最后方法通过
            return true;
        }

    添加样式方法

       //新增保存信息--添加css样式    //show_validate_msg显示校验状态,通过添加样式,ele表示被选择元素,status状态
        //用来判断是用什么样式,绿色、红色,msg提示信息
        function show_validate_msg(ele, status, msg) {
            //判断之前先清空之前样式
            $(ele).parent().removeClass("has-success has-error");
            $(ele).next("span").text("");
            if ("success" == status) {
                $(ele).parent().addClass("has-success");
                $(ele).next("span").text(msg)
            } else if ("error" == status) {
                $(ele).parent().addClass("has-error");
                $(ele).next("span").text(msg)
            }
        }

    4. ajax用户名校验

    如果添加相同的用户名会造成混淆,所以在输入用户名之后立即进行校验

    发送ajax请求(与上一节相同)

       $("#empName_add_input").blur(function () {
    
            //发送ajax请求,验证用户名是否可用
            var empName = this.value;
            $.ajax({
                url: "${PATH}/checkname",
                data: "empName=" + empName,
                type: "POST",
                success: function (result) {
                    console.log(result);
                    //获取到返回值,Msg中的状态码
                    if (result.code == 2333) {
                        show_validate_msg("#empName_add_input", "success", "用户名可用");
                        //因为使用了两种方式验证,格式和重名,会有css样式冲突覆盖,所以再加一次验证
                        //自定义属性,或全局变量
                        //给添加按钮添加自定义属性,在提交时判断是否通过两项验证。
                        $("#emp_save_btn").attr("ajax-vl", "success");
    
    
                    } else if (result.code == 5555) {
                        show_validate_msg("#empName_add_input", "error", result.extend.msg);
                        $("#emp_save_btn").attr("ajax-vl", "error");
    
                    }
                }
            });
        });

    EmployeeController

       /**
         * 用户名查重
         * 前端校验,在失去焦点,保存之前都校验
         * @param empName
         * @return
         */
        @ResponseBody
        @RequestMapping("/checkname")
        public Msg checkEmpName(@RequestParam("empName")String empName) {
    
            //用户名格式校验
            String regx = "(^[a-zA-Z0-9_-]{2,8}$)|(^[\\u2E80-\\u9FFF]{2,5})";
            if(!empName.matches(regx)){
                return Msg.fail().add("msg", "用户名可以是2-5位中文或者2-8位英文和数字的组合");
            }
            //返回查询统计结果,true说明没有重名
            boolean b = employeeService.checkEmpName(empName);
            if(b) {
                return Msg.success();
            }else {
                return Msg.fail().add("msg", "用户名已存在");
            }
        }

    EmployeeService

       /**
         * 查询用户是否存在
         * 使用Example复杂查询
         *
         * @param name
         * @return
         */
        public boolean checkEmpName(String name) {
            //Example用法
            EmployeeExample example = new EmployeeExample();
            //创建查询条件
            EmployeeExample.Criteria criteria = example.createCriteria();
            //我的理解:这一句相当于添加了一个条件 where empName=name
            criteria.andEmpNameEqualTo(name);
            //统计查询结构
            long count = employeeMapper.countByExample(example);
            //返回true(0)说明没有重复用户名
            return count == 0;
        }

    5. JSR303校验

    前面是前端校验,现在是后端校验,针对Java

    添加JSR303依赖

    	<!-- JSR303校验 -->
    		<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
    		<dependency>
    			<groupId>org.hibernate.validator</groupId>
    			<artifactId>hibernate-validator</artifactId>
    			<version>6.1.0.Final</version>
    		</dependency>

    在JavaBean上添加注解

    
    public class Employee {
        private Integer empId;
    
        //JSR303自定义校验规则
        @Pattern(regexp = "(^[a-zA-Z0-9_-]{2,8}$)|(^[\\u2E80-\\u9FFF]{2,5})", message = "用户名可以是2-5位中文或者2-8位英文和数字的组合")
        private String empName;
    
        private String gender;
    
        @Pattern(regexp = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$",message = "邮箱格式不正确")
        private String email;
        
        //...

    在Controller方法中使用,在参数前添加注解,在参数后面添加结果参数

       /**
         * 新增,保存用户,并验证
         *
         * 添加JSR303校验
         * @Valid表示校验下一个对象
         * BindingResult紧跟被校验对象,接收结果
         *
         * @param employee
         * @return
         */
        @ResponseBody
        @RequestMapping(value = "/saveemp",method = RequestMethod.POST)
        public Msg saveEmp(@Valid Employee employee, BindingResult result) {
    
            if(result.hasErrors()) {
                //格式校验失败,返回信息
                Map<String ,Object> map = new HashMap<>();
                List<FieldError> fieldErrors = result.getFieldErrors();
                for(FieldError error : fieldErrors) {
                    System.out.println("错误的字段名:" + error.getField());
                    System.out.println("错误信息:" + error.getDefaultMessage());
                    //将错误信息放到map中
                    map.put(error.getField(), error.getDefaultMessage());
                }
                return Msg.fail().add("errorFields", map);
    
            }else if(!employeeService.checkEmpName(employee.getEmpName())){
                //后端在保存的时候再次验证是否存在用户名---有点 重复的感觉???
                //因为是在一起接收所以错误信息一定要一样,empName手动写上
                return Msg.fail().add("empName", "用户名已存在");
            }else {
    
                employeeService.saveEmp(employee);
                //不用这种:获取总页数,用在新增完之后跳转到最后一页,不过这样就会多查一次数据库
                //PageInfo<Employee> pageInfo = employeeService.getPage(null);
                //return Msg.success().add("pageInfo", pageInfo);
                return Msg.success();
            }
        }

    index.jsp提交按钮中处理返回结果

       //3. 格式+用户名验证+提交保存请求,一共有两种验证方式 1.输入框焦点单独验证 2.提交按钮总验证,    //为了不两种方式的css样式相互覆盖,每种方式都验两遍,格式在前,用户名在后
        //新增保存信息--请求
        $("#emp_save_btn").click(function () {
            //点击就发送请求,保存使用POST请求
    
            //1.先验证ajax重名校验,防止用户输入重复用户名之后,直接输入正确的邮箱,点击提交,重名的验证提示会被覆盖
            if ($(this).attr("ajax-vl") == "error") {
                return false;
            }
            //2.点击保存按钮请求之前完整验证一遍输入格式
            console.log("JQuery格式总验证")
            //方法一:JQuery格式总验证
            if (!validate_add_form()) {
                return false;
            }
            //3.重名验证
            console.log("ajax重名校验")
            //ajax重名校验
            if ($(this).attr("ajax-vl") == "error") {
                return false;
            }
            //1、模态框中填写的表单数据提交给服务器进行保存
            //2、发送ajax请求保存员工
            $.ajax({
                url: "${PATH}/saveemp",
                type: "POST",
                data: $("#empAddModal form").serialize(),
                //.serialize()方法能将表单中数据序列化,直接发送给controll封装成Bean
                //console.log($("#empAddModal form").serialize());
                //empName=Tom&email=Tom%40123.com&gender=M&dId=1
                success: function (result) {
    
                    //清除模态框和提示信息
                    $("#empAddModal form").find("*").removeClass("has-error has-success");
                    $("#empAddModal form").find(".help-block").text("");
    
                    //在这里判断后端JSR303校验结果,最后一次!!!!!!!!!真的
                    //前后端验证可以独立运行,注释前端后端也能实现一样效果
                    if(result.code == 2333){
    
                        //alert(result.msg);
                        //1.添加成功,关闭模态框
                        $("#empAddModal").modal("hide");
                        //2.来到最后一页,显示插入的数据,可以直接跳到一个很大的页数,因为
                        //合理性,所以不会超出,这里使用全局参数,数据总条数+1保证不出现极端情况
                        to_page(totalRecord + 1);
                    }else{
                        //失败,显示信息,有几个就显示几个
                        //undefined 就是没找到这个错误,说明正确,可用alert(result.extend.errorFields.empName)验证
                        //用户名格式
                        //alert(result.extend.errorFields.empName)
    
                        //用户名格式和查重,因为查重的属性格式和格式验证不同,所以不能分开
                        //result.extend.errorFields.empName 格式验证
                        //result.extend.empName 查重验证
                        if(undefined != result.extend.errorFields ){
                            //格式错误
                            if(undefined != result.extend.errorFields.empName){
                                show_validate_msg("#empName_add_input","error",result.extend.errorFields.empName);
                            }
                        }else{
                            if(undefined != result.extend.empName){
                                //查重错误
                                show_validate_msg("#empName_add_input","error",result.extend.empName);
                            }
                        }
                        //邮箱格式判断
                        if(undefined != result.extend.errorFields){
                            if(undefined != result.extend.errorFields.email){
                                show_validate_msg("#email_add_input","error",result.extend.errorFields.email);
                            }
                        }
                    }
                }
            });
        });

    6. 完整代码

    模态框

        <!-- 为新增按钮增加模态框 ,利用按钮绑定单击事件-->
        <!-- Modal -->
        <div class="modal fade" id="empAddModal" tabindex="-1" role="dialog"
             aria-labelledby="myModalLabel">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal"
                                aria-label="Close">
                            <span aria-hidden="true">×</span>
                        </button>
                        <h4 class="modal-title" id="myModalLabel">员工添加</h4>
                    </div>
                    <div class="modal-body">
                        <!-- 添加表单 -->
                        <form class="form-horizontal" id="model-form">
                            <!-- 姓名 -->
                            <div class="form-group">
                                <label for="empName_add_input" class="col-sm-2 control-label">EmpName</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" name="empName" id="empName_add_input"
                                           placeholder="empName">
                                    <!-- 用来显示错误提示 -->
                                    <span class="help-block"></span>
                                </div>
                            </div>
                            <!-- 邮箱 -->
                            <div class="form-group">
                                <label for="email_add_input" class="col-sm-2 control-label">Email</label>
                                <div class="col-sm-10">
                                    <input type="email" class="form-control" name="email" id="email_add_input"
                                           placeholder="empName@123.com">
                                    <!-- 用来显示错误提示 -->
                                    <span class="help-block"></span>
                                </div>
                            </div>
                            <!-- 性别 -->
                            <div class="form-group">
                                <label class="col-sm-2 control-label">Gender</label>
                                <div class="col-sm-10">
                                    <!-- 单选 -->
                                    <label for="gender1_add_input"> <input type="radio"
                                                                           name="gender" id="gender1_add_input"
                                                                           name="gender" value="M" checked>
                                        男
                                    </label>
                                    <label for="gender2_add_input"> <input type="radio"
                                                                           name="gender" id="gender2_add_input"
                                                                           name="gender" value="F">
                                        女
                                    </label>
                                </div>
                            </div>
                            <!-- 部门下拉框 -->
                            <div class="form-group">
                                <label class="col-sm-2 control-label">DeptName</label>
                                <div class="col-sm-10">
                                    <!-- 部门下拉列表使用ajax查询出来的动态拼接,值为部门id -->
                                    <select class="form-control" name="dId" id="deptName_add_select"></select>
                                </div>
                            </div>
    
                        </form>
    
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                        <button type="button" class="btn btn-primary" id="emp_save_btn">保存</button>
                    </div>
                </div>
            </div>
        </div>

    请求和方法

    <script type="text/javascript">
        //------------------增删改查都使用REST风格-------------------
    
        //1.(内部Java格式验证)+ ajax用户名验证
        //新增保存信息--ajax用户名校验
        //由于在java内又做了一次格式验证,所以这个方法相当于即验证了格式,又验证了重名
        $("#empName_add_input").blur(function () {
    
            //发送ajax请求,验证用户名是否可用
            var empName = this.value;
            $.ajax({
                url: "${PATH}/checkname",
                data: "empName=" + empName,
                type: "POST",
                success: function (result) {
                    console.log(result);
                    //获取到返回值,Msg中的状态码
                    if (result.code == 2333) {
                        show_validate_msg("#empName_add_input", "success", "用户名可用");
                        //因为使用了两种方式验证,格式和重名,会有css样式冲突覆盖,所以再加一次验证
                        //自定义属性,或全局变量
                        //给添加按钮添加自定义属性,在提交时判断是否通过两项验证。
                        $("#emp_save_btn").attr("ajax-vl", "success");
    
                    } else if (result.code == 5555) {
                        show_validate_msg("#empName_add_input", "error", result.extend.msg);
                        $("#emp_save_btn").attr("ajax-vl", "error");
    
                    }
                }
            });
        });
    
        //2. 邮箱独立验证
        //新增保存信息--独立邮箱格式验证
        $("#email_add_input").blur(function () {
            var email = $("#email_add_input").val();
            var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
            if (!regEmail.test(email)) {
                //alert("邮箱格式不正确");
                show_validate_msg("#email_add_input", "error", "邮箱格式不正确");
                //return false;
            } else {
                show_validate_msg("#email_add_input", "success", "");
            }
            //最后方法通过
            //return true;
        })
    
        //3. 格式+用户名验证+提交保存请求,一共有两种验证方式 1.输入框焦点单独验证 2.提交按钮总验证,
        //为了不两种方式的css样式相互覆盖,每种方式都验两遍,格式在前,用户名在后
        //新增保存信息--请求
        $("#emp_save_btn").click(function () {
            //点击就发送请求,保存使用POST请求
    
            //1.先验证ajax重名校验,防止用户输入重复用户名之后,直接输入正确的邮箱,点击提交,重名的验证提示会被覆盖
            if ($(this).attr("ajax-vl") == "error") {
                return false;
            }
            //2.点击保存按钮请求之前完整验证一遍输入格式
            console.log("JQuery格式总验证")
            //方法一:JQuery格式总验证
            if (!validate_add_form()) {
                return false;
            }
            //3.重名验证
            console.log("ajax重名校验")
            //ajax重名校验
            if ($(this).attr("ajax-vl") == "error") {
                return false;
            }
            //1、模态框中填写的表单数据提交给服务器进行保存
            //2、发送ajax请求保存员工
            $.ajax({
                url: "${PATH}/saveemp",
                type: "POST",
                data: $("#empAddModal form").serialize(),
                //.serialize()方法能将表单中数据序列化,直接发送给controll封装成Bean
                //console.log($("#empAddModal form").serialize());
                //empName=Tom&email=Tom%40123.com&gender=M&dId=1
                success: function (result) {
    
                    //清除模态框和提示信息
                    $("#empAddModal form").find("*").removeClass("has-error has-success");
                    $("#empAddModal form").find(".help-block").text("");
    
                    //在这里判断后端JSR303校验结果,最后一次!!!!!!!!!真的
                    //前后端验证可以独立运行,注释前端后端也能实现一样效果
                    if(result.code == 2333){
    
                        //alert(result.msg);
                        //1.添加成功,关闭模态框
                        $("#empAddModal").modal("hide");
                        //2.来到最后一页,显示插入的数据,可以直接跳到一个很大的页数,因为
                        //合理性,所以不会超出,这里使用全局参数,数据总条数+1保证不出现极端情况
                        to_page(totalRecord + 1);
                    }else{
                        //失败,显示信息,有几个就显示几个
                        //undefined 就是没找到这个错误,说明正确,可用alert(result.extend.errorFields.empName)验证
                        //用户名格式
                        //alert(result.extend.errorFields.empName)
    
                        //用户名格式和查重,因为查重的属性格式和格式验证不同,所以不能分开
                        //result.extend.errorFields.empName 格式验证
                        //result.extend.empName 查重验证
                        if(undefined != result.extend.errorFields ){
                            //格式错误
                            if(undefined != result.extend.errorFields.empName){
                                show_validate_msg("#empName_add_input","error",result.extend.errorFields.empName);
                            }
                        }else{
                            if(undefined != result.extend.empName){
                                //查重错误
                                show_validate_msg("#empName_add_input","error",result.extend.empName);
                            }
                        }
                        //邮箱格式判断
                        if(undefined != result.extend.errorFields){
                            if(undefined != result.extend.errorFields.email){
                                show_validate_msg("#email_add_input","error",result.extend.errorFields.email);
                            }
                        }
                    }
                }
            });
        });
    
        //新增保存信息--请求按钮JQuery格式总校验方法
        function validate_add_form() {
            console.log("validate_add_form()")
            //1.拿到校验的数据,使用正则表达式
            //根据bootstrap提供的组件
            //校验用户名
            var empName = $("#empName_add_input").val();
            var regName = /(^[a-zA-Z0-9_-]{2,8}$)|(^[\u2E80-\u9FFF]{2,5})/;
            if (!regName.test(empName)) {
                //alert("用户名可以是2-5位中文或者2-8位英文和数字的组合");
                show_validate_msg("#empName_add_input", "error", "用户名可以是2-5位中文或者2-8位英文和数字的组合");
                return false;
            } else {
                show_validate_msg("#empName_add_input", "success", "");
            }
            //2、校验邮箱信息
            var email = $("#email_add_input").val();
            var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
            if (!regEmail.test(email)) {
                //alert("邮箱格式不正确");
                show_validate_msg("#email_add_input", "error", "邮箱格式不正确");
                return false;
            } else {
                show_validate_msg("#email_add_input", "success", "");
            }
            //最后方法通过
            return true;
        }
    
        //新增保存信息--添加css样式
        //show_validate_msg显示校验状态,通过添加样式,ele表示被选择元素,status状态
        //用来判断是用什么样式,绿色、红色,msg提示信息
        function show_validate_msg(ele, status, msg) {
            //判断之前先清空之前样式
            $(ele).parent().removeClass("has-success has-error");
            $(ele).next("span").text("");
            if ("success" == status) {
                $(ele).parent().addClass("has-success");
                $(ele).next("span").text(msg)
            } else if ("error" == status) {
                $(ele).parent().addClass("has-error");
                $(ele).next("span").text(msg)
            }
        }
    </script>



    __EOF__

    本文作者: 蔚然丶丶

    本文链接: https://www.cnblogs.com/wei-ran/p/16131419.html