一.了解mybatis!
A.什么是mybatis?
MyBatis是一个开源的持久层框架,它简化了在Java应用程序中使用关系型数据库的开发工作。MyBatis提供了将SQL语句和Java代码进行解耦的能力,使得应用程序可以通过简单的配置来访问数据库,并实现了对SQL查询、插入、更新和删除等操作的支持。
B.MyBatis这款框架的一些特点
SQL与Java代码解耦:
MyBatis使用XML或注解来定义SQL映射关系,将SQL语句与Java代码进行解耦。这样,开发人员无需编写大量的JDBC代码,可以集中精力于业务逻辑的实现。
灵活的SQL查询
MyBatis支持灵活的动态SQL查询,可以根据不同的条件动态构建SQL语句,并且提供了强大的SQL语句处理能力,如条件判断、循环等。这样可以方便地编写复杂的查询语句。
对象-关系映射
MyBatis提供了通过对象-关系映射(ORM)将查询结果映射为Java对象的能力。开发人员可以通过配置简单的映射规则,将数据库表的数据映射到相应的Java对象中,简化了数据的获取和处理过程。
缓存机制
MyBatis支持一级缓存和二级缓存机制,提高了数据库访问性能。一级缓存是SqlSession级别的缓存,可以减少对数据库的重复查询;二级缓存是全局级别的缓存,多个SqlSession之间可以共享缓存数据。
注解支持
除了使用XML配置SQL映射外,MyBatis还支持使用注解来编写和配置SQL语句。使用注解可以使得SQL语句与Java代码更加紧密,提高了开发效率。
插件扩展
MyBatis提供了丰富的插件扩展机制,允许开发人员自定义插件来增强或修改MyBatis的行为。插件可以在SQL执行前后、参数处理前后等不同阶段进行拦截和干预。
总结来说,MyBatis是一个轻量级的持久层框架,通过XML配置或注解来定义SQL映射关系,并提供了灵活的动态SQL查询、对象-关系映射等功能,使得开发人员可以更方便地操作数据库。同时,MyBatis还具有缓存机制、注解支持和插件扩展等特性,进一步提升了开发效率和可扩展性。
C.Mybatis框架的一些应用场景
MyBatis在如今的Java开发中广泛应用于以下几个方面:
C1.Web应用开发:
MyBatis可以与各种主流的Java Web框架(如Spring MVC、Spring Boot、Struts等)结合使用,用于处理Web应用程序中的持久层数据访问。通过定义SQL映射关系,可以方便地进行数据库的查询、插入、更新和删除等操作。
C2.微服务架构
随着微服务架构的兴起,许多企业开始将大型应用拆分为一组独立的微服务。在每个微服务中,MyBatis可以作为持久层框架用于处理数据访问。通过MyBatis提供的灵活的SQL查询和对象-关系映射功能,可以方便地对微服务的数据库进行操作。
C3.数据处理和ETL
MyBatis可以作为一个轻量级的数据处理工具,用于执行批量数据处理和Extract-Transform-Load (ETL) 操作。通过编写简单的SQL语句,并结合MyBatis提供的批量操作和动态SQL功能,可以高效地处理大量的数据。
C4.批处理应用
在后台批处理应用中,MyBatis可以用于执行复杂的数据查询和更新操作。通过MyBatis的一级缓存和二级缓存机制,可以提高批处理应用的性能,并有效地管理数据库连接和事务。
C5.数据库工具和管理系统
MyBatis提供了用于管理和操作数据库的工具和接口,可以方便地进行数据访问和管理。开发人员可以使用MyBatis的API和工具来执行各种数据库操作,如数据导入、数据备份、数据迁移等。
C6.总结
总而言之,MyBatis在如今的Java开发中被广泛应用于Web应用开发、微服务架构、数据处理和ETL、批处理应用以及数据库工具和管理系统等领域。它提供了简单且灵活的方式来处理数据访问,并且与其他主流的Java框架和技术集成良好。
D.学习MyBatis重要动力!
提高数据库访问效率
MyBatis可以帮助你优化数据库访问性能。它通过提供一级缓存和二级缓存机制来减少对数据库的频繁查询,提高了系统的响应速度和整体性能。学习MyBatis可以帮助你学会如何正确地使用缓存机制,从而提高数据库查询效率。
简化数据访问层的开发
MyBatis通过将SQL语句与Java代码进行解耦,使得数据访问层的开发更加简单和易于维护。学习MyBatis可以帮助你理解如何使用XML或注解来定义SQL映射关系,以及如何执行各种数据库操作(如查询、插入、更新和删除)。这将大大减少编写繁琐的JDBC代码的工作量。
灵活的动态SQL查询
MyBatis提供了灵活的动态SQL查询功能,可以根据不同的条件动态构建SQL语句。这使得你能够根据具体业务需求编写复杂的查询语句,而无需额外的复杂逻辑。学习MyBatis可以帮助你掌握动态SQL的使用方法,提高查询的灵活性和可扩展性。
对象-关系映射(ORM)支持
MyBatis支持将查询结果映射为Java对象,简化了数据的获取和处理过程。通过学习MyBatis,你可以了解如何使用对象-关系映射(ORM)来将数据库表的数据映射到Java对象中,从而方便地操作数据。
与其他框架的集成
MyBatis与其他主流的Java框架(如Spring、Spring Boot等)集成良好。学习MyBatis可以帮助你了解如何将MyBatis与这些框架结合使用,以实现更完整的应用程序开发。
综上所述,学习MyBatis能够提高数据库访问效率,简化数据访问层的开发,实现灵活的动态SQL查询,支持对象-关系映射(ORM),以及与其他框架的集成。这些都是在日常Java开发中非常有价值的技能。无论是从事Web开发、微服务架构还是其他与数据库相关的工作,学习MyBatis都会对你的开发技能和职业发展有积极的影响。
二.将My'batis部署在IDEA 中,并且实施增删修查!
A.Mybatis配置环境
A1.导入依赖
直接替换pom的xml文件的内容
<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>
这段配置文件配置在 file-Name后面
<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>
导入插件
<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>
B.加载数据库配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=数据库名字
jdbc.password=数据库密码
C.修改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"></web-app>
D.下载插件
Free mybatis plugin
Mybatis generator
mybatis tools
maven helper
以上四个,用于mybatis开发的插件
配置:mybatis.cfg.xml,generatorConfig.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/javaxl/mapper/BookMapper.xml"/>
</mappers>
</configuration>
<?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:\\initPath\\mvn_repository\\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.javaxl.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.javaxl.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.javaxl.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>
F.运行结果
自动生成代码,和实现方法
G.测试方法
package com.lz.demo;
import com.lz.biz.BookBiz;
import com.lz.biz.impl.BookBizImpl;
import com.lz.mapper.BookMapper;
import com.lz.model.Book;
import com.lz.utils.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author lz
* @create 2023-08-20 22:56
*/
public class demo1 {
private SqlSession sqlSession;
private BookBiz bookBiz;
@Before
public void a(){
System.out.println("刘兵是傻逼");
sqlSession= SessionUtil.openSession();
BookBiz bookBiz = new BookBizImpl();
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
((BookBizImpl) bookBiz).setBookMapper(mapper);
this.bookBiz=bookBiz;
}
@After
public void b(){
System.out.println("刘兵不是傻逼");
}
@Test
public void test1(){
System.out.println("测试方法");
Book book = bookBiz.selectByPrimaryKey(25);
System.out.println(book);
}
@Test
public void test2(){
int i = bookBiz.deleteByPrimaryKey(25);
}
}