>  기사  >  Java  >  Mybatis 매핑 파일에 대한 자세한 설명

Mybatis 매핑 파일에 대한 자세한 설명

不言
不言앞으로
2018-10-12 14:50:554243검색

이 기사는 Mybatis 매핑 파일에 대한 자세한 설명을 제공합니다. 이는 특정 참조 가치가 있으므로 도움이 될 수 있습니다.

MyBatis의 진짜 핵심은 매핑 파일입니다. 매우 강력하기 때문에 동일한 기능을 가진 JDBC 코드와 비교해 보면 거의 95%의 코드가 절약된다는 것을 알 수 있습니다.

MyBatis 엔터티 클래스 매핑 파일

MyBatis에는 다음과 같은 최상위 요소가 있습니다

select: 매핑 쿼리 문

<select id="findAll" resultType="com.simple.mybatis.entitys.Employee">
        select * from tal_employee
</select>

insert: 매핑 삽입 문

use #{매개변수 속성 이름} 할당

<insert id="saveEmp" parameterType="com.simple.mybatis.entitys.Employee">
        insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
</insert>

: 매핑 수정 문

<update id="updateEmp" parameterType="com.simple.mybatis.entitys.Employee">
        update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id}
 </update>

: 매핑 삭제 문

<delete id="deleteEmp" parameterType="Integer">
        delete from tal_employee where id=#{id}
</delete>

: 다른 SQL 문에서 재사용할 수 있는 SQL 문입니다.
: 데이터베이스 테이블과 엔터티 클래스를 매핑하는 데 사용되는 가장 복잡하고 강력한 요소입니다.

<resultMap type="com.simple.mybatis.entitys.Employee" id="Employee">
    <id property="id" column="id"/>
    <result property="lastName" column="last_name"/>
    <result property="email" column="email"/>
    <result property="gender" column="gender"/></resultMap><!-- 返回外部resultMap格式的类型。-->
 <select id="findAll" resultMap="Employee">
    select id,last_name AS lastName,email,gender from tal_employee
</select>

: 지정된 네임스페이스에 대한 캐시 구성입니다.
: 다른 네임스페이스 캐시 구성에 대한 참조.

1장을 결합하고 데이터베이스와 상호 작용하는 이전 방법을 사용합니다.

sqlSession.selectList("命名空间.select标签ID");
sqlSession.selectOne("命名空间.select标签ID");
sqlSession.update("命名空间.update标签ID", "Object类型参数");
sqlSession.delete("命名空间.delete标签ID", "Object类型参数");
sqlSession.insert("命名空间.insert标签ID", "Object类型参数");

추가, 삭제 및 수정은 트랜잭션을 커밋해야 합니다. sqlSession.commit()

메서드를 실행하려면 XML 매핑 파일 메서드를 사용하세요. 문자를 통한 메소드 호출은 문자열 메소드를 사용하며, 유형 제한은 필수가 아니며 가독성이 좋지 않습니다. 이는 초기 ibatis의 호출 메소드였습니다. 또한 Mybatis는 두 가지 구현 방법도 제공합니다

MyBatis 주석 방법

1. @Select: 쿼리 문을 사용하는 방법을 수정하는 데 사용됩니다.

2 @Insert: add 문을 사용하는 방법을 수정하는 데 사용됩니다.

3. @Update: 메소드를 수정하고 수정하는데 사용됩니다.

4. @Delete: 삭제문의 사용방법을 수정하는데 사용됩니다.

공용 인터페이스 EmployeeAnnotation {
@Select("select id,last_name AS lastName,email,gender from tal_employee")
List

 @Insert("insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})")
 int saveEmp(Employee employee);

 @Update("update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id}")
 boolean updateEmp(Employee employee);

 @Delete("elete from tal_employee where id=#{id}")
 long deleteEmp(Integer id);
 }

그런 다음 mybatis 기본 구성 파일에 이 주석 인터페이스를 매핑해야 합니다

<!-- 映射注解类 -->
<mapper class="com.simple.mybatis.dao.EmployeeAnnotation"/>

