美文网首页
2020-11-16

2020-11-16

作者: 眼前人心上人_9a6a | 来源:发表于2020-11-16 08:42 被阅读0次

mybatis

入门

安装

  • 如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>x.x.x</version>
    </dependency>

从 XML 中构建 SqlSessionFactory

  • 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

从 SqlSessionFactory 中获取 SqlSession

  • 使用和指定语句的参数和返回值相匹配的接口(比如 BlogMapper.class),现在你的代码不仅更清晰,更加类型安全,还不用担心可能出错的字符串字面值以及强制类型转换。
    例如:
    try (SqlSession session = sqlSessionFactory.openSession()) {
    BlogMapper mapper = session.getMapper(BlogMapper.class);
    Blog blog = mapper.selectBlog(101);
    }

XML 配置

配置

  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

属性(properties)

  • 这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:
    <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>

设置(settings)

  • 一个配置完整的 settings 元素的示例如下:
    <settings>
    <setting name="cacheEnabled" value="true"/>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="multipleResultSetsEnabled" value="true"/>
    <setting name="useColumnLabel" value="true"/>
    <setting name="useGeneratedKeys" value="false"/>
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
    <setting name="defaultExecutorType" value="SIMPLE"/>
    <setting name="defaultStatementTimeout" value="25"/>
    <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>

对象工厂(objectFactory)

  • 每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。比如:
    // ExampleObjectFactory.java
    public class ExampleObjectFactory extends DefaultObjectFactory {
    public Object create(Class type) {
    return super.create(type);
    }
    public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {
    return super.create(type, constructorArgTypes, constructorArgs);
    }
    public void setProperties(Properties properties) {
    super.setProperties(properties);
    }
    public <T> boolean isCollection(Class<T> type) {
    return Collection.class.isAssignableFrom(type);
    }}

    <objectFactory type="org.mybatis.example.ExampleObjectFactory">
    <property name="someProperty" value="100"/>
    </objectFactory>

环境配置(environments)

  • 不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
  • 每个数据库对应一个 SqlSessionFactory 实例

事务管理器(transactionManager)

数据源(dataSource)

数据库厂商标识(databaseIdProvider)

XML 映射文件

  • 映射器(mappers)

    <mappers>
    <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
    <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
    <mapper resource="org/mybatis/builder/PostMapper.xml"/>
    </mappers>

    <mappers>
    <mapper url="file:///var/mappers/AuthorMapper.xml"/>
    <mapper url="file:///var/mappers/BlogMapper.xml"/>
    <mapper url="file:///var/mappers/PostMapper.xml"/>
    </mappers>

    <mappers>
    <mapper class="org.mybatis.builder.AuthorMapper"/>
    <mapper class="org.mybatis.builder.BlogMapper"/>
    <mapper class="org.mybatis.builder.PostMapper"/>
    </mappers>

    <mappers>
    <package name="org.mybatis.builder"/>
    </mappers>

XML 映射文件

