zoukankan      html  css  js  c++  java
  • mybatis学习知识

    目录
    1,目录
    2,介绍
    3,快速入门
    4,配置XML
    5,xml文件映射
    6,动态sql
    7,java api
    8,Statement Builders
    9,日志

    1,介绍
    1.1 介绍
    1.1.1 MyBatis是什么
    MyBatis 是第一类持久化框架,支持定制sql,存储过程和高等映射。MyBatis几乎淘汰了所有的JDBC编码和手工设置参数以及结果的检索。MyBatis能够使用简单的xml或者注解配置和原始的map,Map接口和java POJOs到数据库记录

    1.1.2 你的帮助能使文档变得更好
    如果你发现文档有任何的缺少或者有任何缺少,你可也可以自己写文档。

    Sources of this manual are available in xdoc format at project's Git . Check them out, update them
    and send your patch to the tracker .
    You’re the best author of this documentation, people like you have to read it!

    1.1.3 翻译
    你想阅读你们自己母语版的关于MyBatis的文档吗?可以发行你们母语版的文档。


    2,快速入门
    2.1 快速入门
    每一个MyBatis应用中心都会围绕一个SqlSessionFactory实例。一个SqlSessionFactory实例的获得可通过用SqlSessionFactoryBuilder.SqlSessionFactoryBuilder通过XMl配置文件和自定义编写的实例创建一个SqlSessionFactory。

    2.1.1 通过XML创建SqlSessionFactory
    通过一个xml文件的配置创建SqlSessionFactory是非常简单的。推荐你使用一个classpath resource去配置,另外你需要使用流,流中包含一个文件路径或者URL。MyBatis包含一个工具类,这个工具类中有一个方法可以含有类路径的资源:
    String resource = "org/mybatis/example/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    这个XML配置文件含有对MyBatis系统的核心设置,包含一个获得数据连接实例的数据源,同时也含有一个如何处理和控制的事物管理器。关于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>
    <environments default="development">
    <environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
    </dataSource>
    </environment>
    </environments>
    <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
    </configuration>
    同时有许多XML配置文件,在上述的例子中需要指出的是,注意XML配置文件的头部,必须要有XML文档的验证,environment体中包含对事物环境配置和连接池。mappers元素是一个映射列表包含sql和映射定义。

    2.1.2 不使用XMl构建SqlSessionFactory
    如果你喜欢直接用java来配置那是优于XML的,或者创建属于你自己的配置构造器。MyBatis提供了和XMl配置文件性质相同的配置类。
    DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
    TransactionFactory transactionFactory = new JdbcTransactionFactory();
    Environment environment = new Environment("development", transactionFactory, dataSource);
    Configuration configuration = new Configuration(environment);
    configuration.addMapper(BlogMapper.class);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
    在这个例子中需要注意的是要添加一个映射类,在映射类中可以使用注解来避免使用XMl。但是,由于Java注解的一些限制和一些MyBatis映射的复杂性,XMl映射还是比较高级的映射。由于这个原因,MyBatis将会自动的去查看存在的xml文件。稍后详述。

    2.1.3 从SqlSessionFactory中获取一个SqlSession
    现在你有了一个SqlSessionFactory,顾名思义,你需要获取一个SqlSession实例。SqlSession包含一些执行SQL命令操控数据库的方法。你可以执行SQL语句直接对sqlsession映射。例如:
    SqlSession session = sqlSessionFactory.openSession();
    try {
    Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
    } finally {
    session.close();
    }
    虽然这种做法,对于MyBatis以前的用户比较熟悉。现在有一个,使用一个有参数和返回值声明的接口,你可以执行更加清晰和安全的代码,同时没有错误字符串。
    例如:
    SqlSession session = sqlSessionFactory.openSession();
    try {
    BlogMapper mapper = session.getMapper(BlogMapper.class);
    Blog blog = mapper.selectBlog(101);
    } finally {
    session.close();
    }
    现在我们就探讨一下再这里到底执行了什么。

    2.1.4 探索映射的SQL语句
    在这一个上,你可以很想知道到底是什么被SqlSession或者映射执行了。映射SQL语句的主题比较广,文档中大部分地方也会涉及到这个主题,为了给你一个准确的描述,这里需要一个完整的例子。

    上诉的例子,声明可以通过XML或者注解来定义。首先让我们来看看XML,MyBatis通过提供高全方位的基于XML的映射,使得它流行了很多年。在你使用MyBatis之前,概念对你来说会很熟悉,但是有很多对XML映射文件将成为明显的后的改进。这里是一个例子基于XML的映射表,将满足上述sqlsession对话。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.mybatis.example.BlogMapper">
    <select id="selectBlog" parameterType="int" resultType="Blog">
    select * from Blog where id = #{id}
    </select>
    </mapper>
    虽然对于一个简单的例子,这个看上去有点重了。事件上它比较轻的,如你所愿你可以在这个简单的MXL映射中定义多个映射语句。所以你通过XML头部的提示中可以得到很多的提示,使用自动提示还是挺美妙的。给这个映射语句起名叫"selectBlog",namespace中写"org.mybatis.example.BlogMapper",这个映射全面可以叫:org.mybatis.example.BlogMapper.selectBlog,下面的例子也是这样用的:
    Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
    注意到,这个和在一个完全合格的java类中调用方法是多么的相似。还有一个原因就是它可以直接映射到命名空间,匹配方法,参数,返回值相同的映射类中,你很简单的调用映射接口的方法就可以看到这中效果,同时这里给出下面的例子:
    BlogMapper mapper = session.getMapper(BlogMapper.class);
    Blog blog = mapper.selectBlog(101);
    第二个方法有很多优点,首先,它不取决于我们的字符串文字,这是非常安全的。第二,如果你的IDE有补全代码的功能,你可以在提示中直接选择。

    ----------------------------------------------------
    关于命名空间声明
    命名空间在以前的版本是可选的,这让很多人困惑和无助。
    命名空间现在是需要的,它超越了以前用于隔离较长语句和全称等功能。
    命名空间可以用户绑定接口,即使你现在认为你现在可能不会使用它,如果你改变主意的话,你现在必须要遵循这个规范,一旦使用了命名空间,并且相对合理的话,可以提高MyBatis的复用性。
    名称分解:为了减少打字,MyBatis使用了下列的解析规则,所有指定的配置元素,包括报表,结果映射,缓存,比如:
    Fully qualified names (e.g. “com.mypackage.MyMapper.selectAllThings”) are looked up
    directly and used if found.
    ? Short names (e.g. “selectAllThings”) can be used to reference any unambiguous entry. However
    if there are two or more (e.g. “com.foo.selectAllThings and com.bar.selectAllThings”), then
    you will receive an error reporting that the short name is ambiguous and therefore must be fully
    qualified.
    ----------------------------------------------------
    还有一个技巧用来映射BlogMapper,这个映射不需要使用XML,他们使用java注解来代替。比如,上面的XML可以被下面的例子替换掉:
    package org.mybatis.example;
    public interface BlogMapper {
    @Select("SELECT * FROM blog WHERE id = #{id}")
    Blog selectBlog(int id);
    }
    注解使简单语句变得更加的整洁,但是,java注解对于复杂声明是有限和混乱的。因此,如果你是去做复杂结构,你最好还是用XML比较好些。
    这将是你和你的团队,决定使用哪种方式,重要的是你的映射要以一致的方式去定义。即使这样,你也不会被局限在一种方式上,你可以很容易的把XML映射迁移到基于注解上来,反之亦然。

    2.1.5 域和声明周期
    我们讨论到现在,要理解域和声明周期是非常重要的。使用不当,会导致严重的并发问题。

    2.1.5.1 SqlSessionFactoryBuilder
    这里类可以被实例化,使用和废弃。一旦你创建了SqlSessionFactory,没有必要保持它。因此方法是SqlSessionFactoryBuilder存在的最佳范围。你可以利用SqlSessionFactoryBuilder建立多个SqlSessionFactory,
    但是还是不要保持它,XML解析器是一个很重要的东东。

    2.1.5.2 SqlSessionFactory
    一旦创建,SqlSessionFactory应该在你的应用执行范围内存在。一般很少有理由需要处理它或者重新创建它。SqlSessionFactory不该在程序运行中重建是一种最佳实践。这样做应该被认为是一种”坏味道???"。因此,SqlSessionFactory的最佳范围应该是应用范围。实现这个的方式有很多中,对简单的方式就是单利模式或者静态模式。

    2.1.5.3 SqlSession
    每个线程都该有自己的SqlSession,每个SqlSession实例不该被共享。因此最好的范围是请求范围或者方法范围。不要把SqlSession定义在一个静态字段或者实例字段中。不要提升任何范围去管理SqlSession。比如Servlet框架中的HttpSession,如果你使用任何类型的web框架,一个HTTP请求应该遵循类似的规范。就是说,在接受一个HTTP请求,你可以打开一个SqlSession,然后在返回响应的时候,关闭它。关闭session是非常重要的。你必须要始终确保它在最后被关闭。下面这个是标准的关闭模式:
    SqlSession session = sqlSessionFactory.openSession();
    try {
    // do work
    } finally {
    session.close();
    }
    使用这个代码将确保所有的session在处理完之后都会被关闭。

    2.1.5.4 Mapper Instances
    Mappers是一个接口用户绑定你创建的映射语句。这个东东可以从SqlSession中获取。本身,技术上的任何映射实例的范围最广的是一样的sqlsession从他们的要求。但是,最佳的方位是这个方法中。换句话说,他们应该在方法中被使用,然后销毁。他们不要显示关闭。
    SqlSession session = sqlSessionFactory.openSession();
    try {
    BlogMapper mapper = session.getMapper(BlogMapper.class);
    // do work
    } finally {
    session.close();
    }
    ----------------------------------------------------
    注意:对象的声明周期和依赖注入框架。
    依赖注入框架是线程安全的,交易SqlSession和Mapper和注入到你的bean中你可以不用管理他们的声明周期。你可以研究一下这些框架。

    ----------------------------------------------------

    3,XML配置
    3.1 配置
    MyBatis的配置包含
    1,属性
    2,设置
    3,别名
    4,映射配置
    5,对象工厂
    6,插件
    7,环境集合
    环境
    事物管理
    数据源
    8,databaseIdProvider
    9,映射

    3.1.1 属性(properties)
    这些都是外部的,可替代的可配置的属性在一个典型的Java属性文件的实例,或者通过属性的元素的子元素。比如说呢
    <properties resource="org/mybatis/example/config.properties">
    <property name="username" value="dev_user"/>
    <property name="password" value="F2Fa3!33TYyg"/>
    </properties>
    属性可以使配置文件的替代品,可以动态的配置。比如:
    <dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
    </dataSource>
    在这个例子中的用户名和密码的值可以通过属性的设置来替换。驱动和url是来自于config.propertties文件来获取。这提供了大量的配置选项。

    属性也可以通过传递进SqlSessionBuilder.build() methods中,比如:
    SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props);
    // ... or ...
    SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props)

    如果一个属性存在多个地方,MyBatis会有加载的顺序:
    1,在属性元素指定的地方先读取内部有没有配置
    2,从类路径中读取其实就是.properties.并且会覆盖前者
    3,通过方法传递过来的参数,同时也会覆盖前者。
    因此,优先级最高的是通过参数传递进来的那么值,随后就是通过资源url读取到的,最后就是自身内部配置的值。

    3.1.2 settings
    这些都是非常重要的改动,修改MyBatis在运行时上面的表现。先忙的表就是表示他们的默认值和可以修改的参数值。
    图暂时键pdf文档。

    3.1.3 typeAliases
    别名的类型是有了简单的短的java类型。能够减少冗余的全面字段。例如:
    <typeAliases>
    <typeAlias alias="Author" type="domain.blog.Author"/>
    <typeAlias alias="Blog" type="domain.blog.Blog"/>
    <typeAlias alias="Comment" type="domain.blog.Comment"/>
    <typeAlias alias="Post" type="domain.blog.Post"/>
    <typeAlias alias="Section" type="domain.blog.Section"/>
    <typeAlias alias="Tag" type="domain.blog.Tag"/>
    </typeAliases>

    在配置中,Blog能够在任何地方替换domain.blog.Blog。

    同时也可以给包简写别名:
    <typeAliases>
    <package name="domain.blog"/>
    </typeAliases>
    在domain.blog中,如果没有注解,will be registered as an alias using uncapitalized non-qualified class name of the bean。domain.blog.Author讲会有一个别名author。看一个简单的例子:
    @Alias("author")
    public class Author {
    ...
    }

    有许多共同的java类型的内置别名,他们不区分大小写,注意重载。
    详细的内置别名的图见pdf文档。

    3.1.4 typeHandlers
    不是很懂。。。。

    3.1.5 Handling Enums
    如果你想使用枚举,你需要使用EnumTypeHandler或EnumOrdinalTypeHandler.
    比如,如果存的是一个圆的周长,我们需要使用四舍五入法。默认,MyBatis使用EnumTypeHandler去转换枚举值。

    注意:EnumTypeHandler是一个特殊的不同于其他的处理类。它不处理任何特殊类,但是可以拓展人任何类。

    然而,我们不想要存储姓名,我们的DBA坚持用一个整形替代,
    <!-- mybatis-config.xml -->
    <typeHandlers>
    <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.
    </typeHandlers>
    但是如果你想映射同一枚举一个字符串在一个地方,在另一个整数?
    自动映射可以使用EnumOrdinalTypeHandler,如果我们想使用前面旧的EnumTypeHandler,我们需要告诉他,通过显示设置使用用这些sql语句

    文档见pdf16页
    注意:这迫使我们使用一个resultmap代替我们的SELECT语句ResultType

    3.1.6 对象工厂
    每次MyBatis创建一个结果对象实例,他使用了一个对象工厂做了这件事。

    3.1.7 plugins

    3.1.8 environments
    MyBatis可以配置多个环境。这可以让你的sql适应很多的数据库。例如:在你的开发中可能有不同的配置。测试和生产环境。或,你可以有多个生产的数据库共享相同的架构,你想使用相同的数据库映射。这里有许多用例.

    要记住一件很重要的事情:当你能配置有很多的环境,你只能选择一个产生SqlSessionFactory实例。

    所以你要是想连接两个数据库,你需要创建两个SqlSessionFactory实例,三个数据库,你就需要创建三个,等等。这个很容易记住:

    。一个sqlsessionFactory对应一个数据库实例。

    指定要建立环境,你只需要把环境作为参数传递给SqlSessionFactoryBuilder。两个标志的接受环境是:
    SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
    qlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
    如果环境省略了,那么就加载默认的环境,如下:
    SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
    SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
    环境元素定义了环境配置:
    <environments default="development">
    <environment id="development">
    <transactionManager type="JDBC">
    <property name="..." value="..."/>
    </transactionManager>
    <dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
    </dataSource>
    </environment>
    </environments>

    注意这里的关键部分:
    1,默认的环境识别:(e.g. default="development").
    2,为每个环境定义一个id:(e.g. id="development").
    3.TransactionManager的配置。(e.g. type="JDBC")
    4,数据源的配置:(e.g. type="POOLED")

    默认的环境和环境的ids是自动解释的。名字可以随便定义,只要确保默认的匹配其中之一。

    transactionManager
    MyBatis包含了两种类型的TransactionManager,(i.e. type="[JDBC|MANAGED]")

    1,JDBC-这个配置用JDBC直接控制提交和回滚事物。他的事务依赖于数据源的管理。
    2,MANAGED-这个配置很简单,没什么事情可做。它不需要提交和回滚事物。取而代之,它完全让容器来管理事物。默认情况下是关闭连接。然而,一些容器不希望这样,因此,如果你想停止关闭的链接,设置"closeConnection的属性为false。例如:
    <transactionManager type="MANAGED">
    <property name="closeConnection" value="false"/>
    </transactionManager>

    注意:如果你打算用Spring来管理使用的MyBatis,那么你不要对TransactionManager做任何的配置。因为Spring模块设置了一些属性配置。

    这些类型都不要任何类型的事物管理器。然而,他们都是类型的别名,换句话说,不是在使用他们,you could put your own fully qualified class name or Type Alias that refers to your own implementation of the TransactionFactory interface。
    public interface TransactionFactory {
    void setProperties(Properties props);
    Transaction newTransaction(Connection conn);
    Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level,... )
    }

    在XML中任何属性的配置在初始化后都配传递给setProperties()这个属性。你的实现还需要创建一个事物的实现,这是非常简单的:
    public interface Transaction {
    Connection getConnection() throws SQLException;
    void commit() throws SQLException;
    void rollback() throws SQLException;
    void close() throws SQLException;
    }

    使用这两个接口,你可以完全自定义MyBatis的处理。


    dataSource
    数据源的配置JDBC连接资源对象必须使用标准的JDBC数据源。
    大多数MyBatis应用讲配置数据源作为示例,但是,它不是必须的,虽然,对于懒加载来说,配置数据源是必须的。

    有三类建立数据源的类型:

    UNPOOLED

    POOLED

    JNDI

    3.1.9 databaseIdProvider
    MyBatis能够执行不同的语句取决于你提供的数据库供应商。许多数据库供应商的支持是基于databaseId映射。配置如下:
    <databaseIdProvider type="VENDOR" />


    <databaseIdProvider type="VENDOR">
    <property name="SQL Server" value="sqlserver"/>
    <property name="DB2" value="db2"/>
    <property name="Oracle" value="oracle" />
    </databaseIdProvider>


    你也可以通过实现接口来实现自己的数据库供应:
    org.apache.ibatis.mapping.DatabaseIdProvider and registering it in mybatis-config.xml:
    public interface DatabaseIdProvider {
    void setProperties(Properties p);
    String getDatabaseId(DataSource dataSource) throws SQLException;
    }

    3.1.10 mappers
    <!-- Using classpath relative resources -->
    <mappers>
    <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
    <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
    <mapper resource="org/mybatis/builder/PostMapper.xml"/>
    </mappers>


    <!-- Using url fully qualified paths -->
    <mappers>
    <mapper url="file:///var/mappers/AuthorMapper.xml"/>
    <mapper url="file:///var/mappers/BlogMapper.xml"/>
    <mapper url="file:///var/mappers/PostMapper.xml"/>
    </mappers>

    <!-- Using mapper interface classes -->
    <mappers>
    <mapper class="org.mybatis.builder.AuthorMapper"/>
    <mapper class="org.mybatis.builder.BlogMapper"/>
    <mapper class="org.mybatis.builder.PostMapper"/>
    </mappers>

    <!-- Register all interfaces in a package as mappers -->
    <mappers>
    <package name="org.mybatis.builder"/>
    </mappers>

    这些声明只是告诉MyBatis何去何从。关于SQL映射中的细节我们这里不再做讨论,这是我们下章需要讨论的.




    4,Mapper XML Files
    4.1 Mapper XML Files
    MyBatis的真正的强大在于映射。这正是奇迹发生的地方。这是他们所有的力量之源,映射的XML文件时简单的。当然如果你把他们和等效的代码相比较,你马上就会发现这里省去了95%的代码,MyBatis建立了一个远离你的方式只关注与SQL。

    映射文件中有很少的第一类元素:
    cache
    cache-ref
    resultMap
    parameterMap
    sql
    insert
    update
    delete
    select

    接下来我们将从他们的语句中讨论一下他们的细节:
    4.1.1 selcet
    select语句是你在MyBatis使用的流行的语句之一,取出数据库中的数据时非常有价值的一件事。所以大多数数据库应用中查询远远超过其它加在一起的操作。每一个插入,更行和删除,可能会对应很多的select.这也是MyBatis建议的原则之一,就是有大量的查询对应结果集。select是相当简单的案例。例如:
    <select id="selectPerson" parameterType="int" resultType="hashmap">
    SELECT * FROM PERSON WHERE ID = #{id}
    </select>
    选一个人对象,通过一个int类型的参数。返回一个HashMap值。
    这里需要注意参数。
    #{id}

    这个类似于JDBC中的这个意思:
    // Similar JDBC code, NOT MyBatis…
    String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
    PreparedStatement ps = conn.prepareStatement(selectPerson);
    ps.setInt(1,id);
    当然,还有更多的代码通过JDBC单独提取所需的结果并将它们映射到一个对象实例.

    这里
    <select
    id="selectPerson"
    parameterType="int"
    parameterMap="deprecated"
    resultType="hashmap"
    resultMap="personResultMap"
    flushCache="false"
    useCache="true"
    timeout="10000"
    fetchSize="256"
    statementType="PREPARED"
    resultSetType="FORWARD_ONLY">

    关于每一个标签的详细解释请参考官方文档的25页

    4.1.2 insert,update and delete
    数据的添加,修改和删除这些语句都非常的相似,他们的实现如下:
    <insert
    id="insertAuthor"
    parameterType="domain.blog.Author"
    flushCache="true"
    statementType="PREPARED"
    keyProperty=""
    keyColumn=""
    useGeneratedKeys=""
    timeout="20">

    <update
    id="insertAuthor"
    parameterType="domain.blog.Author"
    flushCache="true"
    statementType="PREPARED"
    timeout="20">

    <delete
    id="insertAuthor"
    parameterType="domain.blog.Author"
    flushCache="true"
    statementType="PREPARED"
    timeout="20">
    关于每一个字段的详解,请见官方文档28也的说明。
    下面有一些关于添加,修改和删除的例子:
    <insert id="insertAuthor" parameterType="domain.blog.Author">
    insert into Author (id,username,password,email,bio)
    values (#{id},#{username},#{password},#{email},#{bio})
    </insert>

    <update id="updateAuthor" parameterType="domain.blog.Author">
    update Author set
    username = #{username},
    password = #{password},
    email = #{email},
    bio = #{bio}
    where id = #{id}
    </update>
    <delete id="deleteAuthor" parameterType="int">
    delete from Author where id = #{id}
    </delete>

    这里没有说到的是关于插入还有一些额外的元素,使用生成密钥。

    第一,如果你的数据库支持自动生成的关键领域(如MySQL,SQL Server),那么你可以简单的设置usegeneratedkeys =“true”并设置keyproperty到目标属性和你。比如,如果关于作者有一个自动增长的主键.
    <insert id="insertAuthor" parameterType="domain.blog.Author" useGeneratedKeys="true"
    keyProperty="id">
    insert into Author (username,password,email,bio)
    values (#{username},#{password},#{email},#{bio})
    </insert>

    MyBatis有另一种方式来处理的数据库不支持自动生成密钥的生成列的类型,或者还不支持JDBC驱动程序支持的自动生成的键。

    这里我们可以做一个简单的自动生成主键的例子。
    <insert id="insertAuthor" parameterType="domain.blog.Author">
    <selectKey keyProperty="id" resultType="int" order="BEFORE">
    select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
    </selectKey>
    insert into Author
    (id, username, password, email,bio, favourite_section)
    values
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType
    </insert>

    在上面的例子中,selectKey首先会被执行,Author的id的属性被set,然后insert语句开始执行。这就是类似生成主键在你的数据库中。

    selectKey元素的描述如下:
    <selectKey
    keyProperty="id"
    resultType="int"
    order="BEFORE"
    statementType="PREPARED">
    关于每个字段描述,请见官方文档29页

    4.1.3 sql
    p29/33明天计划40-43
    4.1.4 Parameters
    4.1.5 Result Maps
    4.1.6 Auto-mapping
    4.1.7 cache

  • 相关阅读:
    蓝色、绿色、红色、紫色四种颜色的水平CSS导航
    【Java/MD5】MD5摘要算法
    【Java/MD2】MD2摘要算法
    SpringBoot的yml配置文件里一处自定义属性出现的错误提示:“Expecting a 'string' but got a 'Mapping' node”
    人的希望就像一颗永恒的星,每到深夜又会重现光芒
    【SpringBoot】给SpringBoot程序配置个简单的logback(附简易版logback.xml下载)
    SpringBoot程序连到本地Oracle,隔三岔五地启动时,在Hiraki连接池之后爆Connection refused错
    【Thymeleaf】ModelAndView中设置一个值,页面上显示此值。
    【Thymeleaf】让页面上显示session中的值
    【Oracle/错误码】select max(id) from emp for update 是锁行还是锁表?结果爆ORA01786错误: 此查询表达式不允许 FOR UPDATE
  • 原文地址:https://www.cnblogs.com/friends-wf/p/3800633.html
Copyright © 2011-2022 走看看