>  기사  >  Java  >  Mybatis 매핑 파일의 예제 코드에 대한 자세한 설명

Mybatis 매핑 파일의 예제 코드에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-09 10:32:532123검색

이 글은 마이바티스 매핑 파일 예시에 대한 자세한 설명을 위주로 소개하고 있으니 필요한 친구들은 참고하시면 됩니다

1. 입력 매핑

parameterType

입력 매개변수의 Java 유형을 지정합니다. 별칭이나 클래스의 정규화된 이름을 사용할 수 있습니다. 단순 유형인 POJO, HashMap을 수신할 수 있습니다.

1. 단순형 전달

사용자 ID를 기준으로 사용자 정보 조회:

<select id="findUserById" parameterType="int" resultType="com.itheima.mybatis.po.User"> 
  SELECT * FROM USER WHERE id =#{id} 
</select>

2. POJO 객체 전달

사용자 추가:

<insert id="insertUser" parameterType="com.itheima.mybatis.po.User"> 
  <selectKey keyProperty="id" resultType="int" order="AFTER"> 
   SELECT LAST_INSERT_ID() 
  </selectKey> 
  INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) 
</insert>

3. >

개발 시 쿼리 조건은 포조(pojo)를 통해 전달되는데, 쿼리 조건은 사용자 쿼리 조건뿐만 아니라 기타 쿼리 조건(예: 사용자 구매 제품 정보를 쿼리 조건으로 포함)을 포함하는 포괄적인 쿼리 조건입니다. > 래퍼 객체를 사용하여 입력 매개변수를 전달할 수 있습니다.


3.1 요구사항

사용자 정보 종합 조회에는 (사용자 정보, 주문 정보, 상품 정보) 등 복잡한 조회 조건이 필요합니다.

3.2 패키징 객체 정의

일반적으로 User.java 클래스는 데이터 테이블 필드와 일치해야 하며 여기에는 다른 필드를 추가하지 않는 것이 가장 좋습니다. mybatis에서는 테이블 구조를 기반으로 po 클래스가 생성됩니다.

po 클래스에서 필드를 확장하면 이때 덮어쓰게 됩니다.

그래서 po 클래스를 확장하려면 이를 상속할 확장 클래스를 만들어야 합니다.

public class UserExt extends User{ 
 //这里可以定义user的一些扩展信息 
}

POJO 래퍼 클래스 정의:

public class UserQueryVO { 
 //用户信息 
 private UserExt userExt; 
 //商品ID集合 
 private List<Integer> idList; 
 //商品信息 
 public List<Integer> getIdList() { 
  return idList; 
 } 
 public void setIdList(List<Integer> idList) { 
  this.idList = idList; 
 } 
 public UserExt getUserExt() { 
  return userExt; 
 } 
 public void setUserExt(UserExt userExt) { 
  this.userExt = userExt; 
 } 
 //订单信息 
}

3.3 Mapper 인터페이스 작성 //패키징 클래스를 사용하여 복잡한 포괄적인 사용자 정보 쿼리 수행

public List365ec941ff246bca2de9473cb1305a57 findUserList(UserQueryVO userQueryVO)


3.4 매퍼 매핑 파일 쓰기

<!-- 通过包装类来进行复杂的用户信息综合查询 --> 
<select id="findUserList" parameterType="userQueryVO" resultType="userExt"> 
  SELECT * FROM USER WHERE sex=#{userExt.sex} AND username LIKE &#39;%${userExt.username}%&#39; 
</select>

참고: 입력 매개변수 유형은 UserQueryVO가 되고, 결과 유형은 set은 UserExt가 되고, #{}의 매개변수는 UserQueryVO 객체에 있는 userExt 특성의 sex 및 username 하위 특성이 됩니다.

3.5 테스트 코드 작성

rree

4. 합격 HashMap은 POJO 객체를 전달하는 것과 동일합니다. map의 키는 pojo의 속성과 동일합니다.

4.1 매핑파일