@Test
    public void testAnnotation(){
        SqlSession session = sqlSessionFactory.openSession();
        EmployeeAnnotation employeeAnnotation = session.getMapper(EmployeeAnnotation.class);
        Employee employee = new Employee("测试注解增加", "email", "男");
        employeeAnnotation.saveEmp(employee);
        //提交事务
        session.commit();
        session.close();
}

주석을 사용하는 방법은 다음과 같습니다. 편리하지만 복잡한 SQL 문을 구성하는 것이 더 복잡합니다. 따라서 두 가지 방법을 조합하여 사용하는 경우가 많습니다.

Mybatis 인터페이스 프로그래밍

먼저 인터페이스를 추가합니다

public interface EmployeeMapper {
    List<Employee> findAll();
    
    int saveEmp(Employee employee);
    
    boolean updateEmp(Employee employee);
    
    long deleteEmp(Integer id);
}

엔티티 클래스 매핑 파일의 네임스페이스는 인터페이스의 전체 이름과 일치해야 하며 내부 메서드는 추가, 삭제, 수정 및 확인 태그와 일치해야 합니다. 바인딩을 완료하려면

<?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.simple.mybatis.dao.EmployeeMapper">
    <resultMap type="com.simple.mybatis.entitys.Employee" id="Employee">
        <id property="id" column="id"/>
        <result property="lastName" column="last_name"/>
        <result property="email" column="email"/>
        <result property="gender" column="gender"/>
    </resultMap>

    <!-- 返回外部resultMap格式的类型。-->
    <select id="findAll" resultMap="Employee">
        select id,last_name AS lastName,email,gender from tal_employee
    </select>
    
    <insert id="saveEmp" parameterType="com.simple.mybatis.entitys.Employee">
        insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
    </insert>
    
    <update id="updateEmp" parameterType="com.simple.mybatis.entitys.Employee">
        update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id}
    </update>
    
    <delete id="deleteEmp" parameterType="Integer">
        delete from tal_employee where id=#{id}
    </delete>
</mapper>

ID를 사용하고 MyBatis 기본 구성 파일

<mappers>
        <mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml" />
</mappers>

에 이 매핑 파일을 로드해야 합니다. 사용법:

@Test
    public void test4(){
        SqlSession session = sqlSessionFactory.openSession();
        //获取接口。这个接口mybatis会帮我创建代理实现类完成接口与XML映射的绑定
        EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
        employeeMapper.deleteEmp(1);
        session.commit();
        session.close();
    }

삽입 후 자동으로 증가하는 기본 키 가져오기

useGeneratedKeys 매개변수는 삽입 문에만 적용되며 기본값은 거짓입니다. true로 설정하면 삽입된 테이블에 기본 키로 자동 증가 열이 있는 경우 JDBC에서 기본 키 자동 생성을 지원하고 자동으로 생성된 기본 키를 반환할 수 있음을 의미합니다. keyProperty는 매개변수 유형="com.simple.mybatis.entitys.Employee

<insert id="saveEmpGetKey" parameterType="com.simple.mybatis.entitys.Employee"
    useGeneratedKeys="true" keyProperty="id"
    >
        insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
</insert>

@Test
    public void saveEmpGetKey(){
        SqlSession session = sqlSessionFactory.openSession();
        EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
        Employee employee = new Employee("自动封装主键", "email", "男");//增加之前主键没赋值
        employeeMapper.saveEmpGetKey(employee);
        session.commit();//提交事务
        System.out.println("增加后主键有值: " + employee.getId());
        session.close();//关闭资源
    }

Mybatis 매개변수 규칙

매개변수가 있는 경우:

#{xxx}을 사용하여 액세스하세요. Parameter 이름은 임의입니다. 예를 들어 #{a}, #{b}는 컬렉션(Collection, List, Set) 유형인 경우 소문자로 된 컬렉션 이름을 키로 사용합니다.

필수 인터페이스 방법:

long deleteEmp(Integer emp);

Map 파일. :

<delete id="deleteEmp" parameterType="Integer">
        delete from tal_employee where id=#{id}
</delete>

