mybatis的随笔记录

ORM(Object Relationship Mapping)

对象关系映射,简称ORM,或O/RM,或O/R Mapping。用于实现面向对象编程语言里不同对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实创建了一种可在编程语言里使用“虚拟对象数据库”。功能类似于SSH中的Hibernate。

优点:

隐藏了数据库访问细节

“封闭”的通用数据库交互。它使得我们通过数据库交互变的简单,并且完全不用考虑SQL语句。

使构造固化数据结构变的简单

在ORM年表的史前时代,我们需要将我们的对象模型转化为一条一条的SQL语句,通过直连或是DB helper在关系数据库构造我们的数据库体系(对象-->数据库)。而现在,基本上所有的ORM框架都提供了通过对象模型构造关系数据库结构的功能。这,相当不错。

缺点:

  1. 自动化意味着映射和关联管理,代价是牺牲性能,现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
  2. 面向对象的查询语言(X-QL)作为一种数据库与对象之间的过渡,虽然隐藏了数据层面的业务抽象,但并不能完全的屏蔽掉数据库层的设计,并且无疑将增加学习成本。
  3. 对于复杂查询,ORM仍然力不从心。虽然可以实现,但是不值的。视图可以解决大部分calculated column,case ,group,having,order by, exists,但是查询条件(a and b and not c and (d or d))……

Mybatis

是一个java持久成框架。提供的持久层框架包括SQL Maps和Data Access Object(DAO)。原来属于Apache的一个开源项目iBatis,2010年,这个项目有apache Software Foundation迁移到google code,并且改名为MyBatis。2013年11月迁移到Github。iBatis来源于“internet”和“abatis(有刺铁丝网)”。

功能说明:

MyBatis是一个支持普通sql查询,存储过程和高级映射的优秀持久层框架。消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或者朱姐用于配置和原始映射,将接口和Java的POJO(Plain Old Java Object,普通的Java对象)映射成数据库中的记录。

用到的设计模式 

  1. 工厂模式:DefaultSqlSessionFactory,MapperProxyFactory...
  2. 构建者模式:SqlSessionFactoryBuilder,XMLConfigBuilder,XMLMapperBuilder,CacheBuilder...
  3. 单例模式:ErrorContext,LogFactory...
  4. 代理模式:MapperProxy,JDK的proxy

MyBatis功能架构

我们把Mybatis的功能架构分为三层:

  1. API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  2. 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  3. 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

mybatis的随笔记录_第1张图片   

Mybatis执行过程

mybatis的随笔记录_第2张图片

  1. 加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
  2. SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
  3. SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
  4. 结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
  5. sqlMapConfig.xml(是MyBatis的全局配置文件),配置了数据源(第三方数据驱动,例如:dbcp),事务(一般是spring)等运行环境。
  6. sqlSessionFactory(会话工厂),作用是:创建SqlSession(sql会话)

sqlSessionFactory创建sqlSession的过程

  1. sqlSession是一个接口,它的实现类是DefaultSqlSession,sqlSession由sqlSessionFactory工厂创建。
  2. sqlSessionFactory也是一个接口,它的实现类是DefaultSqlSessionFactory
  3. DefaultSqlSessionDefaultSqlSessionFactory由Mybatis中的核心类SqlSessionManager来管理。
  4. DefaultSqlSessionFactory实现类中通过方法openSession()来调用openSessionFromDataSource(ExcutorType,TransactionIsolationLevel,isAutoCommit)方法,该方法在处理完Configuration、Environment、Transaction、Executor后(其实就是加载mybatis-configuration.xml),返回一个DefaultSqlSessionFactory().
  5. 在SqlSession中加载执行器,主要由三种类型的执行器:SimpleExecutor,BatchExecutor,ReuseExecutor。
  6. 执行完成后返回一个ResultSet进行结果映射。

mybatis的随笔记录_第3张图片

(图片来自网易云课堂allen老师)

Executor执行器类型

SimpleExecutor

每次执行一个update或者query(Mybatis中只有这两种:读和写),就开启一个Statement对象,用完就关闭。

BatchExecutor

对Statement对象的重用。Statement保存在一个Map中。

ReuseExecutor

只执行update(),它缓存了多个statement对象。因为JDBC中不支持批量查询。每个Statement都是addBatch()之后,等待executorBatch()批处理。

使用Generator自动创建代码

该方式类似于Hibernate中的表--->实体对象模型

进入到cmd命令提示符窗口中,cd命令进入到工具根目录后输入命令:java –jar mybatis-generator-core-1.3.2.jar –configfile generatorConfig.xml –overwrite回车,然后jar包会自动按照generatorConfiguration.xml配置中生成代码

