目录
前言
一、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是一个开源的持久层框架,它提供了将Java对象映射到数据库记录的功能,通过XML或注解配置SQL语句,并且能够执行和管理这些SQL语句。MyBatis通过简化数据库访问操作,帮助开发人员更有效地与关系型数据库进行交互。
MyBatis主要用于将Java对象与数据库之间进行映射,实现对象和关系型数据库之间的交互。它可以处理SQL语句的执行、结果集的映射、事务管理等操作,帮助开发人员更加方便地进行数据库操作。
对SQL语句有较强的控制需求:如果你对数据库操作需要具备高度的灵活性和精确性,MyBatis可以为你提供更细粒度的控制能力。你可以直接编写和调优SQL语句来满足特定的需求,而无需依赖框架的自动生成SQL。
复杂业务逻辑和数据处理:在某些项目中,业务逻辑可能非常复杂,并且需要对数据进行一系列的处理,此时使用MyBatis可以使得数据的处理更加直观和方便。通过配置映射文件(或注解),将Java对象与数据库表之间的映射关系定义清晰,可以更直接地操作这些数据对象。
性能要求较高的系统:MyBatis拥有良好的性能,通过合理地利用缓存机制和优化技巧,能够有效减少数据库访问次数,并提高系统的响应速度。因此,在需要注重性能和响应时间的系统中,MyBatis是一个很好的选择。
需要与现有的数据库和代码集成:如果你的项目已经存在了一个成熟的数据库以及对应的数据表结构,且希望借助一个简单的持久层框架将其与代码集成起来,那么MyBatis是一个合适的选择。MyBatis能够通过简单的映射配置,将已有的数据库转化为Java对象,从而提供方便的数据库操作接口。
优点:
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 简单理解为上面我们提出的,可以自动将对象与数据进行映射的技术。
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使用人数和公司也是最多的。
持久层框架是用于处理数据持久化的软件工具或库。它提供了一组API和工具,使开发人员可以将Java对象存储到数据库中,并从数据库中读取和修改对象的数据。持久层框架简化了数据访问的过程,极大地提高了开发效率。开发人员不仅更方便地进行数据库操作,并提高系统的性能和可维护性。
持久层框架提供了以下功能:
对象-关系映射:持久层框架能够将Java对象与数据库表之间进行映射,使得开发人员可以使用面向对象的思维来操作数据库。
数据库访问:持久层框架提供了一套API或方法,用于执行常见的数据库操作,如插入、更新、删除和查询等。通过这些方法,可以方便地进行数据库操作,不必直接编写原始的SQL语句。
缓存管理:持久层框架通常会提供缓存机制,通过缓存可以提高系统的性能,减少对数据库的频繁访问。框架会自动管理和更新缓存,以保持数据的一致性。
事务管理:持久层框架通常会提供事务管理的功能,确保数据库操作的一致性和完整性。开发人员可以通过框架提供的API或注解来控制事务的边界,并进行事务的提交或回滚操作。
查询语言支持:持久层框架通常会针对查询操作提供更高级的查询语言或查询构建器,使得查询操作更加灵活和直观。
映射配置:持久层框架允许开发人员配置对象与数据库表之间的映射关系,通过配置文件或注解方式定义表的结构以及属性和字段的映射规则。
数据库连接池管理:持久层框架通常会提供数据库连接池来管理数据库连接的获取和释放,以提高数据库访问的效率和性能。
开始搭建MyBatis之前,我们先来看看MyBatis在整个框架中的定位,框架交互流程图:
我们知道,MyBatis是ORM框架(Object Relational Mapping)即对象关系映射。
在⾯向对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象的互相转换:
ORM将数据库映射为对象:
数据库表(table)--> 类(class)
记录(record,⾏数据)--> 对象(object)
字段(field) --> 对象的属性(attribute)
⼀般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。
也就是说使⽤ MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间
的转换,接下来我们来看 MyBatis 的使⽤吧。
配置文件:在配置文件中设置数据库连接信息、映射器(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对象与数据库之间的交互。
4.0.0
com.ctb
mybatis01
1.0-SNAPSHOT
war
mybatis01 Maven Webapp
http://www.example.com
1.8
1.8
junit
junit
4.12
javax.servlet
javax.servlet-api
4.0.0
provided
org.mybatis
mybatis
3.4.5
mysql
mysql-connector-java
5.1.44
org.apache.logging.log4j
log4j-core
2.9.1
org.apache.logging.log4j
log4j-api
2.9.1
org.apache.logging.log4j
log4j-web
2.9.1
mybatis01
src/main/java
**/*.xml
src/main/resources
jdbc.properties
*.xml
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
mysql
mysql-connector-java
5.1.44
true
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
根据自己所使用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
Archetype Created Web Application
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可以帮助你自动添加这些依赖,简化配置过程。
注意:
1.修改本地路径到指定数据库jdbc驱动jar包的位置
2.修改指定JavaBean生成的位置
3.修改指定sql映射文件生成的位置
4.修改指定mapper文件生成的位置
5.修改需要引用的数据库表名--多张表则需要编写多个table标签
它将会生成我们所需要的实体和数据访问层的接口类和实现类
- 通过接口和 XML 文件的映射关系,实现了接口中的方法与 XML 文件中的 SQL 语句的绑定。
- 当调用接口的方法时,MyBatis会根据方法的名称和参数类型找到对应的XML文件中的SQL语句,并执行该SQL语句。
- XML文件中的SQL语句可以直接调用数据库操作,也可以通过映射配置将结果集映射到对象中。
为什么MyBatis要这么麻烦的定义一个接口和一个xml文件才能实现执行sql的功能呢?
:因为实际开发的过程中,SQL语句往往是比较复杂的,如果写在Java的类中不太合适的,因此采用了接口+XML文件的形式。
下面按照开发的工程思路,也就是下面的流程来实现MyBatis查询用户的功能:
接口类
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);
}
}
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 threadLocal = new ThreadLocal();
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());
}
}
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的实现到这就结束了,
祝大家在编程之路越走越顺,越走越宽