以新增用户为例子解释前后端整体连接方式详解(Service、Mapper、Controller、Entity)

目录

​编辑

前端

1、点击新增用户按钮执行 handleAdd() 方法

2、添加用户表单校验:(这里明显是简介版本,还有很大的优化空间)

3、点击表单里的确 定按钮通过 submitForm() 方法 来提交表单内容实现增加用户:

后端

1、C层--控制层(Conroller层):Controller

2、M层--业务层(Model层):Service——Serviceimpl

3、M层--业务层(Model层):Mapper——Mapper.xml

4、V层--视图层(View层):在Controller里操作完返回前端去做具体的显示

整合mybatis连接数据库(druid连接池方式连接)

1、添加mybatis依赖和Druid依赖

2、配置好Datasource---在application-druid.yml中

3、配置Mybatis---在application.yml中


前端

1、点击新增用户按钮执行 handleAdd() 方法

<el-col :span="1.5">
            <el-button
              type="primary"
              plain
              icon="el-icon-plus"
              size="mini"
              @click="handleAdd"
              v-hasPermi="['system:user:add']"
            >新增</el-button>
          </el-col>
 /** 新增按钮操作 */
    handleAdd() {
      this.reset();
      getUser().then(response => {
        this.postOptions = response.posts;
        this.roleOptions = response.roles;
        this.open = true;
        this.title = "添加用户";
        this.form.password = this.initPassword;
      });
    },

