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实现(书)
本文章仅用于个人学习总结,如果有侵权行为,联系必删!
持续更新!!!