@Test 
public void findUserListTest() { 
 // 创建SqlSession 
 SqlSession sqlSession = sqlSessionFactory.openSession(); 
 // 通过SqlSession,获取mapper接口的动态代理对象 
 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
 //构造userQueryVO对象 
 UserQueryVO userQueryVO = new UserQueryVO(); 
 // 构造UserExt对象 
 UserExt userExt = new UserExt(); 
 userExt.setSex("1"); 
 userExt.setUsername("小明"); 
 userQueryVO.setUserExt(userExt); 
 // 调用mapper对象的方法 
 List<UserExt> list = userMapper.findUserList(userQueryVO); 
 System.out.println(list); 
 // 关闭SqlSession 
 sqlSession.close(); 
}

위 빨간색으로 표시된 아이디와 아이디는 해시맵입니다. 열쇠.

4.2 테스트 코드

<!-- 传递hashmap综合查询用户信息 --> 
 <select id="findUserByHashmap" parameterType="hashmap" resultType="user"> 
  select * from user where id=#{<span style="color:#ff0000;">id</span>} and username like &#39;%${<span style="color:#ff0000;">username</span>}%&#39; 
 </select>

예외 테스트:

합격 맵의 키가 SQL에서 구문 분석된 키와 일치하지 않습니다.

테스트 결과 오류가 보고되지 않았으나 키를 통해 얻은 값이 비어 있었습니다.

2. 출력 매핑

1. resultType

(1) 사용 방법

결과 매핑에 resultType을 사용할 때 열 이름은 매핑된 pojo 속성 이름과 정확히 동일해야 열이 성공적으로 매핑될 수 있습니다.

쿼리된 열 이름과 매핑된 pojo 속성 이름이 모두 일치하지 않으면 매핑된 개체가 비어 있고 pojo 개체가 생성되지 않습니다.

쿼리된 열 이름과 매핑된 pojo 속성 이름이 모두 일치하지 않는 경우 pojo 속성 이름이 하나입니다. 일관성이 있으면 매핑된 개체가 비어 있지 않고 pojo 개체가 생성되지만 올바르게 매핑된 속성만 값을 갖습니다.

(2) 단순 유형 출력

단순 유형의 결과 매핑에 대한 요구 사항도 있으므로 쿼리 열은 단순 유형에 매핑되기 전에 하나의 열이어야 합니다.

출력 결과에 열이 하나만 있는 경우 ResultType을 사용하여 출력 결과 유형으로 단순 유형을 지정할 수 있습니다.

2.1 요구사항총 사용자 수에 대한 종합적인 질의는 (사용자 정보, 주문 정보, 상품 정보 등) 복잡한 질의 조건이 필요합니다. ).

2.2Mapper 매핑 파일

Public void testFindUserByHashmap()throws Exception{ 
  //获取session 
  SqlSession session = sqlSessionFactory.openSession(); 
  //获限mapper接口实例 
  UserMapper userMapper = session.getMapper(UserMapper.class); 
  //构造查询条件Hashmap对象 
  HashMap<String, Object> map = new HashMap<String, Object>(); 
  map.put("id", 1); 
  map.put("username", "管理员"); 
   
  //传递Hashmap对象查询用户列表 
  List<User>list = userMapper.findUserByHashmap(map); 
  //关闭session 
  session.close(); 
 }

2.3Mapper 인터페이스

<!-- 综合查询用户信息总数,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息) --> 
<select id="findUsersCount" parameterType="UserQueryVO" 
  resultType="int"> 
  SELECT count(1) FROM USER WHERE sex = #{userExt.sex} AND username LIKE &#39;%${userExt.username}%&#39; 
</select>

2.4 테스트 코드

//综合查询用户信息总数。学习:resultType输出简单类型 
public int findUsersCount(UserQueryVO vo);

(3) POJO 단일 객체 및 목록 출력

참고: 단일 pojo 객체와 pojo 목록(pojo 객체 보유)을 출력할 때 매퍼 매핑의 resultType 유형 file 은 마찬가지로 매퍼 인터페이스의 메서드 반환 값이 다릅니다.

3.1Mapper 매핑 파일

