zoukankan      html  css  js  c++  java
  • Mybatis

     

    Mybtais:

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

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

      mybatis使用简单的XML或注解用于配置和原始映射,将接口和POJO影射成数据库中的记录

    Mybatis的底层实现:

      参考博客:http://blog.csdn.net/column/details/mybatis-principle.html

           http://xiaohuafyle.iteye.com/blog/2142894

       使用dom4j将配置文件读取出来,使用动态代理动态创建代理对象,中间的调用方法和过程是使用java的反射机制

    Maven项目中Mybatis的基本配置:

            <!-- 数据库连接,以mysql为例 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>
            
            <!-- Mybatis-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.2.8</version>
            </dependency>

      2 实体类中的属性名和表中的字段名不一致

    1 在查询语句中使用别名
      通过在查询语句中定义字段名的别名,使别名和实体类的属性名一致
      
      <select id="selectBlog2" parameterType="int" resultType="Blog">
            select
            `id`,
            `title`,
            `author_id` as authorId,
            `state`,
            `featured`,
            `style`
            from
            blog where id = #{id}
      </select>

    2 使用ResultMap
      通过resultMap来映射字段名和实体类属性名的一一对应关系
      用id属性来映射主键字段
      用result属性来映射非主键字段


        <resultMap type="Blog" id="blogResultMap">
            <id column="id" property="id" jdbcType="INTEGER" />
            <result column="author_id" property="authorId" jdbcType="INTEGER" />
        </resultMap>
      
       <select id="selectBlog3" parameterType="int" resultMap="blogResultMap">
            select * from blog where id = #{id}
        </select>

      3 排序时接受参数的字符选择问题

     如果使用#,那么sql不会报错,但是排序功能不能使用;所以应该使用$(参数是表名或是列名)
    中文排序,需要使用mysql的转换函数 CONVERT()

        <select id="selectBySort" parameterType="string" resultMap="blogResultMap">
            select * from blog order by CONVERT(${value} USING GBK)
        </select>

      4 在mapper中如何传递多参数

    1 使用索引,按照参数的位置从0开始
      
      <select id="selectByPage" resultMap="blogResultMap">
            select * from blog limit
            #{0}, #{1}
        </select>

    2 使用接口注解,注意占位参数的名字要和注解参数的名字一致
      Java的反射机制并不能让框架获取到参数的名字(方法签名中只有参数类型,名字毫无意义),所以mybatis默认的命名为:param 1, pram2...
      如果想给他们指定名称,可以使用@param注解


      List<Blog> selectByPage2(
            @Param(value="offset") int offset,
            @Param(value="pagesize") int pagesize);

      <select id="selectByPage2" resultMap="blogResultMap">
            select * from blog limit
            #{offset}, #{pagesize}
        </select>

    3 使用map传参,注意占位参数的名字要和map中的key一一对应

       Map<String, Object> map = new HashMap<String, Object>();
            map.put("offset", 2);
            map.put("pagesize", 2);
            
        List<Blog> blogList = blogMapper.selectByPage3(map);

       <select id="selectByPage3" resultMap="blogResultMap">
            select * from blog limit
            #{offset}, #{pagesize}
        </select>

       5 获取刚刚插入数据的id(带有自增主键)

    1 配置属性useGeneratedKeys="true" keyProperty="id"

      <insert id="insertBlog" parameterType="Blog" useGeneratedKeys="true" keyProperty="id">

    2 在全局配置文件中配置settings选项,并且在mapper的insert节点配置属性keyProperty="id"

      <!-- 自增主键 -->
        <settings>
          <setting name="useGeneratedKeys" value="true" />
        </settings>

      <insert id="insertBlog2" parameterType="Blog" keyProperty="id">

    3 直接查询

        <insert id="insertBlogMySql">
            <selectKey resultType="java.lang.Integer" order="AFTER"
                keyProperty="id">
                SELECT LAST_INSERT_ID()
            </selectKey>
        </insert>

    4 没有自增主键的数据库查询(oracle)

      <insert id="insertBlogOracle">
            <selectKey resultType="java.lang.Integer" order="BEFORE"
                keyProperty="id">
                select seq.nextval as id from dual
            </selectKey>
        </insert>

      

  • 相关阅读:
    LintCode Update Bits
    LintCode Flip Bits
    LintCode Wood Cut
    LintCode Sqrt(x)
    LintCode Binary Search
    LintCode Subarray Sum Closest
    Huffman编码(Huffman树)
    DFS应用——查找强分支
    DFS应用——遍历有向图+判断有向图是否有圈
    DFS应用——找出无向图的割点
  • 原文地址:https://www.cnblogs.com/roxy/p/7570018.html
Copyright © 2011-2022 走看看