ssm(2)

通用Mapper

 

 

逆向工程的问题:

在生成类的时候,也生成了类对应的Example 类。

我们能不能只要实体类。

 

生成的sql 很全,但是不够灵活。

一旦生成,就不能再改变了;假设我给类(表)多添加几个字段,生成的sql语句就废了。

怎么办?

Sql Mapper 文件 全部删除,再用逆向工程重新生成。

 

但是这个操作很危险

 

有没有更好的方案

 

1. 通用mapper

2. mybatis plus

3. spring data jpa

mybatis 无缝集成了通用mapper  约等于  mybatis plus

 

应该是现有通用 mapper 后有 mybatis plus (自己查)

 

思想基本一摸一样,但是具体代码不太一样。

 

其实他们三个的思想都一样,会一个 ,其他两个就会了。

 

谁抄谁的?  读书人的事,怎么能说抄呢。

 

 

一、 通用Mapper 的使用

通用mapper 的作用是替代 逆向工程生成的内容

 

 

框架的整合

先整合 Spring ,再整合Spring MVC, 再整合Mapper

 

我就直接在我们现有的项目上修改了。

mybatis 替换成 通用mapper 即可。

 

如果让大家搭建,你们搭建到逆向工程的时候停止,然后直接引入通用mapper即可。

 


 

严格来说,通用mapper 替代了 逆向工程生成的内容。

还是要依赖 MyBatis 的。

 

 

二、 框架的整合

 1.引用依赖

<dependency>

    <groupId>tk.mybatis</groupId>

    <artifactId>mapper</artifactId>

    <!-- 建议使用最新版本,最新版本请从项目首页查找 -->

    <version>x.x.x</version>

</dependency>

 

  1. 集成到框架中

 

你没看错,就是这么配置的,注意这里是 tk.mybatis.xxx,和MyBatis的唯一区别就是 org. 改成了 tk.,方便修改和记忆。

 

这样 原生的Mybatis 就集成了通用Mapper 功能。

 

为什么这么设计? 就是为了方便替换。

 

 

  1. dao 接口 只需要 继承 Mapper
  2.  

     这样就可以通用mapper提供的各种方法

  3.  

     

     

     使用mapper

  4.  

     

     

     

    我们发现 EmployeeMapper 是空的,但是我们用的时候发现它有各种增删改查的方法。

     

    为什么?

    答案其实很明显,方法要么来自自己,要么来自父类。

    所以这里,方法一定是来自 Mapper

     

    源码:

  5.  

     

    用我们的条件动态的构建sql语句,最终返回sql语句。

     

    到这里会发现,通用mapper和逆向工程的原理基本一样,都是构建sql语句。

    只不过通用mapper 更加灵活。

     

    dao 代码:

  6.  

     service代码

  7.  

     controller代码

  8.  

     测试

  9.  

     关于包扫描问题

  10.  

     

     

     

    已经配置了包扫描,扫描dao 包,实例化dao包中的接口;所以不用在Mapper接口上添加注解了。

     

    我们后面 spring boot 整合 通用mapper ,需要添加注解。

    spring boot 基本是配置。

     

    一、 类与表的对应关系

     

    通用mapper 会默认 表的名字跟类的名字一致。

    Employee   employee (不区分大小写)   默认

     

    Employee 想变成 tbl_emp  怎么办?

  11.  

     

     

     

    表与类的对应搞定了,字段与属性不对应怎么办?

     

    正常情况下,一定要注意命名规范,这样我们就不用花费额外时间考虑类的属性与表的字段的对应了。

  12.  

     

    一、 Lombok 的使用

     

    帮我们自动生成 get/set 构造函数等。

    需要引入依赖

  13. <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.20</version>
    </dependency>

  14.  

     

     

     

     

     

    一、 灵活

    通用 mapper 逆向工程比,更加灵活。

    我们来做一个实验,直接添加一个 password字段。

    逆向工程:

    一定删除生成的 dao,mapper,mapper.xml 重新生成新的 dao,mapper,mapper.xml

    通用mapper:

      我们现在没有动其他东西,只是在类上加了一个属性。

  15. 经过测试,什么都没有改,可以根据 id password 实现登录

    为什么????

    因为通用mapper sql 语句是在运行期间根据参数 利用 反射 动态生成的。

    而逆向工程是提前生成的,固定的

    一、 案例

    登录:

    我不写页面了,用 post man

    二、增删改查

    1. 新增

    先写dao  Mapper

    service

     

     

     

    insertSelective() 原理十分简单,参数是Employee 对象,如果对象的属性有值,就把这个值插入到数据库。

    例子: Employee 只有 id,name 有值,其他属性值都是null

    会动态生成什么sql语句?

    insert into employee (id,name),values(v1,v2)

    如果有三个属性有值

    insert into employee (id,name,gender),values(v1,v2,v3)

     

    原理也是很简单,利用发射获取类的属性,判断属性是否有值 ,根据有值的属性动态生成sql语句

  16.  

     

     

     

     

     

    我们发现 get  请求也可以实现新增。

    为什么还要用 post 请求?

    我们遵循规范,只是方便开发维护等;

     

    建议 遵循  rest 风格

posted @ 2022-05-21 23:32  码农在广场  阅读(43)  评论(0编辑  收藏  举报