@Test 
public void testFindUsersCount() { 
 // 创建SqlSession 
 SqlSession sqlSession = sqlSessionFactory.openSession(); 
 // 通过SqlSession,获取mapper接口的动态代理对象 
 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
 //构造userQueryVO对象 
 UserQueryVO userQueryVO = new UserQueryVO(); 
 // 构造UserExt对象 
 UserExt userExt = new UserExt(); 
 userExt.setSex("1"); 
 userExt.setUsername("小明"); 
 userQueryVO.setUserExt(userExt); 
 int count = mapper.findUsersCount(userQueryVO); 
 System.out.println(count); // 关闭SqlSession 
 sqlSession.close(); 
}

3.2Mapper 인터페이스 1. 단일 포조 객체 출력

<select id="findUsersByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> 
  SELECT * FROM USER WHERE username LIKE &#39;%${value}%&#39; 
</select>

2 포조 목록 출력

//根据用户名称来模糊查询用户信息 
 public User findUsersByName(String username);

요약: 동일한 매퍼 매핑 파일이 단일 개체와 개체 목록을 반환할 때 매퍼 인터페이스가 동적 프록시를 생성하면

会根据返回值的类型,决定调用selectOne方法还是selectList方法。

2、resultMap

resultMap可以进行高级结果映射(一对一、一对多映射)。

(1)使用方法

如果查询出来的列名和属性名不一致,通过定义一个resultMap将列名和pojo属性名之间作一个映射关系。

1、  定义resultMap

2、  使用resultMap作为statement的输出映射类型。

(2)需求

把下面SQL的输出结果集进行映射

SELECT id id_,username username_,sex sex_FROM USER WHERE id = 1

(3)Mapper映射文件

定义resultMap:

<!-- 定义resultMap --> 
<!-- 
 [id]:定义resultMap的唯一标识 
 [type]:定义该resultMap最终映射的pojo对象 
 [id标签]:映射结果集的唯一标识列,如果是多个字段联合唯一,则定义多个id标签 
 [result标签]:映射结果集的普通列 
 [column]:SQL查询的列名,如果列有别名,则该处填写别名 
 [property]:pojo对象的属性名 
--> 
<resultMap type="user" id="userResultMap"> 
 <id column="id_" property="id"/> 
 <result column="username_" property="username"/> 
 <result column="sex_" property="sex"/> 
</resultMap>

定义statement:

<!-- 根据ID查询用户信息(学习resultMap) --> 
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap"> 
  SELECT id id_,username username_,sex sex_ FROM USER WHERE id = #{id} 
</select>

(4)Mapper接口定义  

 //根据ID查询用户信息(学习resultMap) 
 public User findUserByIdResultMap(int id);<strong> 
</strong>

定义Statement使用resultMap映射结果集时,Mapper接口定义方法的返回值类型为mapper映射文件中resultMap的type类型。

(5)测试代码

@Test 
public void findUserByIdResultMapTest() { 
 // 创建SqlSession 
 SqlSession sqlSession = sqlSessionFactory.openSession(); 
 // 通过SqlSession,获取mapper接口的动态代理对象 
 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
 // 调用mapper对象的方法 
 User user = userMapper.findUserByIdResultMap(1); 
 System.out.println(user); 
 // 关闭SqlSession 
 sqlSession.close(); 
}

三、动态SQL

1、If和where

Ø  If标签:作为判断入参来使用的,如果符合条件,则把if标签体内的SQL拼接上。
注意:用if进行判断是否为空时,不仅要判断null,也要判断空字符串‘';
Ø  Where标签:会去掉条件中的第一个and符号。

(1)需求

用户信息综合查询列表和用户信息综合查询总数这两个statement的定义使用动态SQL。

(2)映射文件

<!-- 综合查询用户信息,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息) --> 
<select id="findUsersByQueryVO" parameterType="cn.itcast.mybatis.po.QueryUserVO" 
  resultType="User"> 
  SELECT * FROM USER 
 <where> 
  <if test="userExt != null"> 
   <if test="userExt.sex != null and userExt.sex != &#39;&#39;"> 
    AND sex = #{userExt.sex} 
   </if> 
   <if test="userExt.username != null and userExt.username != &#39;&#39;"> 
    AND username LIKE &#39;%${userExt.username}%&#39; 
   </if> 
  </if> 
 </where> 
