前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringDataA和Mybaits有什么区别,如何使用?

SpringDataA和Mybaits有什么区别,如何使用?

作者头像
Java极客技术
发布于 2022-12-04 01:58:20
发布于 2022-12-04 01:58:20
98600
代码可运行
举报
文章被收录于专栏:Java极客技术Java极客技术
运行总次数:0
代码可运行

阿粉之前一直都是使用传统的SSM进行开发,也就我们所说的 Spring,SpringMVC,Mybatis,即使使用的SpringBoot,无非也就是这么集中,对于持久层框架的选择,也都是Mybaits,但是阿粉无意中发现,现在使用SpringDataJPA的公司也是非常的多的,所以,今天阿粉来讲一下这个SpringDataJPA.

SpringDataJPA和Mybaits

什么是JPA

jpq是面向对象的思想,一个对象就是一个表,强化的是你对这个表的控制。jpa继承的那么多表约束注解也证明了jpa对这个数据库对象控制很注重。

其实,在阿粉的眼中,JPA好像就是和Hibernate是一样的东西,区别并不大。

Spring Data JPA是Spring Data的子模块。使用Spring Data,使得基于“repositories”概念的JPA实现更简单和容易。Spring Data JPA的目标是大大简化数据访问层代码的编码。作为使用者,我们只需要编写自己的repository接口,接口中包含一些个性化的查询方法,Spring Data JPA将自动实现查询方法.

也就是说是什么呢?如果我们要写一个根据ID查对象的方法比如:

findUserById(String Id) 首先这个方法的名称,阿粉起名起的还是比较标准的,如果你在使用SpringDataJPA的话,再repository中直接使用这个方法名,就可以了,但是如果你使用了 Mybaits 的话,可能你需要在xml文件中,或者再方法上写SQL 就比如这个样子,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from User where id = "xxxxx";

什么是Mybaits

mybatis则是面向sql,你的结果完全来源于sql,而对象这个东西只是用来接收sql带来的结果集。你的一切操作都是围绕sql,包括动态根据条件决定sql语句等。mybatis并不那么注重对象的概念。只要能接收到数据就好。

而且MyBatis对于面向对象的概念强调比较少,更适用于灵活的对数据进行增、删、改、查,所以在系统分析和设计过程中,要最大的发挥MyBatis的效用的话,一般使用步骤则与hibernate有所区别:

  • 综合整个系统分析出系统需要存储的数据项目,并画出E-R关系图,设计表结构
  • 根据上一步设计的表结构,创建数据库、表
  • 编写MyBatis的SQL 映射文件、Pojos以及数据库操作对应的接口方法

而且现在有很多的Mybaits的插件,用于逆向生成 Mybaits 的文件,比如直接通过你建立的表生成 Dao文件和 dao.xml文件。

但是今天阿粉的重点可不是说这个 Mybatis,而是SpringDataJPA

接下来阿粉就来详细说说这个SpringDataJPA

什么是SpringDataJPA

官方文档先放上

总的来说JPA是ORM规范,Hibernate是JPA规范的具体实现,这样的好处是开发者可以面向JPA规范进行持久层的开发,而底层的实现则是可以切换的。Spring Data Jpa则是在JPA之上添加另一层抽象(Repository层的实现),极大地简化持久层开发及ORM框架切换的成本。

为什么这么多公司会选择 Mybaits ,而不选择使用 SpringDataJPA 呢?

因为Spring Data Jpa的开发难度要大于Mybatis。主要是由于Hibernate封装了完整的对象关系映射机制,以至于内部的实现比较复杂、庞大,学习周期较长。这对于现在的快捷式开发显然并不适合,但是因为某些公司最早的开发,所以现在很多公司仍然延续使用 Spring Data Jpa 来进行开发,接下来阿粉就来说说这个 Spring Data Jpa 是如何使用的。

如何使用 SpringDataJPA

