前言
大家好,今天给大家带来一期有关Mybatis的博客分享,希望能给老铁们带来帮助和收获,也希望老铁们可以支持鼓励我。
一、Mybatis介绍
1. Mybatis是什么
MyBatis(前身为ibatis)是一种Java持久化框架,用于将数据库的操作和Java对象之间的映射关系进行管理。它提供了一种简单且灵活的方式来处理数据库的访问,使开发人员能够通过编写XML配置文件或注解来定义SQL语句,并将其与Java方法进行绑定。
2. Mybatis的核心思想
MyBatis的核心思想是将数据访问逻辑从业务逻辑中分离出来,通过配置文件或注解来定义SQL语句,并将其与Java对象进行映射。开发人员可以使用简单的CRUD操作来访问数据库,同时还可以使用复杂的SQL查询和存储过程。
核心思想的表现
Mybatis核心思想的表现
核心思想的体现 | 说明 |
SQL与Java对象的分离 | MyBatis将SQL语句与Java对象之间的映射关系进行了分离。开发人员可以通过配置文件或注解来定义SQL语句,而不需要将SQL语句直接写在Java代码中。这种分离的设计使得SQL语句可以独立于Java代码进行维护和修改,提高了代码的可维护性和可读性。 |
灵活的SQL编写 | MyBatis允许开发人员使用原生的SQL语句,可以根据具体的业务需求编写复杂的SQL查询和操作。开发人员可以充分利用数据库的特性和优化技巧,编写高效的SQL语句,从而提高数据库访问的性能。 |
映射配置 | MyBatis提供了强大的对象关系映射(ORM)功能,可以将查询结果自动映射到Java对象中。开发人员可以通过配置文件或注解来定义Java对象与数据库表之间的映射关系,从而简化了数据的处理和转换过程。 |
缓存机制 | MyBatis提供了缓存机制,可以在内存中缓存查询的结果集。通过合理配置缓存策略,可以减少对数据库的访问,提高查询的性能。缓存机制可以在一定程度上解决频繁查询相同数据的性能问题。 |
3. Mybatis的特点
- 灵活性:可以通过配置文件或注解来定义SQL语句,灵活地编写自己的SQL查询。
- 方便开发人员使用:MyBatis提供了简洁的API,使开发人员能够轻松地执行数据库操作。
- 易于集成(兼容性好):MyBatis可以与各种第三方框架(如Spring)进行无缝集成。
- 性能优化:MyBatis提供了缓存机制和批量操作等功能,可以提高数据库访问的性能。
二、搭建Mybatis框架环境
1. 创建maven工程(步骤如下图所示)
项目创建成功标识
2. 导入相关pom依赖(pom.xml)
<?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.yx</groupId> <artifactId>yx_mybatis01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>yx_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> </dependency> </dependencies> <build> <finalName>yx_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>
这就是利用pom.xml文件导入Mybatis依赖以及下载Mybatis的一些插件。
3. 数据库连接配置(Jdbc.properties)
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8 jdbc.username=mybatis_ssm jdbc.password=muyi
其中的jdbc.username和jdbc.password是要根据自身的数据库连接的账号和密码来设置的,以上的只是案例演示而已。
4. 修改web.xml文件代码
将web.xml的版本修改为3.1的版本。
<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"></web-app>
5. 安装Mybatis相关插件
5.1 插件的相关简介
Mybatis相关插件
插件 | 说明 |
Free mybatis plugin |
它为MyBatis框架提供了额外的功能和扩展。Free MyBatis Plugin可以帮助简化MyBatis的使用,并提供了一些有用的功能,如自动生成代码、动态SQL查询、分页查询等。它还支持与Spring框架的集成,使得在Spring应用中使用MyBatis更加方便。 |
MyBatis Generator | MyBatis Generator是一个用于自动生成Java代码的工具,特别是用于生成与MyBatis框架集成的代码。它可以根据数据库表结构自动生成实体类、Mapper接口和XML映射文件,从而减少手动编写重复代码的工作量,提高开发效率。也可以根据配置文件中的设置,自定义生成的代码的结构和内容,以满足项目的需求。并且它支持多种数据库,包括MySQL、Oracle、SQL Server等。 |
MyBatis Tools | 是一个用于辅助开发和提高开发效率的工具集合。它包括了一些常用的插件和工具,可以与MyBatis框架一起使用。 |
Maven Helper | 是一个用于辅助使用Maven构建工具的插件。Maven是一个流行的项目管理和构建工具,用于自动化构建、依赖管理和项目部署等任务。 |
5.2 插件的安装
Free mybatis plugin
如下图操作所示,如果未能找到一模一样的插件,就安装MyBatisX然后重启Idea即可使用。
MyBatis Generator
MyBatis Tools
Maven Helper
6. 代码生成器的配置(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:\\MYsoftware\\Maven\\mvn_repsoitory\\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.yx.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.yx.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.yx.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>
- 将<classPathEntry location="D:\\MYsoftware\\Maven\\mvn_repsoitory\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>的路径改为mysql-connector-java-5.1.44.jar本地下载好的路径,记得复制之后的路径别忘了有两个反斜杠的。
- <sqlMapGenerator targetPackage="com.yx.mapper" targetProject="src/main/java">中的targetPackage是指定sql映射文件生成的位置,可以根据自身的需求进行修改。
- <javaModelGenerator targetPackage="com.yx.model" targetProject="src/main/java">中的targetPackage是指定生成的model生成所在的包名,可以根据自身的需求进行修改。
- <javaClientGenerator targetPackage="com.yx.mapper" targetProject="src/main/java" type="XMLMAPPER">是指生成XxxMapper接口的位置路径,可以根据自身的需求进行修改。
<table schema="" tableName="t_mvc_Book" domainObjectName="Book"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false">这是配置表的信息,其中schema即为数据库名、tableName为对应的数据库表、domainObjectName是要生成的实体类等等,当然配置表可设置多个也就是意味着可生成多个对应的实体类以及方法接口类。可以根据自身的需求更改对应的数据库名及数据库表名。
7. 利用代码生成器生成对应的代码
三、Mybatis测试增删改查功能。
1. 编写业务层代码
BookBiz接口代码
package com.yx.biz; import com.yx.model.Book; 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); }
BookBizImpl实现类代码
package com.yx.biz.Impl; import com.yx.biz.BookBiz; import com.yx.mapper.BookMapper; import com.yx.model.Book; /** * @author 君易--鑨 * @site www.yangxin.com * @company 木易 * @create 2023-08-21 10:15 */ public class BookBizImpl implements BookBiz { // 调用代码生成器的接口 BookMapper bookMapper; public BookMapper getBookMapper() { return bookMapper; } @Override public int deleteByPrimaryKey(Integer bid) { return bookMapper.deleteByPrimaryKey(bid); } @Override public int insert(Book record) { return bookMapper.insert(record); } @Override public int insertSelective(Book record) { return bookMapper.insertSelective(record); } @Override public Book selectByPrimaryKey(Integer bid) { return bookMapper.selectByPrimaryKey(bid); } @Override public int updateByPrimaryKeySelective(Book record) { return bookMapper.updateByPrimaryKeySelective(record); } @Override public int updateByPrimaryKey(Book record) { return bookMapper.updateByPrimaryKey(record); } }
实体类Book.java
package com.yx.model; public class Book { private Integer bid; private String bname; private Float price; public Book(Integer bid, String bname, Float price) { this.bid = bid; this.bname = bname; this.price = price; } public Book() { super(); } public Integer getBid() { return bid; } public void setBid(Integer bid) { this.bid = bid; } public String getBname() { return bname; } public void setBname(String bname) { this.bname = bname; } public Float getPrice() { return price; } public void setPrice(Float price) { this.price = price; } @Override public String toString() { return "Book{" + "bid=" + bid + ", bname='" + bname + '\'' + ", price=" + price + '}'; } }
2. 数据库工具类
SessionUtil
package com.yx.untils; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * @author 君易--鑨 * @site www.yangxin.com * @company 木易 * @create 2023-08-21 10:15 *用于操作数据库 (对Mybatis进行建模) */ 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()); } }
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/yx/mapper/BookMapper.xml"/> </mappers> </configuration>
测试类Demo代码
Demo01代码
package com.yx.Demo; import com.yx.biz.BookBiz; import com.yx.biz.Impl.BookBizImpl; import com.yx.mapper.BookMapper; import com.yx.model.Book; import com.yx.untils.SessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * @author 君易--鑨 * @site www.yangxin.com * @company 木易 * @create 2023-08-21 10:26 * 测试增删改查的方法 */ public class Dmeo1 { // 实例化工具类和业务层类 private SqlSession sqlSession; private BookBiz bookBiz; @Before public void a(){ System.out.println("执行测试代码块之前会执行的初始化代码块......"); // 获取session对象 sqlSession=SessionUtil.openSession(); BookBizImpl bookBiz=new BookBizImpl(); // 获取BookMapper对象 BookMapper mapper=sqlSession.getMapper(BookMapper.class); // 将获取到的BookMapper对象添加到bookBiz中 bookBiz.setBookMapper(mapper); // 扩大作用权限 this.bookBiz=bookBiz; } @After public void b(){ System.out.println("执行测试代码块之后会执行的初始化代码块......"); // 提交数据库提交事务 sqlSession.commit(); } @Test // 查看 public void test1(){ System.out.println("测试查看方法..."); // 传入参数为id Book book=bookBiz.selectByPrimaryKey(25); // 打印输出 System.out.println(book); } @Test // 删除 public void test2(){ System.out.println("测试删除方法..."); // 传入参数为id int book=bookBiz.deleteByPrimaryKey(25); // 打印输出 System.out.println(book); } @Test // 新增 public void test3(){ System.out.println("测试新增方法..."); // 传入参数为book对象 Book book=new Book(); book.setBid(25); book.setBname("斗破苍穹"); book.setPrice(25.5f); int b=bookBiz.insert(book); // 打印输出 System.out.println(b); } @Test // 修改 public void test4(){ System.out.println("测试修改方法..."); // 传入参数为book对象 Book book=new Book(); book.setBid(25); book.setBname("斗破苍穹"); book.setPrice(35.5f); int b=bookBiz.updateByPrimaryKey(book); // 打印输出 System.out.println(b); } }
测试结果
查看
删除
新增
修改
感谢老铁们的阅读与支持,希望老铁能够三连一波,这无疑是对我最大的支持。请敬请期待下期博客的分享,我们下期再见。