一个 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)