MyBatis快速入门以及环境搭建和CRUD的实现

目录

前言

一、MyBatis简介

1.MyBatis是什么

2.MyBatis的特点

3.mybatis的作用

4.MyBatis的应用场景

5.MyBatis优缺点

二、相关概念

1.ORM概述

2.常见的ORM框架

3.什么是持久层框架

三、MyBatis的工作原理

1.框架交互

2.工作原理

​编辑

四、MyBatis环境搭建

1 创建maven工程

2 导入相关pom依赖

3 导入jdbc配置文件

4.导入web.xml对应版本

5 Mybatis相关插件安装

6 Mybatis-cfg.xml 核心配置

7 generatorConfig.xml 配置代码生成器

五、MyBatis实现CURD(增删改查)

1.找到配置好的MyBatis插件启动mybatis-generator.geneerate

 2.编写业务逻辑层

3.SqlSession工厂类

4.测试类

测试结果


前言

MyBatis是一个简单易用的持久层框架,通过将Java对象映射到数据库表中,提供了高效、灵活的数据库访问解决方案。相对于其他ORM框架,MyBatis具有更低的学习成本和更高的灵活性,使得开发人员可以更加直观地操作数据库。

本文将带您了解MyBatis的基本概念、特性以及它在项目中的优势和应用场景。首先,我们会介绍什么是MyBatis以及它的工作原理。然后,我们将探讨MyBatis的环境搭建。最后,我们将讨论MyBatis适用的场景,并展示如何进行基本的CRUD操作。

通过学习本文,您将对MyBatis有一个全面的了解,并能够在实际项目中应用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的应用场景

  1. 对SQL语句有较强的控制需求:如果你对数据库操作需要具备高度的灵活性和精确性,MyBatis可以为你提供更细粒度的控制能力。你可以直接编写和调优SQL语句来满足特定的需求,而无需依赖框架的自动生成SQL。

  2. 复杂业务逻辑和数据处理:在某些项目中,业务逻辑可能非常复杂,并且需要对数据进行一系列的处理,此时使用MyBatis可以使得数据的处理更加直观和方便。通过配置映射文件(或注解),将Java对象与数据库表之间的映射关系定义清晰,可以更直接地操作这些数据对象。

  3. 性能要求较高的系统:MyBatis拥有良好的性能,通过合理地利用缓存机制和优化技巧,能够有效减少数据库访问次数,并提高系统的响应速度。因此,在需要注重性能和响应时间的系统中,MyBatis是一个很好的选择。

  4. 需要与现有的数据库和代码集成:如果你的项目已经存在了一个成熟的数据库以及对应的数据表结构,且希望借助一个简单的持久层框架将其与代码集成起来,那么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语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
 

二、相关概念

1.ORM概述

在使用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对象存储到数据库中,并从数据库中读取和修改对象的数据。持久层框架简化了数据访问的过程,极大地提高了开发效率。开发人员不仅更方便地进行数据库操作,并提高系统的性能和可维护性。

持久层框架提供了以下功能:

  1. 对象-关系映射:持久层框架能够将Java对象与数据库表之间进行映射,使得开发人员可以使用面向对象的思维来操作数据库。

  2. 数据库访问:持久层框架提供了一套API或方法,用于执行常见的数据库操作,如插入、更新、删除和查询等。通过这些方法,可以方便地进行数据库操作,不必直接编写原始的SQL语句。

  3. 缓存管理:持久层框架通常会提供缓存机制,通过缓存可以提高系统的性能,减少对数据库的频繁访问。框架会自动管理和更新缓存,以保持数据的一致性。

  4. 事务管理:持久层框架通常会提供事务管理的功能,确保数据库操作的一致性和完整性。开发人员可以通过框架提供的API或注解来控制事务的边界,并进行事务的提交或回滚操作。

  5. 查询语言支持:持久层框架通常会针对查询操作提供更高级的查询语言或查询构建器,使得查询操作更加灵活和直观。

  6. 映射配置:持久层框架允许开发人员配置对象与数据库表之间的映射关系,通过配置文件或注解方式定义表的结构以及属性和字段的映射规则。

  7. 数据库连接池管理:持久层框架通常会提供数据库连接池来管理数据库连接的获取和释放,以提高数据库访问的效率和性能。

三、MyBatis的工作原理

1.框架交互

开始搭建MyBatis之前,我们先来看看MyBatis在整个框架中的定位,框架交互流程图:

我们知道,MyBatis是ORM框架(Object Relational Mapping)即对象关系映射。

在⾯向对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象的互相转换:

ORM将数据库映射为对象:

