区块链技术博客
www.b2bchain.cn

03增删改-查

这篇文章主要介绍了03增删改-查的讲解,通过具体代码实例进行17702 讲解,并且分析了03增删改-查的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=17702

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

文章目录

    • 单表查询 resultMap
    • 一对一关联查询(4种方式 少用)
    • 法一
    • 法二
    • 一对多查询(2种方式,少用)
    • 总结
  • 增删改
    • 增删改返回值说明
  • Mybatis获取自增主键
    • 插入后查询获取主键
    • 插入前查询获取主键

主要内容

单表查询3种方式详解  一对一关联查询(4种方式)详解  一对多查询(2种方式)详解  综合案例  总结  建议  源码 

单表查询 resultMap

Mapper

public interface OrderMapper {     OrderModel getById(int id); } 

Model

@Setter @Getter @NoArgsConstructor @AllArgsConstructor @Builder @ToString public class OrderModel {     private Integer id;     private Integer userId;     private Long createTime;     private Long upTime; } 

Mapper.xml

    <resultMap id="kk" type="orderModel">         <id column="id" property="id" />         <result column="user_id" property="userId" />         <result column="create_time" property="createTime" />         <result column="up_time" property="upTime" />     </resultMap>     <select id="getById" resultMap="kk">         SELECT a.id,a.user_id,a.create_time,a.up_time FROM t_order a WHERE a.id=#{value}     </select> 

上面resultMap有2个元素需要指定:

id:resultMap标识

type:将结果封装成什么类型,此处我们需要将结果分装为OrderModel

注意上面的select元素,有个resultMap,标识查询结果使用哪个resultMap进行映射,此处我们使用的是orderModelMap2,所以查询结果会按照orderModelMap2关联的resultMap进行映射。

Mapper接口

OrderModel getById2(int id); 

测试:

  @Test     public void getById(){         OrderModel byId = orderMapper.getById(1);         System.out.println(byId);     } 

一对一关联查询(4种方式 少用)

需求
通过订单id查询订单的时候,将订单关联的用户信息也返回。

我们修改一下OrderModel代码,内部添加一个UserModel,如下:
03增删改-查
03增删改-查

法一

03增删改-查
注意重点在于上面的这两行:

这个地方使用到了级联赋值,多级之间用.进行引用,此处我们只有一级,可以有很多级。 测试

 @Test     public void  getById1(){         OrderModel byId1 = orderMapper.getById1(1);         System.out.println(byId1);     } 

结果
03增删改-查

法二

元素association,这个元素可以配置关联对象的映射关系
03增删改-查
注意上面下面这部分代码:

注意上面的property属性,这个就是配置sql查询结果和OrderModel.userModel对象的映射关系,将user_id和userModel中的id进行映射,name和userModel中的name进行映射。

一对多查询(2种方式,少用)

需求
根据订单id查询出订单信息,并且查询出订单明细列表。
先修改一下OrderModel代码,如下:
03增删改-查
OrderModel中添加了一个集合orderDetailModelList用来存放订单详情列表。
OrderDetailModel

@Getter @Setter @Builder @ToString @NoArgsConstructor @AllArgsConstructor public class OrderDetailModel {     private Integer id;     private Integer orderId;     private Integer goodsId;     private Integer num;     private Double totalPrice; } 

03增删改-查
注意上面的getById2中的sql,这个sql中使用到了t_order和t_order_detail连接查询,这个查询会返回多条结果,但是最后结果按照orderModelMap1进行映射,最后只会返回一个OrderModel对象,关键在于collection元素,这个元素用来定义集合中元素的映射关系,有2个属性需要注意:

property:对应的属性名称  ofType:集合中元素的类型,此处是OrderDetailModel 

原理是这样的,注意orderModelMap1中有个

< id column=“id” property=“id”/>
查询出来的结果会按照这个配置中指定的column进行分组,即按照订单id进行分组,每个订单对应多个订单明细,订单明细会按照collection的配置映射为ofType元素指定的对象。

实际resultMap元素中的id元素可以使用result元素代替,只是用id可以提升性能,mybatis可以通过id元素配置的列的值判断唯一一条记录,如果我们使用result元素,那么判断是否是同一条记录的时候,需要通过所有列去判断了,所以通过id可以提升性能,使用id元素在一对多中可以提升性能,在单表查询中使用id元素还是result元素,性能都是一样的。
测试

