引言
使用JDBC开发过程存在的一系列问题:
数据库连接频繁的开启和关闭本身就造成了资源的浪费,影响系统的性能。
我们使用JDBC进行操作数据库时,SQL语句基本都散落在各个JAVA类中,这样有三个不足之处:
第一,可读性很差,不利于维护以及做性能调优。
第二,改动Java代码需要重新编译、打包部署。
第三,不利于取出SQL在数据库客户端执行(取出后还得删掉中间的Java代码,编写好的SQL语句写好后还得通过+号在Java进行拼凑)。
不能根据传入的参数不同动态地生成sql语句
执行sql查询语句未获取到结果信息前不能释放资源
存放sql语句的配置文件中存在sql语句重复的问题
那么如何解决这个问题?-----Java的封装思想进行优化
从JDBC到Mybatis的优化思维
Mybatis基础知识
简介:
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
解析:
MyBatis应用程序主要都是使用SqlSessionFactory实例的
SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得
SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得
MyBatis 最强大的特性之一就是它的动态语句功能。
Mybatis安装与环境配置
开发环境配置:
Eclipse+java+mysql(其他数据库也可以)+mybatisX.X.X.jar
Mybatis安装事项:
需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
如果使用maven构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
Mybatis基础知识---功能框架
- API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
- 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
- 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
Mybatis基础知识---执行流程
1. 加载配置文件并初始化(SqlSession)
配置文件来源于两个地方,一个是配置文件(主配置文件conf.xml,mapper文件*.xml),一个是java代码中的注释,将sql的配置信息加载成为一个mappedstatement对象,存储在内存之中(包括传入参数的映射配置,结果映射配置,执行的sql语句)。
2. 接收调用请求
调用mybatis提供的api,传入的参数为sql的id(由namespase和具体sql的id组成)和sql语句的参数对象,mybatis将调用请求交给请求处理层。
3. 处理请求
根据sql的id找到对应的mappedstatament对象。
根据传入参数解析mappedstatement对象,得到最终要执行的sql。
获取数据库连接,执行sql,得到执行结果
Mappedstatement对象中的结果映射对执行结果进行转换处理,并得到最终的处理结果。释放连接资源
4. 返回处理结果
Mybatis架构图
Mybatis架构图详解:
1、mybatis配置:SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、 SqlSessionFactory:通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 sqlSession:由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 Executor :mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、Mapped Statement:是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
Mybatis ----SqlMapConfig.xml
SqlMapConfig.xml配置内容和顺序概览:
- Properties(属性)
- Settings(全局参数设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境信息集合)-------数据库连接池
- environment(单个环境信息)
- transactionManager(事物)
- dataSource(数据源)
- mappers(映射器)------用于映射文
例如:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
加载顺序:
MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。
SqlMapConfig.xml样例:
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd" >
< sqlMapConfig >
< settings
cacheModelsEnabled ="true" --------------------<!--是否启用缓存机制-- >
lazyLoadingEnabled="true" ------------------------ <!-- 是否启用延迟加载机制 -->
enhancementEnabled="true" ----------------------<!-- 是否启用字节码增强机制 -->
errorTracingEnabled="true" ------------------------<!-- 是否启用错误处理机制 -->
maxRequests="32" -----------------------------------<!-- 最大并发请求数 -->
maxSessions="10" ----------------------------------<!-- 最大Session数 -->
maxTransactions="5" ---------------------------------<!-- 最大并发事务数 -->
useStatementNamespaces="true"/> ----------<!-- 是否启用名称空间 -->
< transactionManager type ="JDBC" > -------<!-- 定义了ibatis的事务管理器有3中(JDBC,JTA,EXTERNAL) -->
< dataSource type ="SIMPLE" > ---------------<!-- type属性指定了数据源的链接类型,也有3种类型(SIMPLE,DBCP,JNDI) -->
< property name ="JDBC.Driver" value ="com.mysql.jdbc.Driver" />
< property name ="JDBC.ConnectionURL" value ="jdbc:mysql://localhost/test" />
< property name ="JDBC.Username" value ="root" />
< property name ="JDBC.Password" value ="wyq" />
< property name ="Pool.MaximumActiveConnections" value ="10" /> --------------<!-- 连接池维持的最大容量 -->
< property name ="Pool.MaximumIdleConnections" value ="5" /> ---------------------<!-- 连接池允许挂起的最大连接 -->
< property name ="Pool.MaximumCheckoutTime" value ="120000" /> ---------------<!-- 连接被某个任务所允许占用的最大时间 -->
< property name ="TimeToWait" value ="500" /> ---------------------------------------------<!-- 线程允许等待的最大时间 -->
</ dataSource >
</ transactionManager >
< sqlMap resource ="com/wyq/map/userMap.xml" />
</ sqlMapConfig >
Mybatis--- SqlSessionFactory
SqlSessionFactory是MyBatis的关键对象,它是单个数据库映射关系经过编译后的内存镜像。
SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得,而SqlSessionFactoryBuildr则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。
每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory是线程安全的,它一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式
SqlSessionFactory 是创建SqlSession的工厂。
SqlSessionFactory的常用方法如下:
SqlSession openSession():创建SqlSession 对象。
初始化步骤:
SqlSessionFactoryBuilder根据传入的数据流生成Configuration对象,然后根据Configuration对象创建默认的SqlSessionFactory实例。
1. 调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法;
2. SqlSessionFactoryBuilder 会根据输入流 inputStream 等信息创建XMLConfigBuilder 对象 ;
3. SqlSessionFactoryBuilder 调用 XMLConfigBuilder 对象的 parse() 方法;
4. XMLConfigBuilder 对象返回 Configuration 对象;
5. SqlSessionFactoryBuilder 根据 Configuration 对象创建一个DefaultSessionFactory 对象;
6. SqlSessionFactoryBuilder 返回 DefaultSessionFactory 对象给 Client ,供 Client使用。
初始化过程涉及的对象解读:
SqlSessionFactoryBuilder : SqlSessionFactory的构造器,用于创建SqlSessionFactory,采用了Builder设计模式
Configuration :该对象是mybatis-config.xml文件中所有mybatis配置信息
SqlSessionFactory:SqlSession工厂类,以工厂形式创建SqlSession对象,采用了Factory工厂设计模式
XmlConfigParser :负责将mybatis-config.xml配置文件解析成Configuration对象,共SqlSessonFactoryBuilder使用,创建SqlSessionFactory
工程结构截图
Mybatis--- 总结
Mybatis工程搭建步骤
1.编写全局配置文件SqlMapConfig.xml文件
2.编写映射xml文件
3.编写实体类文件
4.编写dao接口
5.编写实现类
6.编写测试类
核心重点步骤
1.全局配置文件SqlMapConfig.xml加载
2.获取工厂模式实例
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
3.通过factory.openSession()获取SqlSession实例
4.通过调用dao接口中对应的sql方法执行sql语句