数据库表(table)--> 类(class)
记录(record,⾏数据)--> 对象(object)
字段(field) --> 对象的属性(attribute)
⼀般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。

也就是说使⽤ MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间
的转换,接下来我们来看 MyBatis 的使⽤吧。

2.工作原理

  1. 配置文件:在配置文件中设置数据库连接信息、映射器(Mapper)以及各种配置选项。

  2. SqlSessionFactory:通过SqlSessionFactory来获取SqlSession。SqlSessionFactory是一个单例对象,负责创建和管理SqlSession。

  3. SqlSession:SqlSession是MyBatis与数据库交互的主要接口。它可以执行SQL语句、提交和回滚事务等操作。

  4. Mapper接口:为每个SQL语句编写对应的Mapper接口,通过Mapper接口中的方法来执行SQL操作。

  5. 映射文件(或注解):将SQL语句与Mapper接口的方法进行映射。可以使用XML配置文件或注解方式定义SQL语句。

  6. 数据库操作:通过编写合适的SQL语句,调用Mapper接口中的方法来进行数据库的增删改查等操作。

  7. 结果映射: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">--><!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;--><!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;--><!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;--><!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;--><!--</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;}@Overridepublic int deleteByPrimaryKey(Integer bid) {return bookBiz.deleteByPrimaryKey(bid);}@Overridepublic int insert(Book record) {return bookBiz.insert(record);}@Overridepublic int insertSelective(Book record) {return bookBiz.insertSelective(record);}@Overridepublic Book selectByPrimaryKey(Integer bid) {return bookBiz.selectByPrimaryKey(bid);}@Overridepublic int updateByPrimaryKeySelective(Book record) {return bookBiz.updateByPrimaryKeySelective(record);}@Overridepublic 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;@Beforepublic void a(){System.out.println("执行测试方法之前会执行的初始化代码块");sqlSession= SessionUtil.openSession();BookBizImpl bookBiz = new BookBizImpl();BookMapper mapper = sqlSession.getMapper(BookMapper.class);bookBiz.setBookBiz(mapper);this.bookBiz=bookBiz;}@Afterpublic void b(){System.out.println("执行测试方法之后会执行");}@Testpublic void test1(){Book book = bookBiz.selectByPrimaryKey(35);System.out.println(book);}@Testpublic void test2(){int i = bookBiz.deleteByPrimaryKey(35);if (i>0){System.out.println("删除成功");}else {System.out.println("删除失败");}}
}

 这里简单测试了一下查询和删除,其他的就不一一测试了

测试结果

查询

删除

 MyBatis快速入门以及环境搭建和CRUD的实现到这就结束了,

祝大家在编程之路越走越顺,越走越宽

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/107075.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多次跑网络流(用于构造类)+霍尔定理证明可行:AGC317G

https://atcoder.jp/contests/abc317/tasks/abc317_g 一个很显然的思路&#xff0c;就是行向颜色连边&#xff0c;但约束条件展现出多个维度&#xff0c;所以可以考虑跑多次网络流。 但跑同样的网络流没有意义&#xff0c;所以每次跑完都要在残余网络上操作一下才可行。此题中…

JVM理论知识

一、JVM内存结构 java的内存模型主要分为5个部分&#xff0c;分别是&#xff1a;JVM堆、JVM栈、本地栈、方法区还有程序计数器&#xff0c;他们的用途分别是&#xff1a; JVM堆&#xff1a;新建的对象都会放在这里&#xff0c;他是JVM中所占内存最大的区域。他又分为新生区还…

项目---日志系统

目录 项目系统开发环境核心技术日志系统介绍为什么需要日志系统? 日志系统框架设计日志系统模块划分代码实现通用工具实现日志等级模块实现日志消息模块实现格式化模块实现落地模块实现日志器模块同步日志器异步日志器缓冲区实现异步工作器实现 回归异步日志器模块建造者模式日…

【JavaEE】Spring事务-事务的基本介绍-事务的实现-@Transactional基本介绍和使用

【JavaEE】Spring事务&#xff08;1&#xff09; 文章目录 【JavaEE】Spring事务&#xff08;2&#xff09;1. 为什么要使用事务2. Spring中事务的实现2.1 事务针对哪些操作2.2 MySQL 事务使用2.3 Spring 编程式事务&#xff08;手动挡&#xff09;2.4 Spring 声明式事务&#…

分享一种针对uni-app相对通用的抓包方案

PART1&#xff0c;前言 近年来混合开发APP逐渐成为主流的开发模式&#xff0c;与传统的开发模式相比混合开发极大的提升了开发效率&#xff0c;同时跨平台的特性也降低了开发成本&#xff0c;一直以来混合开发被诟病的性能问题随着技术的发展也得到改善。技术的发展往往是一把…