@Test     public void getById2(){         System.out.println(orderMapper.getById2(1));     } 

结果
03增删改-查

总结

mybatis全局配置文件中通过mapUnderscoreToCamelCase可以开启sql中的字段和javabean中的骆驼命名法的字段进行自动映射

掌握resultMap元素常见的用法

一对一关联查询使用resultMap->association元素(2种方式)

一对多查询使用resultMap->collection元素(2种方式)

resultMap中使用id元素主要在复杂的关联查询中可以提升效率,可以通过这个来判断记录的唯一性,如果没有这个,需要通过所有的result相关的列才能判断记录的唯一性

建议
mybatis为我们提供了强大的关联查询,不过个人建议尽量少用,最好是采用单表的方式查询,在程序中通过多次查询,然后自己对结果进行组装。

Model中最好只定义一些和单表字段关联的属性,不要掺杂着其他对象的引用。

增删改

主要内容

建库建表  mybatis增删改返回值说明及源码解析  jdbc获取自增值的3种方式详解  mybatis获取自增值的3种方式详解 

增删改返回值说明

mybatis中对db执行增删改操作,不管是新增、删除、还是修改,最后都会去调用jdbc中对应的方法,
要么是调用java.sql.Statement的executeUpdate的方法,
要么是调用java.sql.PreparedStatement的executeUpdate方法,
这2个类的方法名称都是executeUpdate,他们的参数可能不一样,但是他们的返回值都是int,说明增删改的返回值都是int类型的
表示影响的行数,比如插入成功1行返回结果就是1,删除了10行记录,返回就是10,更新了5行记录,返回的就是5。

那么我们通过Mybatis中的Mapper接口来对db增删改的时候,mybatis的返回值支持哪些类型呢?

int类型那肯定是支持的,jdbc执行增删改默认返回int类型,那mybatis当然也支持这个类型。

但是mybatis的返回值比jdbc更强大,对于增删改还支持下面几种类型:

int Integer long  Long boolean Boolean void 

mapper的增删改方法返回值必须为上面的类型,mybatis内部将jdbc返回的int类型转换为上面列表中指定的类型,我们来看一下mybatis这块的源码,源码在下面的方法中:

org.apache.ibatis.binding.MapperMethod#rowCountResult
我们来看一下这个方法的源码:

private Object rowCountResult(int rowCount) {     final Object result;     if (method.returnsVoid()) {       result = null;     } else if (Integer.class.equals(method.getReturnType()) || Integer.TYPE.equals(method.getReturnType())) {       result = rowCount;     } else if (Long.class.equals(method.getReturnType()) || Long.TYPE.equals(method.getReturnType())) {       result = (long)rowCount;     } else if (Boolean.class.equals(method.getReturnType()) || Boolean.TYPE.equals(method.getReturnType())) {       result = rowCount > 0;     } else {       throw new BindingException("Mapper method '" + command.getName() + "' has an unsupported return type: " + method.getReturnType());     }     return result;   } 

mybatis中会使用上面这个方法最后会对jdbc 增删改返回的int结果进行处理,处理为mapper接口中增删改方法返回值的类型。

int、Integer、long、Long我们就不说了,主要说一下返回值是boolean、Boolean类型,如果影响的行数大于0了,将返回true。

Mybatis获取自增主键

插入后查询获取主键

03增删改-查
关键代码是selectKey元素包含的部分,这个元素内部可以包含一个sql,这个sql可以在插入之前或者插入之后运行(之前还是之后通过order属性配置),然后会将sql运行的结果设置给keyProperty指定的属性,selectKey元素有3个属性需要指定:

keyProperty:参数对象中的属性名称,最后插入成功之后,mybatis会通过反射将自增值设置给keyProperty指定的这个属性

order:指定selectKey元素中的sql是在插入之前运行还是插入之后运行,可选值(BEFORE|AFTER),这种方式中我们选择AFTER

resultType:keyProperty指定的属性对应的类型,如上面的id对应的类型是java.lang.Long,我们直接写的是别名long

插入前查询获取主键

03增删改-查

本文转自互联网,侵权联系删除03增删改-查

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 03增删改-查
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们