1.select

  • <select id="selectPerson" parameterType="int" resultType="hashmap">
    SELECT * FROM PERSON WHERE ID = #{id}
    </select>
  1. insert, update 和 delete
  • 下面是 insert,update 和 delete 语句的示例:
    <insert id="insertAuthor">
    insert into Author (id,username,password,email,bio)
    values (#{id},#{username},#{password},#{email},#{bio})
    </insert>
    <update id="updateAuthor">
    update Author set
    username = #{username},
    password = #{password},
    email = #{email},
    bio = #{bio}
    where id = #{id}
    </update>
    <delete id="deleteAuthor">
    delete from Author where id = #{id}
    </delete>
  1. sql
    这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。 参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。比如:
    <sql id="userColumns"> {alias}.id,{alias}.username,{alias}.password </sql> 这个 SQL 片段可以在其它语句中使用,例如: <select id="selectUsers" resultType="map"> select <include refid="userColumns"><property name="alias" value="t1"/></include>, <include refid="userColumns"><property name="alias" value="t2"/></include> from some_table t1 cross join some_table t2 </select> 也可以在 include 元素的 refid 属性或内部语句中使用属性值,例如: <sql id="sometable">{prefix}Table
    </sql>
    <sql id="someinclude">
    from
    <include refid="${include_target}"/>
    </sql>
    <select id="select" resultType="map">
    select
    field1, field2, field3
    <include refid="someinclude">
    <property name="prefix" value="Some"/>
    <property name="include_target" value="sometable"/>
    </include>
    </select>
  2. 之前见到的所有语句都使用了简单的参数形式。但实际上,参数是 MyBatis 非常强大的元素。对于大多数简单的使用场景,你都不需要使用复杂的参数,比如:
    <select id="selectUsers" resultType="User">
    select id, username, password
    from users
    where id = #{id}
    </select>
    上面的这个示例说明了一个非常简单的命名参数映射。鉴于参数类型(parameterType)会被自动设置为 int,这个参数可以随意命名。原始类型或简单数据类型(比如 Integer 和 String)因为没有其它属性,会用它们的值来作为参数。 然而,如果传入一个复杂的对象,行为就会有点不一样了。比如:
    <insert id="insertUser" parameterType="User">
    insert into users (id, username, password)
    values (#{id}, #{username}, #{password})
    </insert>
  3. 结果映射
  4. 自动映射

动态 SQL

  • if
  1. <select id="findActiveBlogWithTitleLike"
    resultType="Blog">
    SELECT * FROM BLOG
    WHERE state = ‘ACTIVE’
    <if test="title != null">
    AND title like #{title}
    </if>
    </select>
  2. <select id="findActiveBlogLike"
    resultType="Blog">
    SELECT * FROM BLOG WHERE state = ‘ACTIVE’
    <if test="title != null">
    AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
    AND author_name like #{author.name}
    </if>
    </select>
  • choose (when, otherwise)
    <select id="findActiveBlogLike"
    resultType="Blog">
    SELECT * FROM BLOG WHERE state = ‘ACTIVE’
    <choose>
    <when test="title != null">
    AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
    AND author_name like #{author.name}
    </when>
    <otherwise>
    AND featured = 1
    </otherwise>
    </choose>
    </select>
  • trim (where, set)
    <select id="findActiveBlogLike"
    resultType="Blog">
    SELECT * FROM BLOG
    <where>
    <if test="state != null">
    state = #{state}
    </if>
    <if test="title != null">
    AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
    AND author_name like #{author.name}
    </if>
    </where>
    </select>
  • foreach
    <select id="selectPostIn" resultType="domain.blog.Post">
    SELECT *
    FROM POST P
    WHERE ID in
    <foreach item="item" index="index" collection="list"
    open="(" separator="," close=")">
    #{item}
    </foreach>
    </select>

Java API

相关文章

  • 周一 2020-11-16 23:00 - 06:19 雨晴雨

    2020-11-16 觉得自己很菜的一天周一 2020-11-16 23:00 - 06:19 雨晴雨 10h59...

  • 黄霄雲音乐作品

    音乐专辑:《黄霄雲的Neverland》 发行日期:2020-11-16 01. Neverland 02. 秘密...

  • 弧顶扁花方廿汉50hb7014

    原创 李大叔 清江风情 2020-11-16 图谱编号:ESB_TP_50_hb7014 直径:~36.4mm 厚...

  • 2020-12-18

    掌握这个思维,你做事才会事半功倍发布时间:2020-11-16信息来源:教学研究部 转载自:http://www....

  • 2020-11-16

    【318号】2020-11-16点赞列表 http://www.jianshu.com/p/3f5d0eb6c23...

  • 2020-11-16

    中原焦点团队祝澜 1055天 2020-11-16 下班的时间,天已经昏黑。首先联系先生,问他晚上是否在家吃饭...

  • 外化对话(四)

    外化对话(四) 原创 李明 杨广学 养正心理UH 2020-11-16 08:00 图片 图片 本文首发于2005...

  • 【佛系定投训练营】第10课作业

    第10课作业 2020-11-16 20:00 至2020-11-19 00:00 作业1:你手里的基金,周投好,...

  • 一句话心情

    2020-11-13:#心态好# 心态好的人,连被别人说了都是笑容 2020-11-16:每次你被人指着不用脑子的...

  • 2020-11-17自我观察记录

    【2020-11-16日精进 第181天/1825】表现:8分 学习和发现 1.内心疑问。第7章“自我展示”,今天...

网友评论

      本文标题:2020-11-16

      本文链接:https://www.haomeiwen.com/subject/holabktx.html