2、添加用户表单校验:(这里明显是简介版本,还有很大的优化空间)

     // 表单校验
      rules: {
        userName: [
          { required: true, message: "用户名称不能为空", trigger: "blur" },
          { min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
        ],
        nickName: [
          { required: true, message: "用户昵称不能为空", trigger: "blur" }
        ],
        password: [
          { required: true, message: "用户密码不能为空", trigger: "blur" },
          { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
        ],
        email: [
          {
            type: "email",
            message: "请输入正确的邮箱地址",
            trigger: ["blur", "change"]
          }
        ],
        phonenumber: [
          {
            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
            message: "请输入正确的手机号码",
            trigger: "blur"
          }
        ]
      }

3、点击表单里的确 定按钮通过 submitForm() 方法 来提交表单内容实现增加用户:

这里测试的是添加用户,所以放上addUser()的js代码。

  <el-button type="primary" @click="submitForm">确 定</el-button>
  /** 提交按钮 */
    submitForm: function() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.userId != undefined) {
            updateUser(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addUser(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
// 新增用户
export function addUser(data) {
  return request({
    url: '/system/user',
    method: 'post',
    data: data
  })
}

后端

1、C层--控制层(Conroller层):Controller

先通过@RequestMapping("/system/user")找到对应的

com.ruoyi.web.controller.system.SysUserController.java中的 add()方法

 /**
     * 新增用户
     */
    @PreAuthorize("@ss.hasPermi('system:user:add')")  //限定操作的权限
    @Log(title = "用户管理", businessType = BusinessType.INSERT)   //将增加用户记入日志管理
    @PostMapping  //映射@RequestMapping的位置
    public AjaxResult add(@Validated @RequestBody SysUser user)
    {//判断账号唯一性
        if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName())))
        {
            return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
        }//判断手机号码唯一性
        else if (StringUtils.isNotEmpty(user.getPhonenumber())
                && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
        {
            return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
        }//判断邮箱账号唯一性
        else if (StringUtils.isNotEmpty(user.getEmail())
                && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
        {
            return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
        user.setCreateBy(getUsername());
        //使用SecurityUtils里的方法对输入的明文密码进行一层加密处理方便存入数据库
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        //结束Controller层处理进入Service层再进入Mapper层操作完返回前端去吧      
        return toAjax(userService.insertUser(user));
    }

解释@Validated注解:主要是对某数据进行统一校验,如果数据异常则会统一抛出异常,方便异常中心统一处理。具体的校验方式写在Bean层里。比如这里的SysUser 就是com.ruoyi.common.core.domain.entity.SysUser.java 里有具体的数据格式限制

官方文档解释:后台手册 | RuoYi

Spring注解之@validated的使用 - 山高我为峰 - 博客园

解释@RequestBody注解:主要是将前端传过来的Json数据弄成String数据处理

2、M层--业务层(Model层):Service——Serviceimpl

 ISysUserService 对应  SysUserServiceImpl

 /**
     * 新增用户信息
     * 
     * @param user 用户信息
     * @return 结果
     */
    public int insertUser(SysUser user);
    /**
     * 新增保存用户信息
     * 
     * @param user 用户信息
     * @return 结果
     */
    @Override
    @Transactional
    public int insertUser(SysUser user)
    {
        // 新增用户信息
        int rows = userMapper.insertUser(user);
        // 新增用户岗位关联
        insertUserPost(user);
        // 新增用户与角色管理
        insertUserRole(user);
        return rows;
    }

@Transactional 注解:主要用于事务管理Ruoyi框架学习--事务_迷人的小松子的博客-CSDN博客

3、M层--业务层(Model层):Mapper——Mapper.xml

SysUserMapper 对应 SysUserMapper.xml

  /**
     * 新增用户信息
     * 
     * @param user 用户信息
     * @return 结果
     */
    public int insertUser(SysUser user);

 mapper.xml就是直接对数据库进行操作了。

	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
 		insert into sys_user(
 			<if test="userId != null and userId != 0">user_id,</if>
 			<if test="deptId != null and deptId != 0">dept_id,</if>
 			<if test="userName != null and userName != ''">user_name,</if>
 			<if test="nickName != null and nickName != ''">nick_name,</if>
 			<if test="email != null and email != ''">email,</if>
 			<if test="avatar != null and avatar != ''">avatar,</if>
 			<if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
 			<if test="sex != null and sex != ''">sex,</if>
 			<if test="password != null and password != ''">password,</if>
 			<if test="status != null and status != ''">status,</if>
 			<if test="createBy != null and createBy != ''">create_by,</if>
 			<if test="remark != null and remark != ''">remark,</if>
 			create_time
 		)values(
 			<if test="userId != null and userId != ''">#{userId},</if>
 			<if test="deptId != null and deptId != ''">#{deptId},</if>
 			<if test="userName != null and userName != ''">#{userName},</if>
 			<if test="nickName != null and nickName != ''">#{nickName},</if>
 			<if test="email != null and email != ''">#{email},</if>
 			<if test="avatar != null and avatar != ''">#{avatar},</if>
 			<if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
 			<if test="sex != null and sex != ''">#{sex},</if>
 			<if test="password != null and password != ''">#{password},</if>
 			<if test="status != null and status != ''">#{status},</if>
 			<if test="createBy != null and createBy != ''">#{createBy},</if>
 			<if test="remark != null and remark != ''">#{remark},</if>
 			sysdate()
 		)
	</insert>

4、V层--视图层(View层):在Controller里操作完返回前端去做具体的显示

 //结束Controller层处理进入Service层再进入Mapper层操作完返回前端去吧      
        return toAjax(userService.insertUser(user));
    /**
     * 响应返回结果
     * 
     * @param rows 影响行数
     * @return 操作结果
     */
    protected AjaxResult toAjax(int rows)
    {
        return rows > 0 ? AjaxResult.success() : AjaxResult.error();
    }

整合mybatis连接数据库(druid连接池方式连接)

1、添加mybatis依赖和Druid依赖

  <!-- SpringBoot集成mybatis框架 -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis-spring-boot.version}</version>
            </dependency>
 <!-- 阿里数据库连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>

2、配置好Datasource---在application-druid.yml中

# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://127.0.0.1:3306/rouyi?useSSL=false
                username: root
                password: root
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
                enabled: false
                url: 
                username: 
                password: 
            # 初始连接数
            initialSize: 5
            # 最小连接池数量
            minIdle: 10
            # 最大连接池数量
            maxActive: 20
            # 配置获取连接等待超时的时间
            maxWait: 60000
            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 60000
            # 配置一个连接在池中最小生存的时间,单位是毫秒
            minEvictableIdleTimeMillis: 300000
            # 配置一个连接在池中最大生存的时间,单位是毫秒
            maxEvictableIdleTimeMillis: 900000
            # 配置检测连接是否有效
            validationQuery: SELECT 1 FROM DUAL
            testWhileIdle: true
            testOnBorrow: false
            testOnReturn: false
            webStatFilter: 
                enabled: true
            statViewServlet:
                enabled: true
                # 设置白名单,不填则允许所有访问
                allow:
                url-pattern: /druid/*
                # 控制台管理用户名和密码
                login-username: ruoyi
                login-password: 123456
            filter:
                stat:
                    enabled: true
                    # 慢SQL记录
                    log-slow-sql: true
                    slow-sql-millis: 1000
                    merge-sql: true
                wall:
                    config:
                        multi-statement-allow: true

3、配置Mybatis---在application.yml中

# MyBatis配置
mybatis:
    # 搜索指定包别名
    typeAliasesPackage: com.ruoyi.**.domain
    # 配置mapper的扫描,找到所有的mapper.xml映射文件
    mapperLocations: classpath*:mapper/**/*Mapper.xml
    # 加载全局的配置文件
    configLocation: classpath:mybatis/mybatis-config.xml

后续就是在mapper层里写具体的sql语句代码了,也可以使用Mybatis自带的注解来加快开发速度,或者用插件直接一键生成对应简单的sql代码。

(好了,小伙,东西都搭起来了,好好干活吧!键盘敲烂,月薪过万!)