基于FPGA的Lorenz混沌系统verilog开发,含testbench和matlab辅助测试程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将vivado的仿真结果导入到matlab显示三维混沌效果&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 testbench如下所…

4.15 TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗?

目录 HTTP 的 Keep-Alive TCP 的 Keepalive 总结&#xff1a; HTTP的Keep-Alive&#xff0c;是应用层&#xff08;用户态&#xff09;实现的&#xff0c;称为HTTP长连接&#xff1b; TCP的Keepalive&#xff0c;是由TCP层&#xff08;内核态&#xff09;实现的&#xff0c;…

下载的文件被Windows 11 安全中心自动删除

今天从CSDN上下载了自己曾经上传的文件&#xff0c;但是浏览器下载完之后文件被Windows安全中心自动删除&#xff0c;说是带病毒。实际是没有病毒的&#xff0c;再说了即便有病毒也不应该直接删除啊&#xff0c;至少给用户一个保留或删除的选项。 研究了一番&#xff0c;可以暂…

2023-8-25 最大异或对

题目链接&#xff1a;最大异或对 #include <iostream> #include <algorithm>using namespace std;const int N 100010, M 31 * N;int a[N]; int son[M][2], idx;void insert(int x) {int p 0;for(int i 30; i > 0; i --){int u x >> i & 1;if(…

求生之路2私人服务器开服搭建教程centos

求生之路2私人服务器开服搭建教程centos 大家好我是艾西&#xff0c;朋友想玩求生之路2(left4dead2)重回经典。Steam玩起来有时候没有那么得劲&#xff0c;于是问我有没有可能自己搭建一个玩玩。今天跟大家分享的就是求生之路2的自己用服务器搭建的一个心路历程。 &#xff0…

如何把本地项目上传github

一、在gitHub上创建新项目 【1】点击添加&#xff08;&#xff09;-->New repository 【2】填写新项目的配置项 Repository name&#xff1a;项目名称 Description &#xff1a;项目的描述 Choose a license&#xff1a;license 【3】点击确定&#xff0c;项目已在githu…

课程项目设计--spring security--认证管理功能--宿舍管理系统--springboot后端

写在前面&#xff1a; 还要实习&#xff0c;每次时间好少呀&#xff0c;进度会比较慢一点 本文主要实现是用户管理相关功能。 前文项目建立 文章目录 验证码功能验证码配置验证码生成工具类添加依赖功能测试编写controller接口启动项目 security配置拦截器配置验证码拦截器 …

threejs贴图系列(一)canvas贴图

threejs不仅支持各种texture的导入生成贴图&#xff0c;还可以利用canvas绘制图片作为贴图。这就用到了CanvasTexture&#xff0c;它接受一个canas对象。只要我们绘制好canvas&#xff0c;就可以作为贴图了。这里我们利用一张图片来实现这个效果。 基础代码&#xff1a; impo…

【C++初阶】模拟实现list

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

自组织映射

无监督深度学习&#xff1a; 无监督模型使神经网络能够执行聚类、异常检测、特征选择、特征提取、降维和推荐系统等任务。这些神经网络包括 自组织图、玻尔兹曼机、自动编码器。 什么是 SOM&#xff1f; 简而言之&#xff0c;自组织映射是一种基于竞争学习的人工神经网络&am…

<C++> STL_vector

1.vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它的…

[管理与领导-52]:IT基层管理者 - 8项核心技能 - 7 - 决策

目录 前言&#xff1a; 一、什么是决策 二、为什么需要管理者的决策 三、什么时候需要管理者决策 四、常见的决策误区 4.1 关于决策的误区 4.2 错误的决策行为 五、如何进行有效决策 六、进行决策的常用方法 前言&#xff1a; 管理者存在的价值就是制定目标&#xff0…

docker 学习-- 04 实践搭建 1(宝塔)

docker 学习-- 04 实践 1&#xff08;宝塔&#xff09; docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 docker 学习-- 03 环境安装 docker 学习-- 04 实践 1&#xff08;宝塔&#xff09; 通过上面的学习&#xff0c; 已经可以搭建简单的案例&#xff0c; 接着我会搭…

2000-2021年地级市产业升级、产业结构高级化面板数据

2000-2021年地级市产业升级、产业结构高级化面板数据 1、时间&#xff1a;2000-2021年 2、范围&#xff1a;地级市 3、指标&#xff1a;年份、地区、行政区划代码、地区、所属省份、地区生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一产业占GDP比重、第二…

【RuoYi移动端】HBuild工具插件安装和系统配置manifest.json

一、点【工具】-【插件安装】安装如下工具 二、点【manifest.json】