fzhiy

Running all the time.

MyBatis——配置、映射器、关系映射

点击量:9

MyBatis配置

第一节:environments

MyBatis支持多个环境,可以任意配置

第二节:transactionManager

mabatis支持两种类型的事务管理:JDBC和MANAGED(托管)

JDBC:应用程序负责管理数据库连接的声明周期;

MANAGED:由应用服务器负责管理数据库连接的声明周期(一般商用服务器才有此功能,如JBOSS)

第三节 dataSource

用来配置数据源:类型有UNPOOLED,POOLED,JDNI

UNPOOLED:没有连接池,每次数据库操作,mabatis都会创建一个新的连接,用完后,关闭;适合小并发项目

POOLED:用来连接池

JNDI:使用应用服务器配置JNDI数据源获取数据库连接

第四节:properties

配置属性

第五节: typeAliases

给类的完成限定名取别名,方便使用

<typeAliases> <!-- 别名 -->
        <package name="com.fzhiy.entity"/>
<!--        <typeAlias alias="Student" type="com.fzhiy.entity.Student"/> -->
    </typeAliases>

第六节:mappers

引入映射文件

第七节:配置Log4j日志

使用xml配置SQL映射器

第一节 insert映射语句

第二节 update映射语句

第三节 delete映射语句

第四节 update映射语句

常见问题:

写查询所有数据时,无法找到类

解决方法: 看自己的映射文件结果类型时ResultType是否应该改为自定义类型ResultMap;类名是否拼写错误;写SQL语句时引用id是否错误;

MyBatis关系映射

第一节 一对一关系实现

一个学生类,一个地址类,一个学生对应一个地址。

四种写法,推荐第四种,复用性较高。

