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();
}
原文地址:https://www.cnblogs.com/yuing/p/8966932.html