zoukankan      html  css  js  c++  java
  • Mybatis 笔记

    -支持普通SQL查询,存储过程和高级映射的优秀持久层框架。

    -消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。

    -使用简单的XML或注解用于配置和原始映射,将接口和JAVA的POJOS(Plan Old Java Objects)即普通的Java对象映射成数据库中的记录。

    总体来说,Mybatis主要完成两件事:

    --根据JDBC规范建立与数据库的连接

    --通过Annotation/XML+JAVA反射技术,实现JAVA对象与关系数据库之间相互转化。

    Mybatis是一种典型的交互式框架:

    准备交互的必要条件 构建会话环境
    构建一个交互的环境 交换数据

    类层次结构:

    SqlSessionFactory->DefaultSqlSessionFactory->SqlSessionFactoryBuilder->Configuration

                                                                      |

                                                       SqlSession->DefaultSqlSession->Executor->CachingExecutor

                                                                                                                    |->BaseExecutor->(BatchExecutor, SimpleExecutor, ReaseExecutor)

    文件组成:Configuration.xml由<configuration>和<mappers>组成:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <configuration>
     3     <environments default="development">
     4         <environment id="development">
     5             <transactionManager type="JDBC" />
     6             <dataSource type="POLLED">
     7                 <property name="driver" value="${driver}" />
     8                 <property name="url" value="${url}" />
     9                 <property name="user" value="${username}" />
    10                 <property name="password" value="${password}" />
    11             </dataSource>
    12         </environment>
    13     </environments>
    14 </configuration>
    15 <mappers>
    16     <mapper resource="org.mybatis.builder.AuthorMapper.xml" />
    17     <!-- <mapper url="file://var/samples/AuthorMapper.xml" /> -->
    18 </mappers>

    Mapper.xml: 定义具体SQL映射语句的文件,文件结构:

    -cache:配置给定命名空间的缓存

    -cache-ref:从其他命名空间引用缓存配置

    -resultMap:最复杂,也是最具力量的元素,用来描述如何从数据库结果集中来加载对象

    -resultType:从语句中返回的期望类型的类的完全限定名或别名

    -sql:可以重用的SQL块,也可以被其他语句引用

    -insert:映射插入语句

    -update:映射更新语句

    -delete:映射删除语句

    -select:映射查询语句

    输出属性参数:resultType,resultMap,二者不能同时使用

    resultType-返回的期望类型的类的完全限定名或别名,注意集合情况,应该是集合可以包含的类型,而不是集合本身

    resultMap-命名引用外部的resultMap,返回map是mybatis最具力量的特性,对其有一个很好的理解的话,许多复杂的映射的情况就能被解决了

    二者的区别:

    <resultMap id="BaseResultMap" type="com.garinzhang.vo.Area">
        <id column="area_id" jdbcType="INTEGER" property="areaId" />
        <id column="code" jdbcType="VARCHAR" property="code" />
        <id column="parent" jdbcType="INTEGER" property="parent" />
    </resultMap>
    <select id="selectUsers" paramenterType="int" resultType="com.garinzhang.model.User">
        SELECT ID, USERNAME, PASSWORD FROM USER WHERE ID=#{id}
    </select>
    <mapper namespace="org.mybatis.example.BlogMapper">
        <select id="selectBlog" parameterType="int" resultType="Blog" >
            SELECT * FROM Blog WHERE ID="#{id}"
        </select>
    </mapper>

    调用方式:

    // 1. 使用完全限定名词调用映射语句
    Bolg b = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 1);
    
    // 2. 采用映射接口调用映射语句
    BlogMapper m = session.getMapper(BlogMapper.class);
    Blog blog = m.selectBlog(1);

    Insert: 如果User表已经对id使用了自动生成的列类型

    <insert id="insertUser" parameterType="com.garinzhang.model.User" userGeneratedKeys="true" keyProperty="id">
        INSERT INTO USER(USERNAME, PASSWORD, EMAIL, PHONE)
            VALUES(#{username}, #{password}, #{email}, #{phone})
    </insert>

    Insert: 如果User表主键生成策略采用OID, Sequence

    <insert id="insertUser" parameterType="com.garinzhang.model.User">
        <selectKey resultType="long" keyProperty="id" order="BEFORE">
            SELECT nextval FOR SEQ_USER FROM DUAL
        </selectKey>
        INSERT INTO USER(ID, USERNAME, PASSWORD, EMAIL, PHONE)
            VALUES(#{id}, #{username}, #{password}, #{email}, #{phone})
    </insert>

    Update: 

    <udpate id="updateUser" parameterType="com.garinzhang.model.User">
        UPDATE USER SET USERNAME=#{username}, PASSWORD=#{password}, EMAIL=#{email}, PHONE=#{phone}
            WHERE ID=#{id}
    </udpate>

    Delete:

    <delete id="deleteUser" parameterType="int">
        DELETE FROM USER WHERE ID=#{id}
    </delete>

    动态SQL: Mybatis的一个强大的特性之一,通常是它的动态SQL能力

    SQLSessionFactory:

    SqlSessionFactory有三个方法可以用来创建SqlSession实例

           SqlSession openSession(ExecuterType execType)

           SqlSession openSession(ExecutorType execType, boolean autoCommit)

           SqlSession openSession(ExecutorType execType, Connection conn)

    Configuration getConfiguration();

    默认的openSession方法没有参数:它会创建有如下特性的sqlSession:

    1. 会开启一个事务,也就是不会自动提交

    2. 连接对象会从由活动环境配置的数据源实例中得到

    3. 事务隔离级别将会使用驱动或数据源的默认设置

    4. 预处理语句不会被复用,也不会批量处理

    路慢慢其休远羲,吾将上下而求所
  • 相关阅读:
    一个程序员的职业规划
    基于Andoird 4.2.2的Account Manager源代码分析学习:创建选定类型的系统帐号
    [置顶] C++学习书单
    js快速分享代码
    The declared package does not match the expected package
    IBM Rational Appscan Part 1
    IBM Rational Appscan: Part 2 ---reference
    阅读redis源代码的一些体会
    18 Command Line Tools to Monitor Linux Performance
    代码规范
  • 原文地址:https://www.cnblogs.com/garinzhang/p/2944149.html
Copyright © 2011-2022 走看看