我们直接使用SpringBoot 整合一下Spring Data Jpa 来进行操作。来展示如何使用 Spring Data Jpa。

创建一个 SpringBoot 的项目,

然后加入我们的依赖,或者你在创建的时候就进行选择,比如选择好我们接下来所需要的所有依赖就像这个样子。

这个时候我们就直接勾选上lombok,然后SpringWeb,还有我们的数据库驱动的 Jpa 的依赖。

创建完成,我们就能看到已经为我们添加好了我们所需要的依赖环境

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

如果不会选依赖的,各位,这肯定是一个非常好的方式。

接下来配置一下 yml 文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 8080
  servlet:
    context-path: /
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
    username: root
    password: 123456
  jpa:
    database: MySQL
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true
    hibernate:
      ddl-auto: update

看,最后有个hibernate,这就是之前阿粉说的,hibernate提供规范,

ddl-auto

这个参数也是有很多值的,不同的值代表着不同的内容。

  • create:每次运行程序时,都会重新创建表,故而数据会丢失
  • create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表
  • upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
  • validate:运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错
  • none: 禁用DDL处理

然后启动一下,看看是否成功,如果出现数据库啥的不合适的,肯定是帐号和密码写错了,或者连接的数据库不对,看着改一下。有问题就改嘛,这才是好朋友。

看阿粉启动的还是相对来说很成功的,接下来我们就得安排一下这个 JPa 的使用方式了。

接下来我们创建好一组内容,Controller,Service,Dao,Entry,

然后是我们实体类的内容和表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GenericGenerator(name = "idGenerator", strategy = "uuid")
    @GeneratedValue(generator = "idGenerator")
    private String id;
    @Column(name = "user_name", unique = true, nullable = false, length = 64)
    private String userName;
    @Column(name = "user_password", unique = true, nullable = false, length = 64)
    private String userPassword;
}

这时候主键阿粉使用的事uuid的策略,但是 Jpa 也是自带主键生成策略的。

  • TABLE:使用一个特定的数据库表格来保存主键
  • SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)
  • IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,如mysql
  • AUTO:主键由程序控制,也是GenerationType的默认值

这时候 Dao 需要继承一下 Jpa 的接口了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface UserDao extends JpaRepository<User, String> {}

JpaRepository里面可是自带了不少方法的,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    List<T> findAll();

    List<T> findAll(Sort sort);

    List<T> findAllById(Iterable<ID> ids);

    <S extends T> List<S> saveAll(Iterable<S> entities);

    void flush();

    <S extends T> S saveAndFlush(S entity);

    <S extends T> List<S> saveAllAndFlush(Iterable<S> entities);

    /** @deprecated */
    @Deprecated
    default void deleteInBatch(Iterable<T> entities) {
        this.deleteAllInBatch(entities);
    }

    void deleteAllInBatch(Iterable<T> entities);

    void deleteAllByIdInBatch(Iterable<ID> ids);

    void deleteAllInBatch();

    /** @deprecated */
    @Deprecated
    T getOne(ID id);

    T getById(ID id);

    <S extends T> List<S> findAll(Example<S> example);

    <S extends T> List<S> findAll(Example<S> example, Sort sort);

方法是真的不少,主要还是看你怎么使用,

我们来试试吧。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/save")
    public User saveUser() {
        User user = new User();
        user.setUserName("zhangSan");
        user.setUserPassword("123456");
        return userService.saveUser(user);
    }
}

Service 方法直接调用 UserDao 中的保存,也就是父类中的save方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

public interface UserService {
    User saveUser(User user);
}


@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public User saveUser(User user) {
        return userDao.save(user);
    }
}

然后我们调用方法,再看看数据库

我们成功插入进去了一条数据,也就是说,这个方法是没什么毛病的呀,那是不是可以把所有的方法都挨着试一遍。

阿粉这里就不再一一的演示了,毕竟很简单的。

