Mapper动态代理方式  

注册  SqlMapConfig.xml

    <mappers>
        <mapper resource="com.zym.mapper/User.xml"></mapper>

    </mappers>

User.xml

<?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="com.zym.mapper.User">
    <!-- id:statement的id 或者叫做sql的id-->
    <!-- parameterType:声明输入参数的类型 -->
    <!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
    <!-- #{}:输入参数的占位符,相当于jdbc的? -->
    <select id="queryUserById" parameterType="int" resultType="com.zym.pojo.User">
        SELECT * FROM `User` WHERE id  = #{id}
    </select>

    <!--<insert id="addUser" parameterType="com.zym.pojo.User" >-->
<!--&#45;&#45;     添加返回主键,属性说明-->
        <!--&lt;!&ndash; selectKey 标签实现主键返回 &ndash;&gt;-->
        <!--&lt;!&ndash; keyColumn:主键对应的表中的哪一列 &ndash;&gt;-->
        <!--&lt;!&ndash; keyProperty:主键对应的pojo中的哪一个属性 &ndash;&gt;-->
        <!--&lt;!&ndash; order:设置在执行insert语句前执行查询id的sql,孩纸在执行insert语句之后执行查询id的sql &ndash;&gt;-->
        <!--&lt;!&ndash; resultType:设置返回的id的类型 &ndash;&gt;-->

        <!--<selectKey resultType="int" keyColumn="id" order="AFTER" keyProperty="id">-->
          <!--select last_insert_id()-->
      <!--</selectKey>-->

        <!--insert into User(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})-->

    <!--</insert>-->

    <!--<select id="selectAll" resultType="com.zym.pojo.User">-->
        <!--select * from User ;-->
    <!--</select>-->
</mapper>

User接口

package com.zym.mapper;

import java.util.List;

public interface User {

    com.zym.pojo.User queryUserById(int id);

    List<com.zym.pojo.User> queryUserByUsername(String username);

    void saveUser(com.zym.pojo.User user);
}

注意红色的地方,需要保持一致

SqlMapConfig.xml配置文件

qlMapConfig.xml中配置的内容和顺序如下:

properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)

properties

在SqlMapConfig.xml同级别的源文件夹下创建db.properties文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

之后可以在sqlmapconfig.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>
    <!-- 是用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="com.jy.pojo.User" />
        <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
        <package name="com.jy.pojo" />
        <package name="其它包" />
    </typeAliases>

定义之后type就可以写成 user了

mappers

注册指定包下的所有mapper接口

如:<package name="com.jy.mapper"/>

注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

动态sql

if条件

<!-- 根据条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user">
    SELECT id, username, birthday, sex, address FROM `user`
    WHERE 1=1
    <if test="sex != null and sex != ''">
        AND sex = #{sex}
    </if>
    <if test="username != null and username != ''">
        AND username LIKE
        '%${username}%'
    </if>
</select>

Where标签

注意字符串类型的数据需要要做不等于空字符串校验。

<!-- 根据条件查询用户 -->
<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片段

Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。

把上面例子中的id, username, birthday, sex, address提取出来,作为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

user.xml

 <select id="queryUserByList" parameterType="int" resultType="com.zym.pojo.User">
        <!--select * from `User` where id in-->
        <!--<foreach collection="list" index="index" item="item" open="(" separator="," close=")">-->
            <!--#{item}-->
        <!--</foreach>-->

        select * from `User`
        <where>
            <foreach collection="list" open="id in (" close=")" separator="," item="ddd">
                #{ddd}
            </foreach>

        </where>
        


    </select>

mapper.user

public List<com.zym.pojo.User> queryUserByList(List<Integer> ids);

测试

User mapper = sqlSession.getMapper(User.class);
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        System.out.println(ids);
        List<com.zym.pojo.User> user = mapper.queryUserByList(ids);
        System.out.println(user);

 

 

 

 

 

posted on 2019-07-08 19:03  睡觉的阿狸  阅读(111)  评论(0编辑  收藏  举报