前言
MyBatis是一个简单易用的持久层框架,通过将Java对象映射到数据库表中,提供了高效、灵活的数据库访问解决方案。相对于其他ORM框架,MyBatis具有更低的学习成本和更高的灵活性,使得开发人员可以更加直观地操作数据库。
本文将带您了解MyBatis的基本概念、特性以及它在项目中的优势和应用场景。首先,我们会介绍什么是MyBatis以及它的工作原理。然后,我们将探讨MyBatis的环境搭建。最后,我们将讨论MyBatis适用的场景,并展示如何进行基本的CRUD操作。
通过学习本文,您将对MyBatis有一个全面的了解,并能够在实际项目中应用MyBatis来处理数据库操作。无论您是初学者还是有一定经验的开发人员,本文都将为您提供有价值的信息和指导。让我们开始吧!
1.MyBatis是什么
MyBatis是一个开源的持久层框架,它提供了将Java对象映射到数据库记录的功能,通过XML或注解配置SQL语句,并且能够执行和管理这些SQL语句。MyBatis通过简化数据库访问操作,帮助开发人员更有效地与关系型数据库进行交互。
2.MyBatis的特点
- 简单易用: MyBatis使用简单的SQL语句和参数来进行数据库操作,相对于其他ORM框架,学习和使用成本较低。
- 灵活性强: MyBatis支持基于XML或注解的配置方式,开发人员可以根据需要选择合适的方式来定义SQL语句。
- 易于集成: MyBatis可以与Spring等流行的Java企业级框架无缝集成,方便开发人员使用。
- 高性能: MyBatis通过优化的缓存机制、延迟加载等技术来提高数据库访问性能。
3.mybatis的作用
MyBatis主要用于将Java对象与数据库之间进行映射,实现对象和关系型数据库之间的交互。它可以处理SQL语句的执行、结果集的映射、事务管理等操作,帮助开发人员更加方便地进行数据库操作。
4.MyBatis的应用场景
- 对SQL语句有较强的控制需求:如果你对数据库操作需要具备高度的灵活性和精确性,MyBatis可以为你提供更细粒度的控制能力。你可以直接编写和调优SQL语句来满足特定的需求,而无需依赖框架的自动生成SQL。
- 复杂业务逻辑和数据处理:在某些项目中,业务逻辑可能非常复杂,并且需要对数据进行一系列的处理,此时使用MyBatis可以使得数据的处理更加直观和方便。通过配置映射文件(或注解),将Java对象与数据库表之间的映射关系定义清晰,可以更直接地操作这些数据对象。
- 性能要求较高的系统:MyBatis拥有良好的性能,通过合理地利用缓存机制和优化技巧,能够有效减少数据库访问次数,并提高系统的响应速度。因此,在需要注重性能和响应时间的系统中,MyBatis是一个很好的选择。
- 需要与现有的数据库和代码集成:如果你的项目已经存在了一个成熟的数据库以及对应的数据表结构,且希望借助一个简单的持久层框架将其与代码集成起来,那么MyBatis是一个合适的选择。MyBatis能够通过简单的映射配置,将已有的数据库转化为Java对象,从而提供方便的数据库操作接口。
5.MyBatis优缺点
优点:
1、简单易学,容易上手(相比于 Hibernate)基于SQL编程。
2、消除了JDBC大量冗余的代码,不需要手动开关连接。
3、很好的与各种数据库兼容(因为 MyBatis 使用JDBC来连接数据库,所以只要JDBC 支持的数据库 MyBatis 都支持,而JDB提 供了可扩展性,所以只要这个数据库有针对Java的jar包就可以就可以与 MyBatis 兼容),开发人员不需要考虑数据库的差异性。
4、提供了很多第三方插件(分页插件 / 逆向工程)。
5、能够与Spring很好的集成。
6、如果使用映射文件的话,可以让代码和配置文件完全分离。只要方法的定义没有改变,那么只需要修改配置文件就可以达到修改的目的。
缺点:
SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
二、相关概念
在使用JDBC 的时候,我们通常将数据直接返回,但现在也会将数据封装到实体类对象中,由对象携带数据。这样操作的时候,可以通过操作对象的方式操作数据。但是手写这类代码通常是繁琐的、重复的,如果有自动完成这些功能的程序就好了。
ORM(Object-Relational-Mapping):是对象关系映射的意思,它是一种思想,是指将数据库中的每一行数据用对象的形式表现出来。可以将 ORM 简单理解为上面我们提出的,可以自动将对象与数据进行映射的技术。
2.常见的ORM框架
Hibernate: 完全ORM映射框架
优点:
1、简化了整个jdbc操作过程
2、对于开发者来说不需要关心sql了,只需要去操作对象就可以了,hibernate可以帮我们自动生成所需要的sql
3、代码移植性比较好,通过hibernate操作db都是通过操作对象来进行的,而hibernate会根据我们的操作和db的类型生成符合各种db要求的sql,如果我们需要切换db的类型,hibernate会自动适应,对于开发者业务代码来说不需要做任何业务代码上的调整
4、开发效率比较高
缺点:
1、sql优化比较艰难,各种操作最终发给db的sql是由hibernate自动生成的,对于开发者来说如果想干预最终需要执行的sql,相对来说比较困难
2、hibernate入门比较容易,但是想成为高手学习成本比较高
3、对于复杂的动态sql,代码中也需要写很多判断进行组装,动态sql这块的支持比较欠缺
如果做一些简单的系统,开发周期也比较紧急,对sql的优化要求也不是很高,可以使用hibernate。
JdbcTemplate :半自动的ORM框架
jdbcTemplate是在Spring框架的基础上开发的一个jdbc框架,所以对spring是有依赖的,它对jdbc做了封装,隐藏了各种重复的操作,使用时只需传入:需要执行的sql、参数以及对于结果如何解析的程序就可以了,使用起来还是很方便的,但是面对与动态sql,它也是无能为力了。整体上来说,jdbctemplate相对于纯jdbc隐藏了很多重复性的操作,对于sql的写法和结果的组装上完全交给了开发者自己去控制,在系统中使用也可以帮助我们节约很多时间,而且学习相当简单.
MyBatis:半自动的化的ORM框架
MyBatis是一个半自动化的orm框架,为什么说是半自动化的呢,因为他需要我们自己去写sql,而他做的更好的地方就是动态sql的支持上面,而上面说的各种技术,面对与动态sql只能自己写很多判断去组装sql,而这些判断和组装在mybatis中实现起来就非常简单了,完全由mybatis去帮我们实现了。mybatis将sql交由开发者去控制,所以在sql的优化方面,开发者可以随心所欲,也就是说mybatis将重复性的工作优化到了极致:操作db的过程、动态sql的拼装、结果和对象的映射,这些mybatis都帮我们实现的很好,而让我们将更多的经历花在sql的写法和优化上面,所以毫无疑问mybatis使用人数和公司也是最多的。
3.什么是持久层框架
持久层框架是用于处理数据持久化的软件工具或库。它提供了一组API和工具,使开发人员可以将Java对象存储到数据库中,并从数据库中读取和修改对象的数据。持久层框架简化了数据访问的过程,极大地提高了开发效率。开发人员不仅更方便地进行数据库操作,并提高系统的性能和可维护性。
持久层框架提供了以下功能:
- 对象-关系映射:持久层框架能够将Java对象与数据库表之间进行映射,使得开发人员可以使用面向对象的思维来操作数据库。
- 数据库访问:持久层框架提供了一套API或方法,用于执行常见的数据库操作,如插入、更新、删除和查询等。通过这些方法,可以方便地进行数据库操作,不必直接编写原始的SQL语句。
- 缓存管理:持久层框架通常会提供缓存机制,通过缓存可以提高系统的性能,减少对数据库的频繁访问。框架会自动管理和更新缓存,以保持数据的一致性。
- 事务管理:持久层框架通常会提供事务管理的功能,确保数据库操作的一致性和完整性。开发人员可以通过框架提供的API或注解来控制事务的边界,并进行事务的提交或回滚操作。
- 查询语言支持:持久层框架通常会针对查询操作提供更高级的查询语言或查询构建器,使得查询操作更加灵活和直观。
- 映射配置:持久层框架允许开发人员配置对象与数据库表之间的映射关系,通过配置文件或注解方式定义表的结构以及属性和字段的映射规则。
- 数据库连接池管理:持久层框架通常会提供数据库连接池来管理数据库连接的获取和释放,以提高数据库访问的效率和性能。
三、MyBatis的工作原理
1.框架交互
开始搭建MyBatis之前,我们先来看看MyBatis在整个框架中的定位,框架交互流程图:
我们知道,MyBatis是ORM框架(Object Relational Mapping)即对象关系映射。
在⾯向对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象的互相转换:
ORM将数据库映射为对象:
数据库表(table)--> 类(class)
记录(record,⾏数据)--> 对象(object)
字段(field) --> 对象的属性(attribute)
⼀般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。
也就是说使⽤ MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间
的转换,接下来我们来看 MyBatis 的使⽤吧。
2.工作原理
- 配置文件:在配置文件中设置数据库连接信息、映射器(Mapper)以及各种配置选项。
- SqlSessionFactory:通过SqlSessionFactory来获取SqlSession。SqlSessionFactory是一个单例对象,负责创建和管理SqlSession。
- SqlSession:SqlSession是MyBatis与数据库交互的主要接口。它可以执行SQL语句、提交和回滚事务等操作。
- Mapper接口:为每个SQL语句编写对应的Mapper接口,通过Mapper接口中的方法来执行SQL操作。
- 映射文件(或注解):将SQL语句与Mapper接口的方法进行映射。可以使用XML配置文件或注解方式定义SQL语句。
- 数据库操作:通过编写合适的SQL语句,调用Mapper接口中的方法来进行数据库的增删改查等操作。
- 结果映射:MyBatis根据SQL查询结果将数据映射到Java对象中,便于开发人员操作和处理查询结果。
Mybatis的工作原理如上图,需要首先创建一个Mybatis的全局配置文件mybatis-config.xml(名称不固定,可以随便起),其次是多个mapper.xml配置文件用来书写sql语句,为了能够使用这些配置文件,我们需要通过SqlSessionFactory创建一个SqlSession对象(这个对象是Mybatis的核心对象,CRUD都是通过该对象进行调用),后通过executor底层执行器执行sql语句,得到结果集返回。
总的来说,MyBatis的工作原理是通过配置文件和映射文件(或注解)定义SQL语句和Mapper接口的对应关系,然后通过SqlSession执行SQL语句并将结果映射到Java对象中。这样就实现了Java对象与数据库之间的交互。
四、MyBatis环境搭建
1 创建maven工程
2 导入相关pom依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ctb</groupId> <artifactId>mybatis01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>mybatis01 Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- ********************** junit单元测试依赖 ********************** --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <!-- <scope>test</scope>--> </dependency> <!-- ********************** Java Servlet API ********************** --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0</version> <scope>provided</scope> </dependency> <!-- ********************** Mybatis依赖 ********************** --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- ********************** Mysql JDBC驱动 ********************** --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <!-- ********************** 日志配置 ********************** --> <!--记得修改mybatis.cfg.xml添加如下内容--> <!--<setting name="logImpl" value="LOG4J2"/>--> <!--核心log4j2jar包--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.9.1</version> </dependency> <!--web工程需要包含log4j-web,非web工程不需要--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.9.1</version> <!-- <exclusions></exclusions> 排除--> </dependency> </dependencies> <build> <finalName>mybatis01</finalName> <resources> <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题--> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题--> <resource> <directory>src/main/resources</directory> <includes> <include>jdbc.properties</include> <include>*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <dependencies> <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> </dependencies> <configuration> <overwrite>true</overwrite> </configuration> </plugin> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </build> </project>
3 导入jdbc配置文件
根据自己所使用mysql版本或云数据进行相应配置的修改
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://47.100.191.44:3308/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8 jdbc.username=test01 jdbc.password=test01
4.导入web.xml对应版本
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Archetype Created Web Application</display-name> </web-app>
5 Mybatis相关插件安装
Free mybatis plugin
提供了一些方便的功能,比如自动生成MyBatis的Mapper接口和XML映射文件,以及一些代码片段的快速生成。它可以减少手动编写重复代码的工作量,提高开发效率。
Mybatis generator
MyBatis官方提供的一个代码生成工具。它可以根据数据库表结构自动生成对应的Java实体类、Mapper接口和XML映射文件。你只需要配置好数据库连接和表信息,然后运行生成器,就可以快速生成基础的代码,减少手动编写的工作量。
mybatis tools
一个集成了多个MyBatis相关工具的插件。它包括了代码生成器、Mapper接口和XML文件的自动补全、语法检查等功能。使用这个插件可以提高开发效率,减少错误。
maven helper
这个插件是用于Maven项目的,它可以帮助你更方便地管理和配置Maven依赖。在使用MyBatis框架时,你可能需要引入一些MyBatis相关的依赖库,Maven Helper可以帮助你自动添加这些依赖,简化配置过程。
6 Mybatis-cfg.xml 核心配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 引入外部配置文件 --> <properties resource="jdbc.properties"/> <settings> <setting name="logImpl" value="LOG4J2"/> </settings> <!-- 别名 --> <typeAliases> <!--<typeAlias type="com.javaxl.model.Book" alias="Book"/>--> </typeAliases> <!-- 配置mybatis运行环境 --> <environments default="development"> <environment id="development"> <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 --> <transactionManager type="jdbc"/> <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI --> <!-- POOLED 表示支持JDBC数据源连接池 --> <!-- UNPOOLED 表示不支持数据源连接池 --> <!-- JNDI 表示支持外部数据源连接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/ctb/mapper/BookMapper.xml"/> </mappers> </configuration>
7 generatorConfig.xml 配置代码生成器
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration> <!-- 引入配置文件 --> <properties resource="jdbc.properties"/> <!--指定数据库jdbc驱动jar包的位置--> <classPathEntry location="D:\\software\\maven\\mvn_protetis\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/> <!-- 一个数据库一个context --> <context id="infoGuardian"> <!-- 注释 --> <commentGenerator> <property name="suppressAllComments" value="true"/><!-- 是否取消注释 --> <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 --> </commentGenerator> <!-- jdbc连接 --> <jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/> <!-- 类型转换 --> <javaTypeResolver> <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 01 指定javaBean生成的位置 --> <!-- targetPackage:指定生成的model生成所在的包名 --> <!-- targetProject:指定在该项目下所在的路径 --> <javaModelGenerator targetPackage="com.ctb.model" targetProject="src/main/java"> <!-- 是否允许子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false"/> <!-- 是否对model添加构造函数 --> <property name="constructorBased" value="true"/> <!-- 是否针对string类型的字段在set的时候进行trim调用 --> <property name="trimStrings" value="false"/> <!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 --> <property name="immutable" value="false"/> </javaModelGenerator> <!-- 02 指定sql映射文件生成的位置 --> <sqlMapGenerator targetPackage="com.ctb.mapper" targetProject="src/main/java"> <!-- 是否允许子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- 03 生成XxxMapper接口 --> <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 --> <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 --> <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --> <javaClientGenerator targetPackage="com.ctb.mapper" targetProject="src/main/java" type="XMLMAPPER"> <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- 配置表信息 --> <!-- schema即为数据库名 --> <!-- tableName为对应的数据库表 --> <!-- domainObjectName是要生成的实体类 --> <!-- enable*ByExample是否生成 example类 --> <!--<table schema="" tableName="t_book" domainObjectName="Book"--> <!--enableCountByExample="false" enableDeleteByExample="false"--> <!--enableSelectByExample="false" enableUpdateByExample="false">--> <!--<!– 忽略列,不生成bean 字段 –>--> <!--<!– <ignoreColumn column="FRED" /> –>--> <!--<!– 指定列的java数据类型 –>--> <!--<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>--> <!--</table>--> <table schema="" tableName="t_mvc_book" domainObjectName="Book" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"> <!-- 忽略列,不生成bean 字段 --> <!-- <ignoreColumn column="FRED" /> --> <!-- 指定列的java数据类型 --> <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> --> </table> </context> </generatorConfiguration>
注意:
1.修改本地路径到指定数据库jdbc驱动jar包的位置
<!--指定数据库jdbc驱动jar包的位置--> <classPathEntry location="D:\\software\\maven\\mvn_protetis\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
2.修改指定JavaBean生成的位置
<javaModelGenerator targetPackage="com.ctb.model" targetProject="src/main/java"> <!-- 是否允许子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false"/> <!-- 是否对model添加构造函数 --> <property name="constructorBased" value="true"/> <!-- 是否针对string类型的字段在set的时候进行trim调用 --> <property name="trimStrings" value="false"/> <!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 --> <property name="immutable" value="false"/> </javaModelGenerator>
3.修改指定sql映射文件生成的位置
<sqlMapGenerator targetPackage="com.ctb.mapper" targetProject="src/main/java"> <!-- 是否允许子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator>
4.修改指定mapper文件生成的位置
<javaClientGenerator targetPackage="com.ctb.mapper" targetProject="src/main/java" type="XMLMAPPER"> <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --> <property name="enableSubPackages" value="false"/> </javaClientGenerator>
5.修改需要引用的数据库表名--多张表则需要编写多个table标签
<table schema="" tableName="t_mvc_book" domainObjectName="Book" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"> <!-- 忽略列,不生成bean 字段 --> <!-- <ignoreColumn column="FRED" /> --> <!-- 指定列的java数据类型 --> <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> --> </table>
五、MyBatis实现CURD(增删改查)
1.找到配置好的MyBatis插件启动mybatis-generator.geneerate
它将会生成我们所需要的实体和数据访问层的接口类和实现类
2.mapper中接口与xml文件的关系
- 通过接口和 XML 文件的映射关系,实现了接口中的方法与 XML 文件中的 SQL 语句的绑定。
- 当调用接口的方法时,MyBatis会根据方法的名称和参数类型找到对应的XML文件中的SQL语句,并执行该SQL语句。
- XML文件中的SQL语句可以直接调用数据库操作,也可以通过映射配置将结果集映射到对象中。
为什么MyBatis要这么麻烦的定义一个接口和一个xml文件才能实现执行sql的功能呢?
:因为实际开发的过程中,SQL语句往往是比较复杂的,如果写在Java的类中不太合适的,因此采用了接口+XML文件的形式。
下面按照开发的工程思路,也就是下面的流程来实现MyBatis查询用户的功能:
3.编写业务逻辑层
接口类
package com.ctb.biz; import com.ctb.model.Book; /** * @author 彪 * @remark * @create 2023-08-21 8:20 */ public interface BookBiz { int deleteByPrimaryKey(Integer bid); int insert(Book record); int insertSelective(Book record); Book selectByPrimaryKey(Integer bid); int updateByPrimaryKeySelective(Book record); int updateByPrimaryKey(Book record); }
实现接口
package com.ctb.biz.impl; import com.ctb.biz.BookBiz; import com.ctb.mapper.BookMapper; import com.ctb.model.Book; /** * @author 彪 * @remark * @create 2023-08-21 8:20 */ public class BookBizImpl implements BookBiz { private BookMapper bookBiz; public BookMapper getBookBiz() { return bookBiz; } public void setBookBiz(BookMapper bookBiz) { this.bookBiz = bookBiz; } @Override public int deleteByPrimaryKey(Integer bid) { return bookBiz.deleteByPrimaryKey(bid); } @Override public int insert(Book record) { return bookBiz.insert(record); } @Override public int insertSelective(Book record) { return bookBiz.insertSelective(record); } @Override public Book selectByPrimaryKey(Integer bid) { return bookBiz.selectByPrimaryKey(bid); } @Override public int updateByPrimaryKeySelective(Book record) { return bookBiz.updateByPrimaryKeySelective(record); } @Override public int updateByPrimaryKey(Book record) { return bookBiz.updateByPrimaryKey(record); } }
4.SqlSession工厂类
package com.ctb.utils; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class SessionUtil { private static SqlSessionFactory sessionFactory; private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); static { sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml")); } public static SqlSession openSession() { SqlSession session = threadLocal.get(); if (null == session) { session = sessionFactory.openSession(); threadLocal.set(session); } return session; } public static void main(String[] args) { SqlSession session = openSession(); System.out.println(session.getConnection()); session.close(); // System.out.println(session.getConnection()); } }
5.测试类
package com.ctb.demo; import com.ctb.biz.BookBiz; import com.ctb.biz.impl.BookBizImpl; import com.ctb.mapper.BookMapper; import com.ctb.model.Book; import com.ctb.utils.SessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * @author 彪 * @remark * @create 2023-08-21 8:43 */ public class Demo { private SqlSession sqlSession; private BookBiz bookBiz; @Before public void a(){ System.out.println("执行测试方法之前会执行的初始化代码块"); sqlSession= SessionUtil.openSession(); BookBizImpl bookBiz = new BookBizImpl(); BookMapper mapper = sqlSession.getMapper(BookMapper.class); bookBiz.setBookBiz(mapper); this.bookBiz=bookBiz; } @After public void b(){ System.out.println("执行测试方法之后会执行"); } @Test public void test1(){ Book book = bookBiz.selectByPrimaryKey(35); System.out.println(book); } @Test public void test2(){ int i = bookBiz.deleteByPrimaryKey(35); if (i>0){ System.out.println("删除成功"); }else { System.out.println("删除失败"); } } }
这里简单测试了一下查询和删除,其他的就不一一测试了
测试结果
查询
删除
MyBatis快速入门以及环境搭建和CRUD的实现到这就结束了,
祝大家在编程之路越走越顺,越走越宽