如果你觉得这些方法不能够满足你的使用,那么你就得继续看了,毕竟确实不能满足日常需求呀。就比如说多参数的,查询,这时候就有And出现,如果有需要,你就得专门的再去 官方文档中查看了

Jpa官方文档

如果你想使用一下SQL语句呢?

这时候,你就得写一个自定义的方法,然后再 Dao 你自定义方法上面加入 @Query注解然后在其中写你的 SQL 语句。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Query("select * from User where u.user_password = ?1")
User getByPassword(String password);

?1这个实际上就是代表的参数,如果有多个参数,可以使使用?2

其实和 Mybaits 的 #{0} 看起来很类似。

Jpa的简单使用,你学会了么?说实在的,感觉这种方式,把代码和SQL都融合在了一起,感觉确实不是很好,至少从观看上面来说,体验就非常不好。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java极客技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
​ 机器学习(九) ——构建决策树(离散特征值)
机器学习(九) ——构建决策树(离散特征值) (原创内容,转载请注明来源,谢谢) 一、概述 1、概念 决策树,这个概念是一个很常见的概念,应该是机器学习中最好理解的一个算法。决策树是在已知训练结果
用户1327360
2018/03/07
2.4K0
​ 机器学习(九) ——构建决策树(离散特征值)
用python实现决策树ID3算法,对隐形眼镜类型预测
本节讲解如何预测患者需要佩戴的隐形眼镜类型。 1、使用决策树预测隐形眼镜类型的一般流程 (1)收集数据:提供的文本文件(数据来源于UCI数据库) (2)准备数据:解析tab键分隔的数据行 (3)分析数
机器学习AI算法工程
2018/03/14
1.6K0
用python实现决策树ID3算法,对隐形眼镜类型预测
决策树(二)
有了决策树,我们就可以根据样本的特征值来执行分类。遇到判断节点则递归调用,遇到叶子节点则终止,返回叶子节点的分类标签:
用户6021899
2019/08/14
4340
机器学习--决策树(ID3)算法及案例
1 基本原理 决策树是一个预测模型。它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,每个分支路径代表某个可能的属性值,每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。一般情况下,决策树由决策结点、分支路径和叶结点组成。在选择哪个属性作为结点的时候,采用信息论原理,计算信息增益,获得最大信息增益的属性就是最好的选择。信息增益是指原有数据集的熵减去按某个属性分类后数据集的熵所得的差值。然后采用递归的原则处理数据集,并得到了我们需要的决策树。 2 算法流程
机器学习AI算法工程
2018/03/12
1.8K0
机器学习--决策树(ID3)算法及案例
机器学习--决策树算法(CART)
​ 我们知道,在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题。但是无论是ID3还是C4.5,都是基于信息论的熵模型的,这里面会涉及大量的对数运算。能不能简化模型同时也不至于完全丢失熵模型的优点呢?有!CART分类树算法使用基尼系数 来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。
Kindear
2021/11/24
1.1K0
机器学习--决策树算法(CART)
Python AI 教学 | 决策树算法及应用
决策树是一种简单高效并且具有强解释性的模型,广泛应用于数据分析领域。其本质是一颗由多个判断节点组成的树,可以是二叉树或非二叉树。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
短短的路走走停停
2019/07/10
6650
机器学习笔记(四)——决策树的构建及可视化
本文以一个新的数据集(隐形眼镜数据集)为基础实现构建决策树、决策树的保存与加载、利用决策树分类、决策树的可视化,前文的知识不在过多概述,着重介绍这四个方面。
奶糖猫
2020/07/07
2.1K0
机器学习笔记(四)——决策树的构建及可视化
机器学习(四)—决策树
摘要:本文首先浅谈了自己对决策树的理解,进而通过Python一步步构造决策树,并通过Matplotlib更直观的绘制树形图,最后,选取相应的数据集对算法进行测试。
oYabea
2020/09/07
5040
机器学习实战教程(三):决策树实战篇之为自己配个隐形眼镜
原文链接:https://cuijiahua.com/blog/2017/11/ml_3_decision_tree_2.html
圆方圆PYTHON学院
2019/01/03
1.7K0
机器学习实战教程(三):决策树实战篇之为自己配个隐形眼镜
【白话机器学习】算法理论+实战之决策树
如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的, 常见的机器学习算法:
Datawhale
2020/03/04
7130
【白话机器学习】算法理论+实战之决策树
《机器学习实战》 - 决策树
知道如何计算信息增益,我们就可以计算 每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择。
yiyun
2022/04/01
7650
《机器学习实战》 - 决策树
python机器学习实战(二)
http://www.cnblogs.com/fydeblog/p/7159775.html
努力努力再努力F
2018/09/11
1.4K0
python机器学习实战(二)
R语言与机器学习(分类算法)决策树算法
决策树定义 首先,我们来谈谈什么是决策树。我们还是以鸢尾花为例子来说明这个问题。 观察上图,我们判决鸢尾花的思考过程可以这么来描述:花瓣的长度小于2.4cm的是setos
机器学习AI算法工程
2018/03/12
2K0
R语言与机器学习(分类算法)决策树算法
机器学习--决策树算法
在生活中,“树”这一模型有很广泛的应用,事实证明,它在机器学习分类和回归领域也有着深刻而广泛的影响。在决策分析中,决策树可以明确直观的展现出决策结果和决策过程。如名所示,它使用树状决策模型。它不仅仅是在数据挖掘中用户获取特定目标解的策略,同时也被广泛的应用于机器学习。
Kindear
2021/10/26
6440
常见面试算法:决策树、随机森林和AdaBoost
决策树(Decision Tree)算法是一种基本的分类与回归方法,是最经常使用的数据挖掘算法之一。我们这章节只讨论用于分类的决策树。
机器学习AI算法工程
2019/10/28
1.3K0
常见面试算法:决策树、随机森林和AdaBoost
【Python机器学习】系列五决策树非线性回归与分类(深度详细附源码)
查看之前文章请点击右上角,关注并且查看历史消息 所有文章全部分类和整理,让您更方便查找阅读。请在页面菜单里查找。 相关内容:(点击标题可查看原文) 第1章 机器学习基础 将机器学习定义成一种通过学习经验改善工作效果的程序研究与设计过程。其他章节都以这个定义为基础,后面每一章里介绍的机器学习模型都是按照这个思路解决任务,评估效果。 第2章 线性回归 介绍线性回归模型,一种解释变量和模型参数与连续的响应变量相关的模型。本章介绍成本函数的定义,通过最小二乘法求解模型参数获得最优模型。 第3章 特征提取与
量化投资与机器学习微信公众号
2018/01/29
2K0
【机器学习实战】第3章 决策树
第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=
片刻
2018/01/05
1.1K0
【机器学习实战】第3章 决策树
【Python机器学习实战】决策树和集成学习(二)——决策树的实现
摘要:上一节对决策树的基本原理进行了梳理,本节主要根据其原理做一个逻辑的实现,然后调用sklearn的包实现决策树分类。
冬夜先生
2021/09/08
9410
【机器学习】决策树
本文介绍了 ID3,C4.5,CART三种基本的决策树模型。首先介绍了决策树的特征选择,包括信息增益,信息增益率、基尼指数、最小均方差分别对应分类树ID3、C4.5、CART、回归树CART。然后介绍了决策树建树的一般流程、对比分类树和回归树建树的区别。最后介绍了树模型中避免过拟合问题的剪枝方法,包括前剪枝和后剪枝。
yuquanle
2020/04/01
6790
【机器学习】决策树
决策树(Decision Tree)ID3算法
决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。
统计学家
2019/04/08
7830
推荐阅读
相关推荐
​ 机器学习(九) ——构建决策树(离散特征值)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档