여기서 여기에 값을 할당하지 않은 것을 볼 수 있습니다. #{id}내 속성 이름은 id가 아니라 emp입니다. 전달된 컬렉션 유형

인 경우 매개변수는 임의적일 수 있습니다. Map 매개변수를 입력할 때의 값:

//接口有方法:long deleteEmp(Map<String, Object> map);
<delete id="deleteEmp" parameterType="Map">
        delete from tal_employee where id=#{empID}
</delete>

여기서 값은 empID입니다. 생각해보고 map.put("empID", 1)을 만드세요.

여러 매개변수가 있는 경우:

  1. 기본값: 매개변수에 액세스하기 위해 #{xxx}를 사용할 수 없습니다. mybatis는 매개변수를 맵에 캡슐화합니다. #{subscript} 또는 #{paramN}을 통해서만 액세스할 수 있습니다.

  2. 이름이 지정된 매개변수: 인터페이스 메소드에 @Param("key")을 추가하여 수동으로 지정합니다.

  3. 엔티티 클래스: 여러 매개변수가 캡슐화된 비즈니스 클래스인 경우 비즈니스 객체를 전달하면 됩니다. 맵: 여러 매개변수가 캡슐화된 비즈니스 클래스가 아닌 경우 지도 컬렉션을 전달하기만 하면 #{key}가 해당 값을 가져옵니다.
  4. {} 및 ${}

MyBatis에서 #{}를 사용하여 매개변수 값을 가져올 수도 있습니다. ${}는 매개변수 값을 가져옵니다.

Difference: #{}: 사전 컴파일된 방식으로 sql 문에 매개변수를 생성합니다. ${}: sql 문에 값을 직접 생성합니다. 대부분의 경우 매개변수를 가져오려면 #{}를 사용하지만 자리표시자가 지원되지 않는 경우에는 ${}를 사용하여 테이블 이름과 같은 매개변수를 가져올 수 있습니다.

resultType 반환 유형

추가, 삭제 및 수정 시 Mybatis는 결과를 자동으로 수정합니다. 캡슐화는 int, Boolean 또는 long을 반환할 수 있습니다.

  1. 엔티티 개체 및 목록 컬렉션을 반환하는 경우 resultType을 엔터티 유형으로 설정할 수 있습니다.

    단일 객체가 반환되는 경우 Map로 캡슐화할 수도 있습니다. resultType은 map으로 설정됩니다.
  2. Map와 같은 Map 컬렉션 객체가 반환되면 resultType은 Student 유형으로 설정하고, @MapKey("id") 주석을 통해 Map에 배치된 키 값을 수정합니다.

ResultMap标签介绍

ResultMap的常用子标签

  1. id:映射主键。result:映射普通列。

  2. association:复杂结果映射。

  3. collection:复杂类型的集合映射。

  4. constructor:构造函数注入。

前面我们的案例我们数据库的字段与实体类的属性基本上一致,或者不一致使用取别名方案解决,可是每条语句都去取别名是非常麻烦的,ResultMap这个标签就很好的解决数据库与实体类字段不对应的问题

我们新创建一个部门表:

CREATE TABLE tal_dept(
    d_id INT PRIMARY KEY AUTO_INCREMENT,
    d_name VARCHAR(50)
);

对应实体类:

public class Dept {
    private Integer id;
    private Integer name;
}

如果我们查询语句直接使用resultType="com.simple.mybatis.entitys.Dept那么毫无疑问我们的实体类中名字不对应是赋值为null的,我们可以ResultMap映射实体类与数据库的对应关系

<!--配置返回结果,配置数据库字段与类属性的映射-->
<resultMap type="com.simple.mybatis.entitys.Dept" id="DeptResult">
        <id column="d_id" property="id"/>
        <result column="d_name" property="name"/>
</resultMap>
<!--使用resultMap使用指向上面返回结果的ID-->
<select id="getDeptOne" parameterType="Integer" resultMap="DeptResult">
        select * from tal_dept where d_id = #{id}
</select>

关系映射

在数据库中,许多数据是分布在多个表中的,有时候需要将多个表的数据关联起来进行查询。那么在ORM框架中,我们需要处理数据表的映射关系。