</select> 
<!-- 综合查询用户信息总数,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息) --> 
<select id="findUsersCount" parameterType="QueryUserVO" 
  resultType="int"> 
 SELECT count(1) FROM USER 
 <where> 
  <if test="userExt != null"> 
   <if test="userExt.sex != null and userExt.sex != &#39;&#39;"> 
    AND sex = #{userExt.sex} 
   </if> 
   <if test="userExt.username != null and userExt.username != &#39;&#39;"> 
    AND username LIKE &#39;%${userExt.username}%&#39; 
   </if> 
  </if> 
 </where> 
</select>

(3)Mapper接口

//通过包装类来进行复杂的用户信息综合查询 
public List<UserExt> findUserList(UserQueryVO userQueryVO); 
//综合查询用户总数 
public int findUsersCount(UserQueryVO userQueryVO);

(4)测试代码

不传用户名:

@Test 
 public void testFindUserList() throws Exception{ 
  // 创建UserMapper对象 
  SqlSession sqlSession = sqlSessionFactory.openSession(); 
  // 由mybatis通过sqlsession来创建代理对象 
  UserMapper mapper = sqlSession.getMapper(UserMapper.class); 
  QueryUserVO vo = new QueryUserVO(); 
  User user = new User(); 
  //此处使用动态SQL,不传username参数 
  user.setSex("1"); 
//  user.setUsername("小明"); 
  vo.setUser(user); 
  List<User> list = mapper.findUserList(vo); 
  System.out.println(user); 
  sqlSession.close(); 
 }

输出的SQL如下(也不包含用户名):

通过测试可以得知,打印出的SQL语句确实会随着条件的满足情况而不一样。

2、SQL片段

Mybatis提供了SQL片段的功能,可以提高SQL的可重用性。

2.1定义SQL片段

使用sql标签来定义一个SQL片段:

<!-- 定义SQL片段 --> 
<!-- 
 [sql标签]:定义一个SQL片段 
 [id]:SQL片段的唯一标识 
 建议: 
  1、SQL片段中的内容最好是以单表来定义 
  2、如果是查询字段,则不要写上SELECT 
  3、如果是条件语句,则不要写上WHERE 
 --> 
<sql id="select_user_where"> 
 <if test="userExt != null"> 
  <if test="userExt.sex != null and userExt.sex != &#39;&#39;"> 
   AND sex = #{userExt.sex} 
  </if> 
  <if test="userExt.username != null and userExt.username != &#39;&#39;"> 
   AND username LIKE &#39;%${userExt.username}%&#39; 
  </if> 
 </if> 
</sql>

2.2引用SQL片段

使用4801eb3c8c45c8edef439cb1d2a07f8a 来引用SQL片段:

<!-- 根据用户id来查询用户信息(使用SQL片段) --> 
<!-- 
 [include标签]:引用已经定义好的SQL片段 
 [refid]:引用的SQL片段id 
--> 
<select id="findUserList" parameterType="userQueryVO" resultType="userExt"> 
 SELECT * FROM USER 
<where> 
  <include refid="select_user_where"/> 
 </where> 
</select> 
<!-- 综合查询用户信息总数,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息) --> 
<select id="findUsersCount" parameterType="QueryUserVO" 
  resultType="int"> 
 SELECT count(1) FROM USER 
 <where> 
  <include refid="select_user_where"/> 
 </where> 
</select>

3、foreach

向sql传递数组或List时,mybatis使用foreach解析数组里的参数并拼接到SQL中。

(1)传递pojo对象中的list集合

1.1需求

在用户查询列表和查询总数的statement中增加多个id输入查询。

1.2SQL

SELECT * FROM user WHERE id IN (1,10,16)

1.3定义pojo中的list属性

package com.itheima.mybatis.po; 
import java.util.List; 
/** 
 * <p>Title: UserQueryVO</p> 
 * <p>Description: TODO(这里用一句话描述这个类的作用) <p> 
 */ 
