Mybatis知识点

来源:互联网 发布:重庆时时计划软件 编辑:程序博客网 时间:2024/06/06 10:05

需要用到的配置文件有log4j.properties
用于打印日志

# Global logging configurationlog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

由于用Mybatis一般都是在ssm中
所以直接记录与配置无关的Mapper.xml和接口
Mapper.xml中的

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace:命名空间,用于隔离sql --><!-- 还有一个很重要的作用,使用动态代理开发DAO,1. namespace必须和Mapper接口类路径一致 --><mapper namespace="cn.itcast.mybatis.mapper.UserMapper"><!-- 保存用户 --><insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User">    <!-- selectKey 标签实现主键返回 -->    <!-- keyColumn:主键对应的表中的哪一列 -->    <!-- keyProperty:主键对应的pojo中的哪一个属性 -->    <!-- order:设置在执行insert语句前执行查询id的sql,孩纸在执行insert语句之后执行查询id的sql -->    <!-- resultType:设置返回的id的类型 -->    <selectKey keyColumn="id" keyProperty="id" order="AFTER"        resultType="int">        SELECT LAST_INSERT_ID()    </selectKey>    INSERT INTO `user`    (username,birthday,sex,address) VALUES    (#{username},#{birthday},#{sex},#{address})</insert>    <!-- 如果返回多个结果,mybatis会自动把返回的结果放在list容器中 -->    <!-- resultType的配置和返回一个结果的配置一样 -->    <select id="queryUserByUsername1" parameterType="string"        resultType="cn.itcast.mybatis.pojo.User">        SELECT * FROM `user` WHERE username LIKE #{username}    </select></mapper>

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <!-- 是用resource属性加载外部配置文件 -->    <properties resource="db.properties">        <!-- 在properties内部用property定义属性 -->        <property name="jdbc.username" value="root123" />        <property name="jdbc.password" value="root123" />    </properties>    <typeAliases>        <!-- 单个别名定义 -->        <typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />        <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->        <package name="cn.itcast.mybatis.pojo" />        <package name="其它包" />    </typeAliases>    <!-- 和spring整合后 environments配置将废除 -->    <environments default="development">        <environment id="development">            <!-- 使用jdbc事务管理 -->            <transactionManager type="JDBC" />            <!-- 数据库连接池 -->            <dataSource type="POOLED">                <property name="driver" value="${jdbc.driver}" />                <property name="url" value="${jdbc.url}" />                <property name="username" value="${jdbc.username}" />                <property name="password" value="${jdbc.password}" />            </dataSource>        </environment>    </environments>    <!-- 加载映射文件 -->    <mappers>    <package name="cn.itcast.mybatis.mapper"/>    </mappers></configuration>

resultMap的使用

    <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->    <!-- id:设置ResultMap的id -->    <resultMap type="order" id="orderResultMap">        <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->        <!-- property:主键在pojo中的属性名 -->        <!-- column:主键在数据库中的列名 -->        <id property="id" column="id" />        <!-- 定义普通属性 -->        <result property="userId" column="user_id" />        <result property="number" column="number" />        <result property="createtime" column="createtime" />        <result property="note" column="note" />    </resultMap>    <!-- 查询所有的订单数据 -->    <select id="queryOrderAll" resultMap="orderResultMap">        SELECT id, user_id,        number,        createtime, note FROM `order`    </select></mapper>

动态sql

where 和if

<!-- 根据条件查询用户 --><select id="queryUserByWhere" parameterType="user" resultType="user">    SELECT id, username, birthday, sex, address FROM `user`<!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->    <where>        <if test="sex != null">            AND sex = #{sex}        </if>        <if test="username != null and username != ''">            AND username LIKE            '%${username}%'        </if>    </where></select>

sql片段
以及引用

<!-- 根据条件查询用户 --><select id="queryUserByWhere" parameterType="user" resultType="user">    <!-- SELECT id, username, birthday, sex, address FROM `user` -->    <!-- 使用include标签加载sql片段;refid是sql片段id -->    SELECT <include refid="userFields" /> FROM `user`    <!-- where标签可以自动添加where关键字,同时处理sql语句中第一个and关键字 -->    <where>        <if test="sex != null">            AND sex = #{sex}        </if>        <if test="username != null and username != ''">            AND username LIKE            '%${username}%'        </if>    </where></select><!-- 声明sql片段 --><sql id="userFields">    id, username, birthday, sex, address</sql>

foreach标签的使用

<!-- 根据ids查询用户 --><select id="queryUserByIds" parameterType="queryVo" resultType="user">    SELECT * FROM `user`    <where>        <!-- foreach标签,进行遍历 -->        <!-- collection:遍历的集合,这里是QueryVo的ids属性 -->        <!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->        <!-- open:在前面添加的sql片段 -->        <!-- close:在结尾处添加的sql片段 -->        <!-- separator:指定遍历的元素之间使用的分隔符 -->        <foreach collection="ids" item="item" open="id IN (" close=")"            separator=",">            #{item}        </foreach>    </where></select>

一对一查询

<resultMap type="order" id="orderUserResultMap">    <id property="id" column="id" />    <result property="userId" column="user_id" />    <result property="number" column="number" />    <result property="createtime" column="createtime" />    <result property="note" column="note" />    <!-- association :配置一对一属性 -->    <!-- property:order里面的User属性名 -->    <!-- javaType:属性类型 -->    <association property="user" javaType="user">        <!-- id:声明主键,表示user_id是关联查询对象的唯一标识-->        <id property="id" column="user_id" />        <result property="username" column="username" />        <result property="address" column="address" />    </association></resultMap><!-- 一对一关联,查询订单,订单内部包含用户属性 --><select id="queryOrderUserResultMap" resultMap="orderUserResultMap">    SELECT    o.id,    o.user_id,    o.number,    o.createtime,    o.note,    u.username,    u.address    FROM    `order` o    LEFT JOIN `user` u ON o.user_id = u.id</select>

一对多查询

<resultMap type="user" id="userOrderResultMap">    <id property="id" column="id" />    <result property="username" column="username" />    <result property="birthday" column="birthday" />    <result property="sex" column="sex" />    <result property="address" column="address" />    <!-- 配置一对多的关系 -->    <collection property="orders" javaType="list" ofType="order">        <!-- 配置主键,是关联Order的唯一标识 -->        <id property="id" column="oid" />        <result property="number" column="number" />        <result property="createtime" column="createtime" />        <result property="note" column="note" />    </collection></resultMap><!-- 一对多关联,查询订单同时查询该用户下的订单 --><select id="queryUserOrder" resultMap="userOrderResultMap">    SELECT    u.id,    u.username,    u.birthday,    u.sex,    u.address,    o.id oid,    o.number,    o.createtime,    o.note    FROM    `user` u    LEFT JOIN `order` o ON u.id = o.user_id</select>