StudentDao.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">
<mapper namespace="com.fzhiy.dao.StudentDao">
      
      <!-- 第一种写法: 对象级联 ,复用性不高-->
   <!--   <resultMap type="Student" id="StudentResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        
        <result property="address.id" column="addressId"/>
        <result property="address.sheng" column="sheng"/>
        <result property="address.shi" column="shi"/>
        <result property="address.qu" column="qu"/>
    </resultMap>-->
    
   <!-- 第二种写法: Address类独立出来  使用关联association  -->
    <!-- <resultMap type="Address" id="AddressResult">
        <result property="id" column="id"/>
        <result property="sheng" column="sheng"/>
        <result property="shi" column="shi"/>
        <result property="qu" column="qu"/>
    </resultMap>
    
    <resultMap type="Student" id="StudentResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <association property="address" resultMap="AddressResult"/>
    </resultMap> -->
    
    <!-- 第三种写法 嵌套association -->
    <!--  <resultMap type="Student" id="StudentResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <association property="address" javaType="Address">
            <result property="id" column="id"/>
            <result property="sheng" column="sheng"/>
            <result property="shi" column="shi"/>
            <result property="qu" column="qu"/>
        </association>
    </resultMap>-->
    <!-- 第四种写法 -->
    <resultMap type="Student" id="StudentResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        
        <association property="address" column="addressId" select="com.fzhiy.dao.AddressDao.findById"></association>
    </resultMap>
    <select id="findStudentWithAddress" resultMap="StudentResult" parameterType="Integer">
        select * from t_student as t1,t_address as t2 where t1.addressId=t2.id and t1.id=#{id}
    </select>
    
    <!-- parameterTpye对应typeAlias别名 -->
    <insert id="insertStudent" parameterType="Student">
        insert into t_student values(null,#{name},#{age})
    </insert>
    <update id="updateStudent" parameterType="Student">
        update t_student set name=#{name},age=#{age} where id=#{id}
    </update>
    <delete id="deleteStudnet" parameterType="Integer">
        delete from t_student where id=#{id}
    </delete>
    <select id="findById" parameterType="Integer" resultType="Student">
        select * from t_student where id=#{id}
    </select>
    
    <select id="find" resultMap="StudentResult">
        select * from t_student
    </select>
</mapper>

AddressDao.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">
<mapper namespace="com.fzhiy.dao.AddressDao">
      
    <resultMap type="Address" id="AddressResult">
        <result property="id" column="id"/>
        <result property="sheng" column="sheng"/>
        <result property="shi" column="shi"/>
        <result property="qu" column="qu"/>
    </resultMap>
    <!-- 注意这里resultType是Address -->
    <select id="findById" parameterType="Integer" resultType="Address">
        select * from t_address where id=#{id}
    </select>
    
</mapper>

第二节 一对多关系实现

一个学生类,一个年级类,一个地址类,一个年级对应多个学生。

实体类

实体类中都省略了getter和setter省略、重写toString

Grade.java

package com.fzhiy.entity;

import java.util.List;

public class Grade {

    private Integer id;
    private String gradeName;
    private List<Student> students;
    
}

Student.java

package com.fzhiy.entity;

public class Student {
    
    private Integer id;//自动生成
    private String name;
    private Integer age;
    private Address address;
    private Grade grade;
        
}

Address.java

package com.fzhiy.entity;

public class Address {
    
    private Integer id;
    private String sheng;
    private String shi;
    private String qu;
}

映射文件

GradeDao.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">
<mapper namespace="com.fzhiy.dao.GradeDao">
      
    <resultMap type="Grade" id="GradeResult">
        <result property="id" column="id"/>
        <result property="gradeName" column="gradeName"/>
        <collection property="students" column="id" select="com.fzhiy.dao.StudentDao.findByGradeId"></collection>
    </resultMap>
    
    <select id="findById" parameterType="Integer" resultMap="GradeResult">
        select * from t_grade where id=#{id}
    </select>
    
</mapper>

StudentDao.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">
<mapper namespace="com.fzhiy.dao.StudentDao">

    <!-- 第四种写法 -->
    <resultMap type="Student" id="StudentResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <association property="address" column="addressId" select="com.fzhiy.dao.AddressDao.findById"></association>
        <association property="grade" column="gradeId" select="com.fzhiy.dao.GradeDao.findById"></association>
    </resultMap>
    <select id="findStudentWithAddress" resultMap="StudentResult" parameterType="Integer">
        select * from t_student as t1,t_address as t2 where t1.addressId=t2.id and t1.id=#{id}
    </select>
    
    <select id="findByGradeId" resultMap="StudentResult" parameterType="Integer">
        select * from t_student where gradeId=#{gradeId}
    </select>
    
    <!-- parameterTpye对应typeAlias别名 -->
    <insert id="insertStudent" parameterType="Student">
        insert into t_student values(null,#{name},#{age})
    </insert>
    <update id="updateStudent" parameterType="Student">
        update t_student set name=#{name},age=#{age} where id=#{id}
    </update>
    <delete id="deleteStudnet" parameterType="Integer">
        delete from t_student where id=#{id}
    </delete>
    <select id="findById" parameterType="Integer" resultType="Student">
        select * from t_student where id=#{id}
    </select>
    
    <select id="find" resultMap="StudentResult">
        select * from t_student
    </select>
</mapper>

AddressDao.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">
<mapper namespace="com.fzhiy.dao.AddressDao">
      
    <resultMap type="Address" id="AddressResult">
        <result property="id" column="id"/>
        <result property="sheng" column="sheng"/>
        <result property="shi" column="shi"/>
        <result property="qu" column="qu"/>
    </resultMap>
    
    <select id="findById" parameterType="Integer" resultType="Address">
        select * from t_address where id=#{id}
    </select>
    
</mapper>

第三节 多对多实现

使用两个一对多实现

动态SQL

第一节 if条件

第二节 choose,where和otherwise条件

第三节 where条件

1.自动加上where

2.如果where字句以and 或者 or开头,则自动删除第一个and或or

第四节 trim条件

功能和where元素类似,提供了前缀、后缀功能,更加灵活

第五节 foreach条件

第六节 set条件

1.自动加上set

2.自动删除最后一个逗号“,”

小结

where和set元素较为常用,必须掌握。trim元素很强大,灵活,多用。

代码

Student.java

省略了getter和setter、toString方法

package com.fzhiy.entity;

public class Student {
    
    private Integer id;//自动生成
    private String name;
    private Integer age;
}

StudentDao

package com.fzhiy.dao;

import java.util.List;
import java.util.Map;

import com.fzhiy.entity.Student;

public interface StudentDao {
    
    public List<Student> searchStudents(Map<String,Object>map); 
    
    public List<Student> searchStudents2(Map<String,Object>map);

    public List<Student> searchStudents3(Map<String,Object>map);

    public List<Student> searchStudents4(Map<String,Object>map);
    
    public List<Student> searchStudents5(Map<String,Object>map);

    public int updateStudent(Student student);
}

StudentDao.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">
<mapper namespace="com.fzhiy.dao.StudentDao">
    
    <resultMap type="Student" id="StudentResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
    </resultMap>
    
    <select id="searchStudents" parameterType="Map" resultMap="StudentResult">
        select * from t_student
         where gradeId=#{gradeId}
         <if test="name!=null">
             and name like #{name}
         </if>
         <if test="age!=null">
             and age=#{age}
         </if>
    </select>
    
    <select id="searchStudents2" parameterType="Map" resultMap="StudentResult">
        select * from t_student
         <choose><!-- 标志通过某个字段来查询 ,  注意是 ==   -->
             <when test="searchBy=='gradeId'" >
                 where gradeId=#{gradeId}
             </when>
             <when test="searchBy=='name'">
                 where name like #{name}
             </when>
             <otherwise>
                 where age=#{age}
             </otherwise>
         </choose>
    </select>
    
    <select id="searchStudents3" parameterType="Map" resultMap="StudentResult">
        select * from t_student
        <where>
             <if test="gradeId!=null">
                 gradeId=#{gradeId}
             </if>
             <if test="name!=null">
                and name like #{name}
             </if>
             <if test="age!=null">
                 and age=#{age}
             </if>
         </where>
    </select>
    
    <select id="searchStudents4" parameterType="Map" resultMap="StudentResult">
        select * from t_student
         <trim prefix="where" prefixOverrides="and/or">     <!-- 和where元素功能相同 -->
             <if test="gradeId!=null">
                 gradeId=#{gradeId}
             </if>
             <if test="name!=null">
                and name like #{name}
             </if>
             <if test="age!=null">
                 and age=#{age}
             </if>
         </trim>
    </select>
    
    <select id="searchStudents5" parameterType="Map" resultMap="StudentResult">
        select * from t_student
        <if test="gradeIds!=null">
            <where>
                gradeId in 
                <foreach item="gradeId" collection="gradeIds" open="(" separator="," close=")">
                    #{gradeId}
                </foreach>
            </where>
        </if>
    </select>
    
    <update id="updateStudent" parameterType="Student">
        update t_student
        <!--  set元素自动删除最后一个逗号  -->
        <set>
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="age!=null">
                age=#{age},
            </if>
        </set>
        where id=#{id}
    </update>
</mapper>
点赞

发表评论

电子邮件地址不会被公开。