目录
1.Mybatis的背景
2.Mybatis的的作用
3.Mybatis概述
4.Mybatis的定义
5.Mybatis的特点
6.ORM框架是什么
7.Mybatis与其他ORM框架的区别
8.mybatis优缺点
9.MyBatis的核心组件
10.MyBatis环境搭建
10.1创建Maven项目
10.2pom.xml修改
10.3 jdbc.properties
10.4web.xml
11.MyBatis的CRUD
11.1编写业务逻辑层
11.2SqlSession工厂类
11.3.测试类
Mybatis是一款优秀的持久层框架,它是由Apache软件基金会提供的一个开源项目,它在Hibernate、TopLink等ORM框架的基础上,将Sql语句与代码解耦,以及动态Sql的使用,使得开发者可以灵活地控制Sql语句的生成和执行过程。
在Java开发领域,Sql语句的编写一直是比较麻烦和容易出错的一个环节,传统的JDBC方式需要开发者手动拼写Sql语句,并且在执行时需要手动设置参数和处理结果集。而ORM框架则是将Java对象和数据库表进行映射,在进行增、删、改、查等操作时,只需要对Java对象进行操作,ORM框架会将操作转化为对数据库的Sql语句进行操作。但是,ORM框架常常会存在一定的性能问题,特别是对于超大型数据量和高并发的系统,ORM框架的性能会更加明显地劣于手工编写的Sql语句。
Mybatis框架结合了ORM框架和手工Sql语句编写的优点,它通过Sql映射文件与Java接口的方法进行绑定,实现了Java对象与数据库表的映射,同时也允许开发者手动控制Sql语句的生成和执行过程,这样就可以更好地控制程序的性能。另外,Mybatis框架提供了一些成熟的缓存机制,能够有效地减少数据库访问的次数,提升系统的性能。Mybatis框架还有很多其他的高级特性,如动态Sql、参数映射、插件等功能,可以进一步提升开发效率和程序性能。
Mybatis的主要作用是简化数据库访问代码的编写,提供灵活性和高度可定制性的数据持久化解决方案。具体来说,Mybatis的作用包括以下几个方面:
数据库访问:Mybatis可以帮助开发人员处理与数据库的交互,包括执行SQL语句、查询数据、插入、更新和删除等操作。它提供了丰富的API和配置方式,使得开发人员能够轻松地进行数据库访问。
SQL映射:Mybatis将SQL语句与Java代码进行分离,通过XML或注解的方式进行配置,使得开发人员可以更加专注于业务逻辑的实现。它支持动态SQL,可以根据不同的条件生成不同的SQL语句,提供了强大的灵活性。
参数映射:Mybatis支持将Java对象与SQL语句的参数进行映射,可以通过命名参数或位置参数的方式传递参数。它还提供了丰富的参数处理方式,包括自动类型转换、参数校验和参数处理器等。
结果集映射:Mybatis支持将查询结果映射为Java对象,可以通过配置文件或注解来定义映射关系。它提供了灵活的映射方式,可以将查询结果映射为单个对象、列表、嵌套对象等形式,方便数据的处理和操作。
缓存机制:Mybatis具有缓存机制,可以缓存查询结果,提高数据库访问的性能。它支持一级缓存和二级缓存,可以根据需求进行配置和使用。
总而言之,Mybatis作为一款轻量级的Java持久层框架,可以帮助开发人员简化数据库访问的代码编写,提供灵活性和高度可定制性的数据持久化解决方案。它在许多项目中得到广泛应用,成为Java开发人员进行数据库访问的首选框架之一。
Mybatis是一个基于Java语言的持久层框架,它通过XML描述符或注解将对象与关系型数据库中的表进行映射,使得在Java应用程序中操作数据库变得方便和高效。Mybatis具有以下优点:
灵活性高:Mybatis通过Sql映射文件与Java接口的方法进行绑定,允许开发者手动控制Sql语句的生成和执行过程,极大地提高了灵活性。
易于学习和使用:Mybatis核心配置简单明了,且集成规范,易于上手。
性能出色:Mybatis不会对Sql进行特意优化,而是将这一任务交给了开发者,因此开发者可以根据自己的需求对Sql进行优化,从而提高性能。
易于集成:Mybatis可以与Spring等大多数主流框架无缝集成。
总之,Mybatis是一款开源的、轻量级的、高效的Java持久化框架,非常适合开发中、小型项目。
Mybatis是一款基于Java语言的持久层框架,它通过SQL映射文件或注解将Java对象与数据库表进行映射,方便进行数据的持久化操作。Mybatis的核心思想是将SQL语句与Java代码进行解耦,使得开发者能够更好地控制SQL语句的生成和执行过程,进而提高系统的灵活性、可维护性和性能。
当我们考虑使用 MyBatis,就好像我们在处理数据库时的一种智能方法。想象一下,你是一个数据库管理员,有一堆数据库表格和数据,而你的任务是通过编写查询语句来检索、插入、更新和删除数据。但是,你不想使用复杂的工具,而是更喜欢直接使用 SQL 语句来处理数据。
MyBatis 就像是你的助手,它让你可以轻松地执行数据库操作,而无需关心太多底层细节。你可以将数据库表格和 Java 类之间的关系告诉 MyBatis,然后告诉它你想要执行的操作,比如查询特定数据,或者将新数据插入到表格中。
与传统的方法不同,MyBatis 允许你在 XML 配置文件中编写 SQL 查询,也可以通过注解在 Java 代码中指定。这就像是你编写一份清单,告诉 MyBatis 你想要做什么,然后它会帮你将这些请求转化为真正的 SQL 查询。这样,你可以轻松地在 Java 代码中调用这些查询,就像在数据库中进行搜索一样简单。
而且,MyBatis 还有其他聪明的功能。它支持缓存,这意味着当你多次查询相同的数据时,它会从内存中快速获取,而不是每次都去数据库查询。它还支持懒加载,这意味着当你需要某些关联数据时,它才会从数据库中加载,而不是一次性加载所有内容。
总之,使用 MyBatis 就像是在处理数据库时有一个智能的助手,它帮助你编写、执行和管理数据库操作,同时让你保持对 SQL 查询和数据流的直接控制。这样,你可以更专注于业务逻辑,而不必过多担心数据库访问的复杂性。
Mybatis有以下特点:
灵活性:Mybatis可以通过SQL映射文件或注解实现SQL的编写,开发者可以根据实际需求自由定义SQL语句,不受框架限制。
可维护性:Mybatis可以将SQL语句和Java代码进行解耦,使得SQL语句的修改和维护更加方便。
易于学习和使用:相对于其他ORM框架,Mybatis的学习曲线较为平缓,文档齐全,易于上手。
高性能: Mybatis使用了缓存机制,可以有效地提高系统的性能和响应速度。
支持多种数据库:Mybatis支持多种关系型数据库,包括MySQL、Oracle、SQL Server等,使用方便灵活。
当谈到 MyBatis 这个东西时,就好像在讨论一位非常擅长连接你和数据库的"翻译家"。想象一下,你有一个庞大的图书馆,里面放满了书籍,而你需要找到特定的书籍或者把新的书籍放进去。但是,你不擅长找到正确的书架,或者不知道如何将新书整理好。
MyBatis 就像是那位翻译家,它能够帮助你实现与图书馆的沟通,就像你在使用英语与其他人对话一样。你告诉这位翻译家你需要哪本书,或者你想要添加什么新书,然后它会帮你找到正确的书架,整理好新书,确保你的请求得到满足。
与其他复杂的工具不同,MyBatis 让整个过程变得非常直观。你可以告诉它,哪本书对应着哪个数据库表,然后告诉它你需要哪种操作,比如读取书籍或者添加新书。你可以在一个叫做 XML 配置文件的地方写下你的要求,或者在你的代码中用特殊的记号标明。
而且,MyBatis 还有一些额外的优点。它支持缓存,就好像你把你最常用的书放在你的书桌上,这样可以更快地拿到它们,而不是每次都去书架上翻找。还有懒加载功能,当你只需要特定的书籍时,它会帮你把那本书从书架上取下来,而不是一次性把所有书都取出来。
总之,MyBatis 就像是一个与图书馆之间建立联系的智能翻译家。它能够帮你轻松实现与数据库的交流,而不需要过多担心复杂的操作。这样,你可以更专注于你的工作,而不必花费过多时间在与数据库的互动上。
ORM(Object-Relational Mapping)框架是一种将对象模型和关系数据库之间进行映射的技术。它的主要作用是将数据库中的数据映射为对象,使得开发人员可以通过面向对象的方式来操作数据库,而不需要直接编写SQL语句。
ORM框架通过提供一系列的API和工具,将数据库表和对象之间的映射关系进行定义和管理。开发人员可以通过配置或注解的方式,将对象与数据库表进行关联,定义字段之间的映射关系,以及定义对象之间的关联关系。
ORM框架的主要优点包括:
- 简化数据库操作:ORM框架隐藏了底层数据库的细节,开发人员可以通过面向对象的方式来进行数据库操作,无需编写复杂的SQL语句。
- 提高开发效率:ORM框架提供了一系列的CRUD(增删改查)操作的API和工具,可以大大简化数据库操作的代码量,提高开发效率。
- 跨数据库支持:ORM框架一般支持多种数据库,开发人员可以在不同的数据库之间进行切换,而无需修改大量的代码。
- 对象关系映射:ORM框架将数据库表和对象之间的映射关系进行管理,使得开发人员可以通过对象的方式来操作数据库,方便数据的处理和操作。
- 提高性能:ORM框架通过对SQL语句的预编译和缓存机制,提高数据库访问的性能,支持批量操作和延迟加载等特性,进一步优化了数据库访问的效率。
常见的ORM框架包括Hibernate、Mybatis、Spring Data JPA等。开发人员可以根据项目需求和团队的实际情况选择合适的ORM框架来进行数据库访问和操作
当比较MyBatis与其他ORM(对象关系映射)框架时,以下是一些主要区别:
SQL 控制程度:
灵活性:
对象关系映射:
性能优化:
学习曲线:
综上所述,选择MyBatis还是其他ORM框架取决于项目的需求、团队的技能和对数据库操作的控制程度。
当比较 MyBatis 和其他 ORM 框架时,就像在比较两种不同的方式来处理图书馆中的书籍。这两种方式分别是“智能图书管理员”(ORM 框架)和“书架指南”(MyBatis)。
MyBatis(书架指南):
在图书馆中,你有一个书架指南,上面标明了每本书在哪个位置。这本质上就是你在 MyBatis 中定义的 SQL 映射。
当你想要一本特定的书时,你会查阅书架指南,找到书籍的位置,然后自己去取。
MyBatis 让你在 XML 文件中定义 SQL 查询或在代码中使用注解,然后根据这些定义的内容,它会帮助你执行数据库操作。
你有更多的控制权,可以更准确地定义查询,管理数据库操作的细节。
其他 ORM 框架(智能图书管理员):
在图书馆中,你有一位智能图书管理员,你只需告诉他你需要哪本书,他会帮你找到并递给你。
这个图书管理员代表了 ORM 框架,它会在后台自动构建和执行 SQL 查询,然后把结果封装成对象返回给你。
ORM 框架通过对象和数据库表的映射,自动处理数据库操作,不需要你手动编写 SQL 查询。
这使得操作更加方便,你只需要关心对象和业务逻辑,而不必过多关注底层的数据库细节。
总的来说,MyBatis 和其他 ORM 框架的区别在于控制程度。MyBatis 像是一个让你手动操作图书馆的书架指南,让你有更多的控制权和灵活性,但需要一些额外的配置和代码编写。另一方面,其他 ORM 框架就像是一个智能的图书管理员,自动帮你处理数据库操作,省去了很多繁琐的工作,但可能会限制一些复杂查询和优化操作的自定义。选择哪种方式取决于你对控制和自动化的需求。
MyBatis优点:
灵活性高:MyBatis允许你编写原生的SQL查询,这意味着你可以完全控制查询的细节,可以根据需求编写复杂的查询语句。
适应性强:MyBatis适用于各种数据库系统,因为它的底层并不限制于特定的数据库。这使得你可以轻松地切换数据库系统而不必更改太多代码。
轻量级:相比于其他ORM框架,MyBatis的运行时开销相对较小。它不会在运行时引入过多的性能开销,适合对性能要求较高的场景。
映射灵活:MyBatis提供了多种映射方式,包括基于XML和基于注解的方式,你可以根据项目的需求选择最合适的方式。
易于调优:由于你可以编写原生SQL查询,因此可以更容易地进行数据库查询性能的调优,针对特定的数据库操作优化。
支持定制:MyBatis提供了插件机制,允许你在不修改核心代码的情况下扩展其功能,比如添加自定义的日志记录、缓存等功能。
MyBatis缺点:
SQL维护复杂:虽然原生SQL查询提供了灵活性,但也意味着你需要自己负责维护SQL语句,包括SQL的编写、优化和调试,这可能会增加一些开发工作量。
数据库依赖性:虽然MyBatis可以适应多种数据库,但在切换数据库时,仍然需要注意一些数据库特定的差异和语法问题。
学习曲线:相对于一些自动化的ORM框架,MyBatis可能有一定的学习曲线,特别是对于初次接触原生SQL的开发者。
XML配置复杂:尽管XML配置提供了很大的灵活性,但有时候需要编写大量的XML配置文件,可能会让配置变得复杂。
代码冗余:使用MyBatis时,你可能需要在Mapper接口和映射文件中定义相同的SQL语句,这可能会导致代码的冗余。
总的来说,MyBatis是一个灵活、轻量级的ORM框架,适用于那些需要更多控制和定制性的项目。它允许你编写原生的SQL查询,但也需要你自己负责SQL的维护和优化。如果你更关注自动化和减少重复性代码,其他ORM框架可能更适合你。选择使用MyBatis还是其他ORM框架,取决于项目需求和团队的技术偏好。
SqlSessionFactory(会话工厂):SqlSessionFactory 是 MyBatis 的核心接口之一。它的作用是创建 SqlSession 实例,SqlSession 实际上是与数据库交互的主要入口。SqlSessionFactory 负责读取 MyBatis 配置文件并构建配置信息,然后根据配置信息创建 SqlSession。
SqlSession(会话):SqlSession 代表了一次与数据库的会话,它是 MyBatis 的核心组件之一。SqlSession 提供了对数据库的操作方法,包括查询、插入、更新和删除等。每个会话通常对应一个数据库连接,它负责管理事务的开始和结束。
Mapper接口(数据映射器接口):Mapper 接口是定义数据访问操作的接口。它通常包含了与数据库相关的SQL查询语句的声明,以及这些操作的参数和返回值类型。Mapper 接口与XML文件(MyBatis的映射文件)一起使用,将方法与SQL语句进行映射。
SqlSessionFactory的作用和配置方式
SqlSessionFactory 的作用是创建 SqlSession 对象,它需要配置文件来初始化。配置文件通常包括以下几个关键部分:
数据源配置:指定数据库连接的信息,包括数据库类型、地址、用户名、密码等。
映射文件配置:定义了 Mapper 接口与 SQL 查询语句之间的映射关系。这些映射通常包括 SQL 查询语句的位置、输入参数和输出结果的映射。
全局配置:包括事务管理器的配置、缓存配置、插件配置等。
以下是一个简单的 MyBatis 配置文件的示例:
xml
SqlSession的生命周期和常用方法
SqlSession 的生命周期通常是短暂的,它的创建和销毁应该在一个方法内完成,以确保及时释放数据库资源。SqlSession 的常用方法包括:
selectOne(String statement, Object parameter)
:执行查询并返回单个结果。
selectList(String statement, Object parameter)
:执行查询并返回结果列表。
insert(String statement, Object parameter)
:执行插入操作。
update(String statement, Object parameter)
:执行更新操作。
delete(String statement, Object parameter)
:执行删除操作。
commit()
:提交事务。
rollback()
:回滚事务。
close()
:关闭 SqlSession。
Mapper接口的作用和编写方式
Mapper 接口的作用是定义数据访问操作的接口,以及这些操作与 SQL 查询语句的映射关系。Mapper 接口通常不需要手动实现,MyBatis 会在运行时动态生成实现类。
编写 Mapper 接口的方式是创建一个 Java 接口,方法名与映射文件中定义的 SQL 查询语句的 ID 相对应,方法的参数和返回值类型与查询的输入参数和输出结果类型相匹配。例如:
java
public interface UserMapper {
User selectUserById(int id);
List selectAllUsers();
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
在映射文件中,可以使用
元素来与 Mapper 接口关联,并定义查询语句的映射关系:
xml
通过这种方式,Mapper 接口的方法与 SQL 查询语句建立了映射关系,可以方便地进行数据库操作。 MyBatis 会在运行时生成 Mapper 接口的实现类,具体的数据库操作会在这个实现类中被执行。
打开IDEA创建一个Maven项目命名为mybatis,之后的操作会在Maven项目在演示
之后修改pom.xml文件
4.0.0
org.example
mybatis
1.0-SNAPSHOT
war
mybatis 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
mybatis
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
jdbc.properties配置文件:用于输入数据库的用户密码(注意:该配置文件的首字母不能大写)
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
找到maven项目中webapp下WEB-INF的web.xml配置JSP文件修改为:3.1
Archetype Created Web Application
接口类
package com.liao.biz;
import com.liao.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);
}
实现接口
package com.liao.biz.impl;
import com.liao.biz.BookBiz;
import com.liao.mapper.BookMapper;
import com.liao.model.Book;
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.liao.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.liao.demo;
import com.liao.biz.BookBiz;
import com.liao.biz.impl.BookBizImpl;
import com.liao.mapper.BookMapper;
import com.liao.model.Book;
import com.liao.utils.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
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("删除失败");
}
}
}
简单测试查询和删除,其他的就不测试了