当前位置: 首页 > 科技观察

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

时间:2023-03-12 23:02:31 科技观察

阿粉之前一直在使用传统的SSM进行开发,也就是我们所说的Spring,SpringMVC,Mybatis。就算用SpringBoot,也无非就是这么一个浓度。持久层框架的选择也是Mybaits,不过阿芬无意中发现现在有很多公司在用SpringDataJPA,所以今天阿芬就来说说这个SpringDataJPA。SpringDataJPA和Mybaits什么是JPA?是你对桌子的控制。jpa继承了这么多的表约束注解,也证明了jpa非常重视对这个数据库对象的控制。其实在阿芬眼里,JPA和Hibernate好像是一回事,区别不大。SpringDataJPA是SpringData的一个子模块。使用SpringData,基于“存储库”的概念实现JPA更加简单易行。SpringDataJPA的目标是大大简化数据访问层代码的编码。作为用户,我们只需要写自己的repository接口,里面包含一些个性化的查询方法,SpringDataJPA会自动实现查询方法。也就是说,它是什么?如果我们要写一个根据ID查询对象的方法比如:findUserById(StringId)首先这个方法的名字比较规范。如果你使用的是SpringDataJPA,你可以直接在版本库中使用这个方法名,但是如果你使用Mybaits,可能需要在xml文件中写SQL,或者在方法中,像这样,select*fromUserwhereid="xxxxx";什么是Mybaitsmybatis是针对sql的,你的结果完全是从sql中导出的,对象只是用来接收sql带来的结果集。你所有的操作都围绕着sql,包括根据条件动态确定sql语句。mybatis并不太关注对象的概念。只要能接收到数据。而且MyBatis不太强调面向对象的概念,更适合灵活的增删改查数据。因此,在系统分析和设计过程中,如果想发挥MyBatis的最大效用,一般使用步骤与hibernate有区别:通过整合整个系统来分析系统需要存储的数据项,绘制E-R关系图,根据上一步设计的表结构设计表结构,创建数据库,编写MyBatis的SQL映射文件,Pojos和数据库操作对应的接口方法,现在Mybaits插件有很多ins,用于反向生成Mybaits文件,比如通过自己创建的表直接生成dao文件和dao.xml文件。不过阿粉今天的重点不是Mybatis,而是SpringDataJPA。接下来阿凡就详细说说SpringDataJPA。SpringDataJPA的官方文档是什么?,这样做的好处是开发者可以基于JPA规范开发持久层,同时底层实现可以切换。SpringDataJpa在JPA之上又增加了一层抽象(Repository层的实现),大大简化了持久层开发和ORM框架切换的成本。为什么那么多公司选择Mybaits而不是SpringDataJPA?因为SpringDataJpa比Mybatis更难开发。主要原因是Hibernate封装了完整的对象-关系映射机制,使得内部实现相对复杂庞大,学习周期长。这显然不适合现在的捷径开发,但是由于部分公司开发最早,所以很多公司还是继续沿用 SpringDataJpa进行开发。接下来阿粉就说说这个SpringDataJpa是怎么用的。SpringDataJPA的使用方法我们直接使用SpringBoot集成SpringDataJpa进行操作。展示如何使用SpringDataJpa。创建一个SpringBoot项目,然后添加我们的依赖,也可以在创建的时候选择,比如选择接下来我们需要的所有依赖,像这样。这个时候我们就直接勾选lombok,然后是SpringWeb,还有我们的数据库驱动的Jpa依赖。创建完成后可以看到已经为我们添加了我们需要的依赖环境org.springframework.bootspring-boot-starter-data-jpaorg.springframework.bootspring-boot-starter-webmysqlmysql-connector-javaruntimeorg.projectlomboklombok<可选>trueorg.springframework.bootspring-boot-starter-testtest如果不选择dependencies,各位,这一定是一个很好的方式。接下来配置yml文件server:port:8080servlet:context-path:/spring:datasource:url:jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=falseusername:rootpassword:123456jpa:database:MySQLdatabase-platform:org.hibernate.dialect.MySQL5InnoDBDialectshow-sql:truehibernate:ddl-auto:update看,最后有hibernate,这是阿凡之前说的,hibernate提供规范,参数ddl-auto值也有很多,不同的值代表不同的内容。create:程序每次运行时都会重新创建表,所以数据会丢失结束。upadte:程序每次运行时,都会在没有表的情况下创建表。如果对象发生变化,表结构将被更新。不会清除原有数据,只会更新(推荐)。validate:运行程序会验证数据和数据库的字段类型是否相同。处理一下,启动一下看是否成功。如果数据库有问题,肯定是账号和密码写错了,或者是连接的数据库不对,可以改一下。有问题就改,这就是好朋友。看到阿芬的启动比较成功,接下来就要安排一下这个JPa的使用方法了。接下来我们创建一组内容,Controller,Service,Dao,Entry,然后是我们实体类的内容和表@Data@Entity@Table(name="user")publicclassUser{@Id@GenericGenerator(name="idGenerator)",strategy="uuid")@GeneratedValue(generator="idGenerator")privateStringid;@Column(name="user_name",unique=true,nullable=false,length=64)privateStringuserName;@Column(name="user_password",unique=true,nullable=false,length=64)privateStringuserPassword;}此时主键阿粉使用的是uuid策略,但是Jpa也有自己的主键生成策略。TABLE:使用特定的数据库表来保存主键SEQUENCE:根据底层数据库的序列生成主键,前提是数据库支持序列。这个值要和generator一起使用,generator指定用来生成主键的generator(可以是orcale写的序列)IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,比如mysql)AUTO:主键由程序Control生成,也是GenerationType的默认值。这时候Dao就需要继承Jpa的接口。publicinterfaceUserDaoextendsJpaRepository{}JpaRepository有很多方法,ListfindAll();ListfindAll(Sortsort);ListfindAllById(Iterableids);ListsaveAll(Iterableentities);voidflush();SsaveAndFlush(Sentity);ListsaveAllAndFlush(Ite??rableentities);/**@deprecated*/@DeprecateddefaultvoiddeleteInBatch(Ite??rableentities){this.deleteAllInBatch(entities);}voiddeleteAllInBatch(Ite??rableentities);voiddeleteAllByIdInBatch(Ite??rableids);voiddeleteAllInBatch();/**@deprecated*/@DeprecatedTgetOne(IDid);TgetById(IDid);ListfindAll(Exampleexample);ListfindAll(Exampleexample,Sortsort);方法真的很多,主要还是看你怎么用,大家试试吧。@RestController@RequestMapping("/users")publicclassUserController{@AutowiredprivateUserServiceuserService;@RequestMapping(value="/save")publicUsersaveUser(){Useruser=newUser();user.setUserName("zhangSan");user.setUserPassword("123456");returnuserService.saveUser(user);}}Service方法直接调用了UserDao中的save,也就是父类中的save方法。publicinterfaceUserService{UsersaveUser(Useruser);}@ServicepublicclassUserServiceImplimplementsUserService{@AutowiredprivateUserDaouserDao;@OverridepublicUsersaveUser(Useruser){returnuserDao.save(user);}}然后我们调用方法,然后查看数据库,我们已经成功插入了一条数据,也就是说,这个方法没有错,那么是不是可以把所有的方法都一个个试一遍呢?阿芬这里就不一一演示了,毕竟很简单。如果你觉得这些方法不能满足你的需求,那你还得继续看下去,毕竟它们确实不能满足你的日常需求。比如对于多参数查询,此时会出现And。需要的话还得去官方文档查看Jpa官方文档。如果要使用SQL语句呢?这时候你就得写一个自定义的方法,然后在Dao的自定义方法上加上@Query注解,把你的SQL语句写在里面。@Query("select*fromUserwhereu.user_password=?1")UsergetByPassword(Stringpassword);?1其实就是代表参数。如果有多个参数,可以用?2看起来很像Mybaits的#{0}。Jpa的简单使用你学会了吗?说实话,我觉得这种代码和SQL整合的方式确实不太好,至少从观看的角度来说,体验很差。