增删改查最终总结—2.1.1(单表-增删改查)

一个 Mybatis 开发神器:Fast MyBatis 超好用

————————Fast Mybatis开发文档

每一个增删改查前都要先看这个--增删改查操作 都需要注意:

1、在控制层最后一行代码return给用户,正确的响应

return SysResult.success(有的需要传参数给用户[比如需要回显的东西:商品分类列表、用户之前填的邮箱密码等]就直接把之前控制层接收到的参数写进来);

2、事务控制
1、事务控制- 以后操作数据库时 ,只要是 新增/删除/修改操作 就必须需要事务控制.
1、现象:业务逻辑在执行的过程中,如果中间发生了异常,应该保证事务的一致性.事务应该回滚.但是经过测试,发现执行报异常,但是数据可以正常的入库. 说明方法没有事务的控制.

2、解决方法:

@Transactional //事务的注解
特点:
1.Spring中默认对事务进行支持——加@Transactional //事务的注解
2.Spring中默认控制的是运行时异常. 如果是检查异常 Spring不负责处理.如果想让Spring处理检查异常就需要加@Transactional(rollbackFor = Exception.class) 只要有异常,则全部回滚.

        核心原理: AOP

        问题: 但如果采用上述2.的代码,则AOP拦截所有的异常,运行效率低. 所以一般只拦截运行时异常.检查异常由程序员手动控制.@Transactional(rollbackFor = Exception.class)根本不用

3、如何正式操作2、  :
在service层 实现类中的每个 增删改查方法 上加上@Transactional(readOnly=true)

//或者直接在service层实现类上加一个@Transactional(readOnly=true)即可

注意:

写个@Transactional默认事务处理方式@Transactional(readOnly=false),相当于是添加了一个排他锁/同步锁,我查询的时候别人只能等待

所以我们可以加上@Transactional(readOnly=true),这样就会成了一个只读事务

一、增insert(数据新增/入库)

1、新增的数据无 密码 这一项的情况


       1、规律


都是 用户在浏览器整个提交的form表单数据 封装为js对象进行参数传递,在controller层接用(user)对象接
注意:1、sql语句没有where条件(新数据无id,新增完成才有id可用)
           2、无返回值,service层不用return


        2、不同框架写法

多个where条件:controller层将其封装成对象(user)传过来



               1)mybatis框架


service层接口

void saveUser(User user);

service层接口实现类

 @Override
    public void saveUser(User user) { 
            user.setStatus(true)
                .setCreated(date)
                .setUpdated(date);
        userMapper.saveUser(user);
    }

               1>映射文件写法

mapper层接口

    void saveUser(User user);

......Mapper.xml映射文件

<insert id="saveUser" >
//1、insert into demo_user(id,name,age,sex) values (null,#{name},#{age},#{sex})
		
2、insert into user(id,username,phone,email,status,created,updated) value (null,#{username},#{password},#{phone},#{email},#{status},#{created},#{updated})				            
    </insert>
新增此处用 value ;但是values好像也行


普通增 sql语句写的不是values,是value
   相比于数据库中插入数据 要加字段名,且后面不是values,是value

待研究

待研究————values还是value 还有下面的注解写法也一样
           2>注解方式写法
mapper层接口

    @insert(insert into 表名 value (null,#{deptName})")  //新增此处用value,values好像也行
     void saveUser(User user);

2)mybatis-plus框架

 注意: MP中

新增/入库操作提供了:insert方法;如果指定了条件就按指定的条件。

——如下

 service层接口

void saveUser(User user);

service层接口实现类

 @Override
    public void updateUserById(Integer id) {
        user.setUsername("admin888")
                .setEmail("[email protected]")
                .setPhone("15534495677")
                .setStatus(true)
                .setCreated(new Date())
                .setUpdated(user.getCreated());
        //返回的是影响的行数,可接可不接
        int rows = userMapper.insert(user);//把user当数据传进去
        System.out.println("影响的行数:"+rows);
    }

2、新增的数据有 密码 这一项的情况

用户的密码在业务层加密后才能往数据库存

将用户输入的明文密码转变为密文才能存入数据库;

                新增操作必须在业务层实现类用对象.set().set().set()……入库

 1)mybatis框架

service层接口

void saveUser(User user);

service层接口实现类

    @Override
    public void saveUser(User user) {
        //将密码加密处理
        String password = user.getPassword();//获取密码
        String md5Pass = DigestUtils.md5DigestAsHex(password.getBytes());//加密处理
 
        Date date = new Date();
        user.setPassword(md5Pass)
                .setStatus(true)
                .setCreated(date)
                .setUpdated(date);
        userMapper.saveUser(user);
    }

               1>映射文件写法

mapper层接口

    void saveUser(User user);

......Mapper.xml映射文件

<insert id="saveUser" >
//1、insert into demo_user(id,name,age,sex) values (null,#{name},#{age},#{sex})
		
2、insert into user(id,username,phone,email,status,created,updated) value (null,#{username},#{password},#{phone},#{email},#{status},#{created},#{updated})				            
    </insert>
新增此处用 value ;但是values好像也行


普通增 sql语句写的不是values,是value
   相比于数据库中插入数据 要加字段名,且后面不是values,是value

待研究

待研究————values还是value 还有下面的注解写法也一样
           2>注解方式写法
mapper层接口

    @insert(insert into 表名 value (null,#{deptName})")  //新增此处用value,values好像也行
     void saveUser(User user);

2)mybatis-plus框架

 注意: MP中

新增/入库操作提供了:insert方法;如果指定了条件就按指定的条件。

——如下

 service层接口

void saveUser(User user);

service层接口实现类

 @Override
    public void updateUserById(Integer id) {
      //将密码加密处理
        String password = user.getPassword();//获取密码
        String md5Pass = DigestUtils.md5DigestAsHex(password.getBytes());//加密处理

        user.setUsername("admin888")
             .setPassword(md5Pass)
    
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值