mybatis总结(一)(mybatis的基本定义介绍)

jdbc方式连接数据库的缺点

 

首先看下面传统jdbc方式连接数据库的方式,可以看出这种方式有如下缺点:

1. 每次都需要重新连接,执行sql之后,还要及时的关闭连接,频繁的连接,对数据库会造成很大的负担。

2. 代码里写sql,属于硬编码,不利于代码的维护和更新。

解决上面两个问题的思路如下:

1. 使用数据库连接池管理数据库连接。

2. 将sql语句配置在xml文件中,即使sql变化,也不需要对java代码重新编译。

所以由此我们开始学习mybatis。

 1         String Url="jdbc:mysql://127.0.0.1:3306/xdclass?useUnicode=true&characterEncoding=utf-8"; //定义连接mysql的url
 2         String User="root";//定义连接mysql的用户名
 3         String Password="123456";//定义连接mysql的密码
 4         Class.forName("com.mysql.jdbc.Driver");//加载mysql驱动程序
 5         Connection con=DriverManager.getConnection(Url,User,Password); //获取数据库链接
 6         Statement st=con.createStatement();//创建执行对象
 7         ResultSet rs=st.executeQuery("select name from tablename");//执行sql返回结果
 8         while (rs.next()){//遍历返回结果(使用ResultSet类)
 9             System.out.println(rs.getString("name"));
10         }
11         //关闭资源 真实业务中,需要写try catch 这里暂时省略
12         rs.close();
13         st.close();
14         con.close();            

 

mybatis的定义

百度百科中对其的定义为:

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

简单理解:

mybatis本质就是一个半自动的ORM框架,用于和数据库交互。在编码的过程中,只需要一个接口和xml就可以创建映射器,让程序员们可以专注于业务逻辑。

持久层的含义:

1. 持久层可以将业务数据存储到磁盘,具备长期存储能力(只要磁盘不损坏)。

2. 持久层可以使用巨大的磁盘控件,并且也较为廉价,就是比较慢(相对于内存)。

 

mybatis和jdbc的区别

 

mybatis和hibernate的区别

 

1. hibernate是自动的(它有良好的映射机制,针对高级查询,不用手动写sql)。mybatis是半自动的(针对高级查询,必须手动写sql和resultMap)。所以开发量:mybatis>hibernate。

2. hibernate默认查表中所有列,而mybatis是指定查哪列。所以优化性上:mybatis>hibernate。

3. hibernate自带日志统计。mybatis要依赖于log4j实现。

mybatis的工作原理

1. 读取mybatis的全局配置文件(mybatis-config.xml 名称不固定)从中获取参数信息后(数据源、事务、映射文件mapper等)加载到内存中。

2. 由会话工厂sqlSessionFactory根据获取到的数据库信息创建出访问数据库所需要的sqlSession会话对象。

3. sqlSession对象调用executor接口进行对数据库的操作(sqlSession对象不能够直接操作数据库)。

4. 执行器会根据配置和sqlSession对象中的信息查找到对应的mapper.xml执行相应的语句。

5. mapped statement(底层封装对象)会查找对应mapper.xml中对应的id的sql执行语句,根据 输入参数+sql语句 执行数据库操作后,返回对应的输出结果。

mybatis的核心组件

 

1. SqlSessionFactoryBuilder:(构造器),它会根据配置或者代码来生成SqlSessionFactory,采用的是分步构建的Builder模式。

2. SqlSessionFactory:(工厂接口)生成SqlSession,使用的是工厂模式。

3. SqlSession:(会话)既可以发送sql给数据库执行并返回结果,也可以获取Mapper的接口。(现在基本不用,而改成使用下面的SQL Mapper来实现功能)

4. SQL Mapper:(映射器)由一个java接口和xml文件(或注解)构成,需要给出对应的sql和映射规则。它负责发送sql去执行并返回结果。

如图:

SqlSessionFactory

在mybatis中,生成SqlSessionFactory的方式有两种:

1. 通过读取配置xml文件的形式。(建议)

2. 通过java代码的形式。

SqlSessionFactory是一个接口,它有两个实现类:SqlSessionManager和DefaultSqlSessionFactory,一般而言,具体是由DefaultSqlSessionFactory去实现的,而SqlSessionManager使用在多线程的环境中,它的具体实现依靠DefaultSqlSessionFactory。

每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的,而SqlSessionFactory唯一的作用就是生产MyBatis的核心接口对象SqlSession,所以它的责任是唯一的。我们往往会采用单例模式去处理它。

SqlSession

在MyBatis中,SqlSession是其核心接口。它有两个实现类:DefaultSqlSession和SqlSessionManager。DefaultSqlSession是单线程使用的,SqlSessionManager是多线程下使用的。

SqlSession的作用类似于一个JDBC中的Connection对象,代表着一个连接资源的启用。

不过要注意:SqlSession只是一个门面接口,拿公司来说,类似于产品经理得角色,而实际干活的是Executor。

具体作用:

1. 获取Mapper接口。2. 发送SQL给数据库。3. 控制数据库事务。

它的创建方法为:

1 SqlSession sqlSession = SqlSessionFactory.openSession();

映射器

映射器是MyBatis中最重要、最复杂的组件,它由一个接口和对应的xml文件(或注解)组成,它可以配置以下内容:

1. 描述映射规则。

2. 提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息。

3. 配置缓存。

4. 提供动态SQL。

映射器的主要作用就是将SQL查询到的结果映射为一个pojo,或者将pojo的数据插入到数据库中,并定义一些缓存等的重要内容。

实现映射器的两种方式:用XML实现,用注解实现。如果这两种同时定义,以XML为主,我们在开发的时候,也推荐使用XML的方式。

发送SQL

mybatis发送sql一共分为两种形式:

1. SqlSession发送SQL。2. Mapper接口发送SQL。(建议)

各个组件的生命周期

1. SqlSessionFactoryBuilder:创建完SqlSessionFactory就失去了作用,所以它只能存在于创建SqlSessionFactory的方法中。

2. SqlSessionFactory:它可以被认为是一个数据库连接池,所以一旦创建了它,就要长期保存,可以认为它的生命周期=mybatis的应用周期。但是如果创建了多个,那么就相当于存在多个连接池,容易耗光数据库资源,所以我们希望它是单例的,在应用中被共享。

3. SqlSession:相当于一个数据库连接,所以它存在于一个业务请求中,业务处理完毕之后,关闭这条连接。一般我们需要使用try catch finally来保证其关闭。

4. Mapper:它是一个接口,由SqlSession创建,所以它的生命周期应该小于等于SqlSession,可以理解成,它存在于一个请求中,一旦处理完业务了,就废弃它。

参考:

1. https://blog.csdn.net/Logicr/article/details/81462821

2. javaEE互联网轻量级框架整合开发SSM框架和Redis实现(书) 

本文章仅用于个人学习总结,如果有侵权行为,联系必删!

持续更新!!!

原文地址:https://www.cnblogs.com/flyinghome/p/12335736.html