MyBatis_sql映射文件

1.单表增删改查:

<?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="mybatis.dao.EmployeeMapper">
<!-- 
namespace:名称空间;指定为接口的全类名
id:唯一标识,写成接口的方法
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
-->


        <!--
    public Employee getEmpById(Integer id);
     -->
	<select id="getEmpById" resultType="mybatis.bean.Employee">
		select id,last_name ,email,gender from tbl_employee where id = #{id}
	</select>

    <!--
    //查询:返回的是一个集合
        public List<Employee> getEmps(Integer id);
    -->
    <select id="getEmps" resultType="mybatis.bean.Employee">
        select id,last_name ,email,gender from tbl_employee where id > #{id}
    </select>

    <!--
    //查找:根据员工名和id查询员工
    public Employee getEmpByIdAndName(Integer id,String last_name);
    -->
    <select id="getEmpByIdAndName" resultType="mybatis.bean.Employee">
        select id,last_name ,email,gender from tbl_employee where id = #{id} AND  last_name=#{last_name}
    </select>


    <!--
    //查找:根据map查询员工
    public Employee getEmpByMap(Map<String,Object> map);
    -->
    <select id="getEmpByMap" resultType="mybatis.bean.Employee">
        select id,last_name ,email,gender from tbl_employee where id = #{id} AND last_name=#{last_name}
    </select>



    <!--
        public void addEmp(Employee employee);
            parameterType:可以省略
    -->
    <!--
    mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys()
    useGeneratedKeys="true":使用自增主键获取主键策略
    keyProperty:指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给JavaBean哪个属性
    -->
    <insert id="addEmp" parameterType="mybatis.bean.Employee"
    useGeneratedKeys="true" keyProperty="id">
        INSERT INTO tbl_employee(last_name,email,gender)VALUE (#{lastName},#{email},#{gender})
    </insert>



    <!--
    //修改:根据传入的员工的id修改指定id员工的信息
    public void updateEmp(Employee employee);
    -->
    <update id="updateEmp" parameterType="mybatis.bean.Employee">
        UPDATE  tbl_employee
                SET last_name =#{lastName},email = #{email},gender = #{gender}
                WHERE id = #{id}
    </update>


    <!--
    //删除:通过id删除指定员工
    public void deleteEmpById(Integer id);
    -->
    <delete id="deleteEmpById">
        DELETE FROM tbl_employee WHERE id = #{id}
    </delete>

    <!--
    //返回一条记录的map;key就是列名,值就是对应的值
    public Map<String,Object> getEmpMap(Integer id);
    -->
    <select id="getEmpMap" resultType="mybatis.bean.Employee">
        select id,last_name ,email,gender from tbl_employee where id = #{id}
    </select>


    <!--
    //多条记录封装成map:Map<Integer,Employee> key是这条的记录的主键 value是这条记录
    public Map<Integer,Employee> getEmpsMap(Integer id);
    -->
    <select id="getEmpsMap" resultType="map">
        select id,last_name ,email,gender from tbl_employee where id > #{id}
    </select>
</mapper>

<!--
    mybatis参数处理:
    单个参数:mybatis不会做特殊处理
        #{参数名}:取出参数值

    多个参数:mybatis会做特殊处理
        多个参数会被封装成map
            key:param1....paramN,或者参数的索引也可以
            value:传入的值
        #{}就是从map中获取指定的key的值


    命名参数:明确指定封装参数map的key:@Param("id")
        多个参数会被封装成一个map,
              key:使用@Param注解指定的值
              value:传入的值
        #{指定的key}获取指定的key的值


     POJO:
     如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo
        #{属性名}:取出传入的pojo的属性值

     map
     如果多个参数不是业务模型的数据,没有对应的pojo,我们也可以传入map(不经常使用)
        #{key}:取出map中对应的值

     TO
     如果多个参数不是业务模型的数据,没有对应的pojo,但是我们经常使用,我们也可以编写TO

参数值的获取:
    #{}:可以获取map中或者pojo对象属性的值(预编译的形式中的占位符)
    ${}:可以获取map中或者pojo对象属性的值(直接拼装在sql中)

#{}:更丰富的用法:
    规定参数的一些规则
    javaType、jdbcType、mode(存储过程)、numericScale(留几位小数)、
    resultMap、typeHandler、jdbcTypeName、expression

    jdbcType通常需要在某种特定的条件下被设置:
        在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理
-->

2.多表查询一对一(一个员工对应一个部门):

<?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="mybatis.dao.EmployeeMapperPlus">

    <!--
    //根据员工id查询员工信息
    public Employee getEmpById(Integer id);
    -->
    <!--
    resultMap属性:
    自定义结果集映射规则
        type:自定义规则的java类型
        id:唯一id方便引用
    -->
    <resultMap type="mybatis.bean.Employee" id="MyEmp">
        <!--指定主键的封装规则
            column:指定哪一列
            property:指定对应的javaBean属性
        -->
        <id column="id" property="id"></id>
        <!--指定非主键的封装规则
            column:指定哪一列
            property:指定对应的javaBean属性
        -->
        <result column="last_name" property="lastName"></result>
        <!--其他不指定的列会自动封装,但是建议都写上-->
        <result column="email" property="email"></result>
        <result column="gender" property="gender"></result>
    </resultMap>
    <select id="getEmpById"  resultMap="MyEmp">
        select id,last_name ,email,gender from tbl_employee where id = #{id}
    </select>

    <!--
    场景一:
        查询Employee的同时查询员工对应的部门
        Employee==>Dempartment
        一个员工有与之对应的部门

        //根据员工id查询员工信息和员工所在的部门
    public Employee getEmpAndDept(Integer id);
    -->
    <!--联合查询:级联属性封装数据-->
    <resultMap type="mybatis.bean.Employee" id="MyEmpPlus">
        <id column="id" property="id"></id>
        <result column="last_name" property="lastName"></result>
        <result column="email" property="email"></result>
        <result column="gender" property="gender"></result>
        <result column="did" property="dempartment.id"></result>
        <result column="demp_name" property="dempartment.name"></result>
    </resultMap>

    <!--联合查询:方式二:使用association-->
    <resultMap type="mybatis.bean.Employee" id="MyEmpPlusX">
        <id column="id" property="id"></id>
        <result column="last_name" property="lastName"></result>
        <result column="email" property="email"></result>
        <result column="gender" property="gender"></result>
        <!--association 可以指定javabean的对象
            javaType:指定这个属性的类型
        -->
        <association property="dempartment" javaType="mybatis.bean.Dempartment">
            <result column="id" property="id"></result>
            <result column="demp_name" property="name"></result>
        </association>
    </resultMap>

    <select id="getEmpAndDept"  resultMap="MyEmpPlusX">
       select e.id id,e.last_name last_name,e.email email,e.gender gender,e.demp_id demp_id, d.id did,d.dept_name demp_name from tbl_employee e,tbl_dept d
        where e.demp_id=d.id AND e.id = #{id}
    </select>


    <!--
    使用association进行分步查询:
        先查询出员工信息,在根据员工信息里的demp_id再进行一次部门信息查询
           //分布查询员工信息和员工部门信息
            public Employee getEmpByIdStep(Integer id);
          //按照部门号查询部门信息
            public Dempartment getDeptById(Integer id);
    -->

    <!--
     使用association进行分步查询:
        1.
    -->
    <resultMap type="mybatis.bean.Employee" id="MyEmpByStep">
        <id column="id" property="id"></id>
        <result column="last_name" property="lastName"></result>
        <result column="email" property="email"></result>
        <result column="gender" property="gender"></result>
        <!--
        association定义关联对象的封装规则
            select:表名当前属性是调用select指定的方法查出的结果
            column:指定将哪一列的值传给这个方法
        -->
        <association property="dempartment"
                     select="mybatis.dao.DepartmentMapper.getDeptById"
                     column="demp_id">
        </association>
    </resultMap>
    <select id="getEmpByIdStep" resultMap="MyEmpByStep">
        select id,last_name ,email,gender,demp_id from tbl_employee where id = #{id}
    </select>


    <!--
    association可以使用延迟加载
        未设置之前,每次查询Employee对象的时候都将一起查询出来
        设置之后:部门信息在我们使用的时候再去查询
        如何实现:在全局xml文件中加上两个设置:
        <setting name="lazyLoadingEnabled" value="true"></setting>
        <setting name="aggressiveLazyLoading" value="false"></setting>
    -->


    <!--
    通过部门id查询员工列表
    //通过部门号查询员工信息
    public List<Employee> getEmpBydept_id(Integer id);
    -->
    <select id="getEmpBydept_id" resultType="mybatis.bean.Employee">
        select id,last_name lastName ,email,gender from tbl_employee where demp_id = #{id}
    </select>


</mapper>

3.多表查询一对多(一个部门对应多个员工):

?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="mybatis.dao.DepartmentMapper">

    <!--
     //按照部门号查询部门信息
    public Dempartment getDeptById(Integer id);
    -->
    <select id="getDeptById" resultType="mybatis.bean.Dempartment">
        select id,dept_name name  from tbl_dept where id = #{id}
    </select>


    <!--
        场景二:
            查询部门的时候将部门对应的所有员工信息也查出来
    -->

    <!--
    //按照部门号查询部门信息,并查询该部门的所有员工信息
    public Dempartment getDeptByIdPlus(Integer id);
    -->
    <resultMap type="mybatis.bean.Dempartment" id="MyDept">
        <id column="did" property="id"></id>
        <result column="name" property="name"></result>
        <!--collection标签定义关联集合类型的属性封装规则-->
        <collection property="emps" ofType="mybatis.bean.Employee">
            <id column="id" property="id"></id>
            <result column="lastName" property="lastName"></result>
            <result column="email" property="email"></result>
            <result column="gender" property="gender"></result>
        </collection>

    </resultMap>
    <select id="getDeptByIdPlus" resultMap="MyDept">
       select d.id did,d.dept_name name ,e.id id ,e.last_name lastName,e.gender gender,e.email email,e.demp_id demp_id
       FROM tbl_dept d
       LEFT JOIN tbl_employee e
       ON d.id = demp_id
       WHERE d.id = #{id}
    </select>

    <!--
    分步查询实现查询部门信息时查询所有该部门的员工信息

    //利用分步查询按照部门号查询部门信息,并查询该部门的所有员工信息
    public Dempartment getDeptByIdPlusStep(Integer id);
    -->
    <resultMap id="MyDeptPlus" type="mybatis.bean.Dempartment">
        <id column="did" property="id"></id>
        <result column="name" property="name"></result>
        <collection property="emps" ofType="mybatis.bean.Employee"
                    select="mybatis.dao.EmployeeMapperPlus.getEmpBydept_id"
                    column="did">
        </collection>

    </resultMap>
    <select id="getDeptByIdPlusStep" resultMap="MyDeptPlus">
        SELECT id did, dept_name name  FROM tbl_dept WHERE id =#{id}
    </select>
</mapper>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值