常见的映射关系:

  1. 关联属性映射association

  2. 映射collection映射

result方式映射属性

这种方式并不推荐,没有什么重用性

<resultMap type="com.simple.mybatis.entitys.Employee" id="EmployeeOrDept">
        <id property="id" column="id"/>
        <result property="lastName" column="last_name"/>
        <result property="email" column="email"/>
        <result property="gender" column="gender"/>
        <!-- 指定Employee中Dept对象属性 -->
        <result property="dept.id" column="d_id"/>
        <result property="dept.name" column="d_name"/>
</resultMap>
<select id="getEmployeeOrDeptAll" resultMap="EmployeeOrDept">
        select * from tal_employee e inner join tal_dept d on e.d_id=d.d_id
</select>

association映射(分步查询)

多对一,查询员工获取员工中的部门:

<resultMap type="com.simple.mybatis.entitys.Employee" id="EmployeeOrDept">
        <id property="id" column="id"/>
        <result property="lastName" column="last_name"/>
        <result property="email" column="email"/>
        <result property="gender" column="gender"/>
        <!-- property指定实体类中对象dept 指定发过去的参数column="d_id" 
             select指定com.simple.mybatis.dao.DeptMapper映射文件中getDeptOne查询方法
         -->
        <association property="dept" column="d_id" 
        select="com.simple.mybatis.dao.DeptMapper.getDeptOne"></association>
</resultMap>
<!--resultMap指定使用上面定义的返回结果-->
<select id="getEmployeeOrDeptAll" resultMap="EmployeeOrDept">
        select * from tal_employee e inner join tal_dept d on e.d_id=d.d_id
</select>

Collection查询

一对多,获取部门同时部门中员工也获取:

<!--部门映射-->
<resultMap type="com.simple.mybatis.entitys.Dept" id="DeptResult">
        <id column="d_id" property="id"/>
        <result column="d_name" property="name"/>
        <!--property指定Dept中集合属性名 ofType指定集合中属性类型 -->
        <collection property="Employees" ofType="com.simple.mybatis.entitys.Employee" >
            <id property="id" column="id"/>
            <result property="lastName" column="last_name"/>
            <result property="email" column="email"/>
            <result property="gender" column="gender"/>
        </collection>
</resultMap>
<select id="getDeptAll" resultMap="DeptResult">
        select * from tal_dept d left join tal_Employee e on d.d_id = e.d_id
</select>

Collection嵌套查询

一对多分布查询

<resultMap type="com.simple.mybatis.entitys.Dept" id="DeptOrEmployee">
        <id column="d_id" property="id"/>
        <result column="d_name" property="name"/>
        <!--select指定com.simple.mybatis.dao.EmployeeMapper映射文件中的getEmployeeByDeptId-->
        <collection property="Employees" column="d_id"  ofType="com.simple.mybatis.entitys.Employee" 
        select="com.simple.mybatis.dao.EmployeeMapper.getEmployeeByDeptId">
        </collection>
    </resultMap>
<!--com.simple.mybatis.dao.EmployeeMapperXML中方法-->
<select id="getEmployeeByDeptId" parameterType="Integer" resultType="com.simple.mybatis.entitys.Employee">
        select * from tal_employee where d_id = #{id}
    </select>

关联查询和分步查询的区别:

  1. 关联查询一次将多个表的数据查询出来,分步查询通过多次查询获取查询结果。

  2. 配置文件不同,关联查询需要定义额外的映射,分步查询需要定义外键列,和查询的select方法。

  3. 关联查询不支持延迟加载,分步查询支持延迟加载。fetchType="lazy"

延迟加载

刚才分布查询是一次将结果查询出来,为了提高效率,mybatis还支持延迟加载技术,等需要用到对象时才进行查询。

在mybatis主配置文件中配置:

<!– 通过全局配置文件设置延迟加载-->
<settings>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>

设置级联延迟加载

<!– 设置延迟加载属性-->
<association fetchType="lazy"/>

위 내용은 Mybatis 매핑 파일에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제