MyBatis


 

MyBatis是一个开源的Java持久层框架,它提供了一个简单易用的接口,让开发者能够更轻松地操作关系型数据库。MyBatis在数据映射方面做了很多优化,主要通过使用SQL语句和配置文件来实现。它消除了几乎所有的JDBC代码和参数的手动设置,以及对结果集的检索。MyBatis可以与Spring等框架无缝集成,为Java开发者提供更加便捷的数据库操作方式。

MyBatis的优点包括:

  1. 灵活性:MyBatis允许您直接编写原生的SQL语句,提供了很高的灵活性。您可以根据需要编写任何复杂的SQL,从而满足各种业务需求。
  2. 易于使用:MyBatis通过XML配置文件和注解,让您可以轻松地将SQL语句与Java代码分离,使得代码结构更清晰、易于维护。
  3. 映射简单:MyBatis提供了简单的映射方式,可以将数据库表中的字段自动映射到Java对象的属性上,降低了数据转换的复杂性。
  4. 良好的扩展性:MyBatis提供了丰富的插件接口,您可以通过编写自定义插件来扩展MyBatis的功能,以满足特定需求。
  5. 与其他框架集成:MyBatis可以与Spring、Spring Boot等流行框架无缝集成,提供更加完整的解决方案。
  6. 社区支持:MyBatis有一个活跃的开发者社区,为使用者提供了丰富的文档、教程和支持。这有助于在遇到问题时快速找到解决方案。

一、Mybatis框架概述

mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

mybatis 通过 xml或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

二、JDBC缺陷总结

数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大, sql 变动需要改变java 代码。

使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。

对结果集解析存在硬编码(查询列名), sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。

三、MyBatis框架解决JDBC劣势

JDBC是Java程序实现数据访问的基础,JDBC的劣势主要有以下几个方面。

  • (1)数据库连接创建、释放频繁会造成系统资源浪费,从而影响系统性能。
  • (2)SQL语句在代码中硬编码,造成代码不易维护。在实际应用的开发中,SQL变化的可能性较大。在传统JDBC编程中,SQL变动需要改变Java代码,违反了开闭原则
  • (3)用PreparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件不一定,可能多也可能少,修改SQL需要修改代码,造成系统不易维护。
  • (4)JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,造成系统不易维护。

MyBatis框架支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,使用简单的XML或注解进行配置和原始映射,将接口和Java的POJO映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想来操作数据库。

MyBatis框架是一个ORM(Object/Relation Mapping,即对象关系映射)框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。ORM框架的工作原理可以通过一张图来展示。


针对JDBC编程的劣势,MyBatis提供了以下解决方案,具体如下。


问题一:数据库链接创建、释放频繁会造成系统资源浪费,从而影响系统性能。
解决方案:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。


问题二:SQL语句在代码中硬编码,造成代码不易维护。在实际应用的开发中,SQL变化的可能较大。在传统JDBC编程中,SQL变动需要改变Java代码,违反了开闭原则。
解决方案:MyBatis将SQL语句配置在MyBatis的映射文件中,实现了与Java代码的分离。


问题三:使用preparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件不一定,可能多也可能少,修改SQL需要修改代码,造成系统不易维护。
解决方案:MyBatis自动将Java对象映射至SQL语句,通过Statement中的parameterType定义输入参数的类型。

引入spring data jpa
要在springboot中使用spring data jps访问mysql数据库,我们需要在项目中增加pom依赖和配置。

修改pom.xml,加入mysql-connector-java因为我们使用的是mysql数据库,加入spring-boot-starter-data-jpa是springboot的spring data jpa依赖。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
修改application.properties或application.yml,以下以application.properties为例。注意下面的password和url按照自己的情况进行修改。

spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql://localhost:3306/stock
创建数据库对象模型Entity类
我们定义和数据库表中数据映射的Entity类,也就是我们的模型类,一般情况下和数据库里的表结构字段一一映射即可。 下面我使用了lombok省去写getsetter的操作,Entity类需要加上@Entity注解,并且需要一个@Id注解加在id字段上,id字段上还有一个@GeneratedValue表示这个id是怎么生成的,这个字段自增则使用strategy = GenerationType.IDENTITY

import lombok.Data;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
 
@Entity
@Data
public class Stock {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String code;
    private String name;
}
定义Repository接口
下面要定义我们的DAO类了,在spring data里叫做Repository,我们定义一个StockRepository,继承于JpaRepository,这个接口提供了增删改查等常用的操作。 接口中还定义了两个泛型,前面泛型的是Repository操作的Entity类,后面的泛型是Entity类的id的类型,我们这里分别是Stock和Long。 Repository接口中还可以增加findXXXByXXX这样的方法,能够实现条件查询。我们这里增加一个findStockByCode的方法

public interface StockRepository extends JpaRepository<Stock, Long> {
    Stock findStockByCode(String code);
}
使用Repository
定义好StockRepository类后就可以在其他的bean里引用这个Repository使用了。

@Autowired
private StockRepository stockRepository;
 
@RequestMapping("/saveAndGet")
public Stock saveAndGet(Stock stock) {
    stockRepository.save(stock);
    return stock;
}
 
@RequestMapping("/getByCode")
public Stock getByCode(String code) {
    return stockRepository.findStockByCode(code);

————————————————
 

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值