• myBatis


    mybatis文档 resultMap 动态sql

    myBatis的配置
    1.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>
        <!-- jdbc配置文件 -->
        <properties resource="db.properties"/>
        <settings>
            <!-- 开启驼峰命名映射 -->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
    
            <!--开启懒加载-->
            <setting name="lazyLoadingEnabled" value="true"/>
            <!--当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载-->
            <setting name="aggressiveLazyLoading" value="false"/>
            <!--3.4.1之后默认就是false-->
        </settings>
    
        <!-- 配置别名typeAliases位置在 environments 标签之上-->
        <typeAliases>
        <!-- 类型别名是为 Java 类型设置一个短的名字。意义仅在于用来减少类完全限定名的冗余。 -->
         <typeAlias alias="user" type="domain.blog.User"/>
    
         <!--也可以指定一个包名,MyBatis会在包名下面搜索需要的 Java Bean比如:
         默认情况下是类名的首字母小写 可以加类注解自己重新设置别名(u) @Alias("u") -->
         <package name="domain.blog"/>   
        
        </typeAliases>
        <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>
        <!-- 指定mapper.xml文件的路径 -->
        <mappers>
            <mapper resource="org/mybatis/example/BlogMapper.xml"/>
            <!-- 也可以这样写加载指定包下面所有DAO接口对应的mapper文件 注意这时mapper文件与dao接口的名字应该是一样的 -->
            <package name="com.yuing.lan.dao"/>
        </mappers>
    </configuration>
    
    2.XXX-mapper.xml 配置sql语句

    需要转译的字符

    
    &lt;            <
    &gt;            >
    &lt;&gt;        <>
    &amp;           &
    &apos;          '
    &quot;          "
    
    
    <?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">
        <!-- 
            resultType:指定返回结果中一条数据的类型
            parameterType:指定参数的类型
         -->
        <select id="selectBlog" resultType="user">
            select * from user where id = #{id}
        </select>
    
        <!-- 返回自动生成的主键  
            useGeneratedKeys="true" 使用生成的主键
            keyProperty="u_id"  将主键值保存到user.u_id中
            selectKey : 表示使用自定义的主键生成策略 如果不定义则使用数据库默认的主键生成策略
        -->
        <insert id="doInsert" parameterType="user" useGeneratedKeys="true" keyProperty="uId">
    
            <selectKey resultType="int" order="[AFTER|BEFORE]" keyProperty="uId">
                    SELECT LAST_INSERT_ID()
            </selectKey>
          
            INSERT INTO user (u_name) VALUES (#{u_name})
        </insert>
        <!-- 重点| resultMap | -->
        <resultMap id="qugeryOrderById" type="orders">
            <!-- 指定唯一标识映射赋值 -->
            <id property="oId" column="o_id"/>
            <!-- 简单类型映射赋值 -->
            <result property="time" column="time"/>
            <!-- 复杂类型映射赋值 -->
            <association property="address" javaType="address">
                <id property="aId" column="a_id"/>
                <result property="name" column="name"/>
                <result property="phone" column="phone"/>
                <result property="addres" column="addres"/>
            </association>
            <!-- 集合类型映射赋值 注意:一定要指定唯一标识 -->
            <collection property="books" ofType="book">
                <id property="bId" column="b_id"/>
                <result property="name" column="bname"/>
                <result property="price" column="price"/>
                <result property="num" column="num"/>
            </collection>
        </resultMap>
    
        
        <select id="qugeryById" parameterType="int" resultMap="qugeryOrderById" >
            SELECT orders.* ,address.* ,order_detail.*,book.name bname,book.price
              FROM
                orders,address,order_detail,book
              WHERE orders.a_id=address.a_id
                AND order_detail.o_id=orders.o_id
                AND book.b_id=order_detail.b_id
                AND orders.o_id=#{id}
        </select>
    
    
    
        <!-- 动态sql -->
        <select id="queryUser" parameterType="user" resultType="user">
            SELECT u_id uId,u_name uName,u_time uTime
            FROM user
            WHERE 1=1
            <if test="uId != null">
                ADD u_id = #{uId}
            </if>
            <if test="uName != null">
                ADD u_name = #{uName}
            </if>
            <if test="uTime != null">
                ADD u_time = #{uTime}
            </if>
        </select>
            
    
    </mapper>
    
    3.日志信息配置 log4j.properties (log4j)
    # Global logging configuration
    log4j.rootLogger=ERROR, stdout
    # MyBatis logging configuration...
    log4j.logger.org.mybatis.example.BlogMapper=TRACE
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
    
    懒加载文件配置

    orderDAO.xml

    <mapper namespace="com.yuing.lan.dao.OrdersDAO">
        <resultMap id="qugeryOrderById" type="orders">
            <id property="oId" column="o_id"/>
            <result property="time" column="time"/>
            <!--懒加载-->
            <association property="address" select="com.yuing.lan.dao.AddressDAO.qugeryById" column="a_id"/>
            <collection property="books" select="com.yuing.lan.dao.BookDAO.queryByOrdersId" column="o_id"/>
    
        </resultMap>
    
        <select id="qugeryById" parameterType="int" resultMap="qugeryOrderById">
            SELECT * FROM orders WHERE o_id=#{id}
        </select>
    </mapper>
    

    AddressDAO.xml

    <mapper namespace="com.yuing.lan.dao.AddressDAO">
        <select id="qugeryById" parameterType="int" resultType="address">
            select * from address WHERE a_id=#{id}
        </select>
    </mapper>
    

    BookDAO.xml

    <mapper namespace="com.yuing.lan.dao.BookDAO">
        <select id="queryByOrdersId" parameterType="int" resultType="book">
            select product.* ,num from product,order_detail where  product.b_id=order_detail.b_id and order_detail.o_id=#{oid};
        </select>
    </mapper>
    
    缓存

    /**
    * 一级缓存
    * 一级缓存不需要手动开启
    * 在同一个Sqlsession对象中相同的语句只会执行一次,
    * 第二次的数据是从缓存中获取到的
    * 除非中间执行了增删改操作,(会清空缓存)
    * 二级缓存
    * 需要手动开启
    * 实例对象需要实现Serializable接口
    * 作用域在同一个mapper文件,可以跨Sqlsession对象
    * 在第一次查询后SqlSession对象关闭时写入缓存
    * 在修改数据后SqlSession对象关闭时清空缓存
    * 所以当一个查询需要实时数据时不建议使用二级缓存
    * -注意需要关闭Sqlsession对象否则不会生效
    */

    java中的使用
    /**
     * namespace 就是DAO的权限定名
     * XXXmapper.xml文件 中 select insert update 
     *      id与DAO中的方法名一致
     *      parameterType 与DAO方法参数类型 一致
     *      resultXXXDAO方法返回类型一致;若返回类型是集合,则应和集合的泛型一致
     */
    
    //获取SqlSessionFactory对象
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    //获取SqlSession对象 sqlSessionFactory.openSession(blloean fl)指定提交的方式默认为false 需要手动提交
    SqlSession session = sqlSessionFactory.openSession(true);
    
    NavDAO navDAO = session.getMapper(NavDAO.class);
    Set<Nav> navs = navDAO.queryNav();
    String s = JSON.toJSONString(navs);
    System.out.println(s);
    
    //获取SqlSessionFactory对象
    String resource = "mybatis-config.xml";
    InputStream is = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    
    //获取SqlSession对象 sqlSessionFactory.openSession(blloean fl)指定提交的方式默认为false 需要手动提交
    SqlSession sqlSession = sqlSessionFactory.openSession();
    
    //执行sql语句
    try {
        List<Object> objects = sqlSession.selectList("test.userSelectAll");
        session.commit(); //查询 和 自动提交不需要commit 
    }finally {
        sqlSession.close();
    }
    
  • 相关阅读:
    好好的Timer居然有坑?
    你竟然用Integer作为synchronized的锁对象?
    是时候了解Java Socket底层实现了
    带你了解MyBatis一二级缓存
    Java利用反射排序
    用代码移动桌面图标(贪吃蛇)
    servlet上传文件+上传进度显示
    简书导航栏实现
    iPhone手机屏幕尺寸(分辨率)
    iOS深拷贝浅拷贝
  • 原文地址:https://www.cnblogs.com/yuing/p/8966932.html
Copyright © 2020-2023  润新知