Mapper.xml属性说明


	
		
		
			
		
			
		
		
		
		
			
			
			
			
			
			
			
		
		
		 
			
			
			
			
				
			
			
				
			

			
			
				
			
		
	

mapper.xml传入复杂对象

在xml对应的sq传入的参数类型是java.util.Map

在代码中定义一个Map,要注意的是Map的key是与xml中的sql使用的参数名称要一一对应

比如:  Map arguMap = new HashMap()

arguMap.put("name","sfsdfsd")

arguMap.put("age",12)

select * from people wherer user_name = #{name} and age >#{age}

模糊查询:

SELECT * FROM user WHERE name like CONCAT('%',#{name},'%')

$与#的区别

select * from T_PRINT_LAYOUT where  D_RECID = ${recId}

最后生成的SQL为:

select * from T_PRINT_LAYOUT where  D_RECID = 1

即:直接将参数值替换到了原来${recId}的位置,相当于硬拼SQL

select * from T_PRINT_LAYOUT where  D_RECID = #{recid,jdbcType=DECIMAL}

最后生成的SQL为:

select * from T_PRINT_LAYOUT where  D_RECID = ?

即:#{…}被识别为一个SQL参数(推荐

mybatis_config.xml

xml version="1.0" encoding="UTF-8" ?>

DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

   

    <settings>

      

       <setting name="cacheEnabled" value="true" />

      

       <setting name="lazyLoadingEnabled" value="true" />

      

       <setting name="aggressiveLazyLoading" value="true" />

      

       <setting name="multipleResultSetsEnabled" value="true" />

      

       <setting name="useColumnLabel" value="true" />

      

       <setting name="useGeneratedKeys" value="true" />

      

       <setting name="autoMappingBehavior" value="PARTIAL" />

      

       <setting name="autoMappingUnknownColumnBehavior" value="WARNING" />

      

       <setting name="defaultExecutorType" value="SIMPLE" />

      

       <setting name="defaultStatementTimeout" value="25000" />

      

       <setting name="defaultFetchSize" value="100" />

      

       <setting name="safeRowBoundsEnabled" value="false" />

      

       <setting name="mapUnderscoreToCamelCase" value="false" />

      

       <setting name="localCacheScope" value="SESSION" />

      

       <setting name="jdbcTypeForNull" value="OTHER" />

      

       <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />

    settings>

   

    <typeAliases>

       <typeAlias alias="pageAccessURL" type="com.lgm.mybatis.model.PageAccessURL" />

    typeAliases>

   

    <typeHandlers>

      

      

       <package name="com.xhm.util" />

    typeHandlers>

   

    <plugins>

       <plugin interceptor="com.xhm.util.PageInterceptor">plugin>

    plugins>

   

    <environments default="development">

      

       <environment id="development1">

          

           <transactionManager type="JDBC" />

          

          

           <dataSource type="UNPOOLED">

               <property name="driver" value="com.mysql.jdbc.Driver" />

               <property name="url" value="jdbc:mysql://localhost:3306/xhm" />

               <property name="username" value="root" />

               <property name="password" value="root" />

              

           dataSource>

       environment>

      

       <environment id="development2">

           <transactionManager type="JDBC" />

           <dataSource type="POOLED">

               <property name="driver" value="com.mysql.jdbc.Driver" />

               <property name="url" value="jdbc:mysql://localhost:3306/xhm" />

               <property name="username" value="root" />

               <property name="password" value="root" />

              

               <property name="poolMaximumActiveConnections" value="10" />

              

               <property name="poolMaximumIdleConnections" value="5" />

              

               <property name="poolMaximumCheckoutTime" value="20000" />

              

               <property name="poolTimeToWait" value="20000" />

             

               <property name="poolPingQuery" value="NO PING QUERY SET" />

              

               <property name="poolPingEnabled" value="false" />

              

               <property name="poolPingConnectionsNotUsedFor" value="0" />

           dataSource>

       environment>

      

       <environment id="development3">

           <transactionManager type="JDBC" />

           <dataSource type="JNDI">

               <property name="data_source" value="java:comp/env/jndi/mybatis" />

               <property name="env.encoding" value="UTF8" />

              

           dataSource>

        environment>

    environments>

   

    <mappers>

      

       <mapper resource="com/xhm/mapper/UserMapper.xml" />

      

       <package name="com.xhm.mapper" />

    mappers>

configuration>

你可能感兴趣的:(工作随笔)