public class UserQueryVO { 
 //用户信息 
 private UserExt userExt; 
 //商品ID集合 
 private List<Integer> idList; 
 //商品信息 
 public List<Integer> getIdList() { 
  return idList; 
 } 
 public void setIdList(List<Integer> idList) { 
  this.idList = idList; 
 } 
 public UserExt getUserExt() { 
  return UserExt; 
 } 
 public void setUserExt(UserExt userExt) { 
  this.UserExt = UserExt; 
 } 
 //订单信息 
}

1.4映射文件

<!-- [foreach标签]:表示一个foreach循环 --> 
<!-- [collection]:集合参数的名称,如果是直接传入集合参数,则该处的参数名称只能填写[list]。 --> 
<!-- [item]:每次遍历出来的对象 --> 
<!-- [open]:开始遍历时拼接的串 --> 
<!-- [close]:结束遍历时拼接的串 --> 
<!-- [separator]:遍历出的每个对象之间需要拼接的字符 --> 
<if test="idList != null and idList.size > 0"> 
<foreach collection="idList" item="id" open="AND id IN (" close=")" separator=","> 
  #{id} 
</foreach> 
</if>

1.5Mapper接口

//根据用户ID的集合查询用户列表(学习foreach标签之通过POJO对象传ID集合) 
public List<UserExt> findUserList(UserQueryVO vo);

1.6测试代码

@Test 
public void testFindUserList() { 
  // 创建SqlSession 
  SqlSession sqlSession = sqlSessionFactory.openSession(); 
  // 通过SqlSession,获取mapper接口的动态代理对象 
  UserMapper mapper = sqlSession.getMapper(UserMapper.class); 
  // 构造QueryUserVO对象 
  QueryUserVO vo = new QueryUserVO(); 
  // UserExt ext = new UserExt(); 
  // ext.setUsername("小明"); 
  // ext.setSex("1"); 
  // vo.setUserExt(ext); 
  // 创建用户ID集合,然后设置到QueryUserVO对象中 
  List<Integer> idList = new ArrayList<Integer>(); 
  idList.add(1); 
  idList.add(10); 
  idList.add(16); 
  vo.setIdList(idList); 
  // 调用mapper代理对象的方法 
  List<UserExt> list = mapper.findUserList(vo); 
  System.out.println(list); 
  // 关闭SqlSession 
  sqlSession.close(); 
}

(2)直接传递List集合

2.1需求

根据用户ID的集合查询用户列表

2.2SQL

SELECT * FROM user WHERE id IN (1,10,16)

2.3映射文件

<!-- 根据用户ID的集合查询用户列表(学习foreach标签之直接传ID集合) --> 
<!--  
  [foreach标签]:表示一个foreach循环 
  [collection]:集合参数的名称,如果是直接传入集合参数,则该处的参数名称只能填写[list]。 
  [item]:定义遍历集合之后的参数名称 
  [open]:开始遍历之前需要拼接的SQL串 
  [close]:结束遍历之后需要拼接的SQL串 
  [separator]:遍历出的每个对象之间需要拼接的字符 
 --> 
<select id="findUsersByIdList" parameterType="java.util.List" resultType="user"> 
  SELECT * FROM USER 
  <where> 
    <if test="list != null and list.size > 0"> 
      <foreach collection="list" item="id" open="AND id IN (" close=")" separator=","> 
        #{id} 
      </foreach> 
    </if> 
  </where> 
</select>

2.4Mapper接口

//根据用户ID的集合查询用户列表(学习foreach标签之直接传ID集合) 
public List<User> findUsersByIdList (List<Integer> idList);

2.5测试代码

@Test 
public void findUsersByIdListTest() { 
  // 创建SqlSession 
  SqlSession sqlSession = sqlSessionFactory.openSession(); 
  // 通过SqlSession,获取mapper接口的动态代理对象 
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
  // 构造List<Integer>集合 
  List<Integer> idList = new ArrayList<Integer>(); 
  idList.add(1); 
  idList.add(10); 
    idList.add(16); 
  // 调用mapper对象的方法 
  List<User> list = userMapper.findUsersByIdList (idList); 
  System.out.println(list); 
  // 关闭SqlSession 
  sqlSession.close(); 
}


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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.