Points de développement Mybatis - quelle est la différence entre resultType et resultMap ?

Prenez l'habitude d'écrire ensemble ! C'est le troisième jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement


Mybatis renvoie Xml. Les valeurs de retour sont resultType et resultMap. Comment choisit-on généralement ?

1. type de résultat

1. Introduction au type de résultat

Lorsque vous utilisez resultType pour traiter le type de résultat renvoyé par une instruction SQL, le champ interrogé par l'instruction SQL doit avoir le même champ qui lui correspond dans le pojo correspondant, et le contenu de resultType est la position du pojo dans ce projet.

2. Règles de mappage

  1. Type de base : resultType=type de base  
  2. Type de liste : resultType=type d'éléments dans la liste
  3. Type de carte Enregistrement unique : resultType = map Plusieurs enregistrements : resultType = type de valeur dans Map

3. Remarques sur la cartographie automatique

  1. Prémisse : les noms de colonne SQL et les propriétés JavaBean sont cohérents ;
  2. Utilisez resultType, si vous utilisez un raccourci, vous devez configurer typeAliases (alias);
  3. Si le nom de la colonne est incohérent avec JavaBean, mais que le nom de la colonne est conforme à la séparation des mots soulignés et que Java est la nomenclature de casse camel, alors mapUnderscoreToCamelCase peut être défini sur true ;

4. Démo de code

1. Préparation de t_user_test.sql

CREATE TABLE `t_user_test` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(60) DEFAULT NULL COMMENT '用户名称',
  `real_name` varchar(60) DEFAULT NULL COMMENT '真实名称',
  `sex` tinyint(3) DEFAULT NULL COMMENT '姓名',
  `mobile` varchar(20) DEFAULT NULL COMMENT '电话',
  `email` varchar(60) DEFAULT NULL COMMENT '邮箱',
  `note` varchar(200) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=142 DEFAULT CHARSET=utf8;
复制代码

2. Classe d'entité

package com.enjoylearning.mybatis.entity;

import java.io.Serializable;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.mysql.jdbc.Blob;

public class TUser implements Serializable{
	
    private Integer id;

    private String userName;

    private String realName;

    private Byte sex;

    private String mobile;

    private String email;

    private String note;

    private TPosition position;
    
    private List<TJobHistory> jobs ;
    
    private List<HealthReport> healthReports;

    
    private List<TRole> roles;


  
	@Override
	public String toString() {
		String positionId=  (position == null ? "" : String.valueOf(position.getId()));
		return "TUser [id=" + id + ", userName=" + userName + ", realName="
				+ realName + ", sex=" + sex + ", mobile=" + mobile + ", email="
				+ email + ", note=" + note + ", positionId=" + positionId + "]";
	}


	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getRealName() {
		return realName;
	}
	public void setRealName(String realName) {
		this.realName = realName;
	}
	
	public Byte getSex() {
		return sex;
	}

	public void setSex(Byte sex) {
		this.sex = sex;
	}


	public String getMobile() {
		return mobile;
	}


	public void setMobile(String mobile) {
		this.mobile = mobile;
	}


	public String getEmail() {
		return email;
	}


	public void setEmail(String email) {
		this.email = email;
	}


	public String getNote() {
		return note;
	}

	public void setNote(String note) {
		this.note = note;
	}


	public TPosition getPosition() {
		return position;
	}


	public void setPosition(TPosition position) {
		this.position = position;
	}

	public List<TJobHistory> getJobs() {
		return jobs;
	}


	public void setJobs(List<TJobHistory> jobs) {
		this.jobs = jobs;
	}

	public List<HealthReport> getHealthReports() {
		return healthReports;
	}

	public void setHealthReports(List<HealthReport> healthReports) {
		this.healthReports = healthReports;
	}

	public List<TRole> getRoles() {
		return roles;
	}

	public void setRoles(List<TRole> roles) {
		this.roles = roles;
	}

}
复制代码

3. Classe d'interface de mappeur

public interface TUserTestMapper {
	
	TUser selectByPrimaryKey(Integer id);
	List<TUser> selectAll();

}
复制代码

4、Mappeur 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.mybatis.mapper.TUserTestMapper">


	<select id="selectByPrimaryKey" resultType="TUser">
		select
		id, user_name, real_name, sex, mobile, email, note
		from t_user_test
		where id = #{id,jdbcType=INTEGER}
	</select>
	
	
	<select id="selectAll" resultType="TUser">
		select
		id, user_name, real_name, sex, mobile, email, note
		from t_user_test
	</select>


</mapper>
复制代码

5. Fichier de configuration

<?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>

	<properties resource="db.properties"/>
	
 	<settings>
		<!-- 设置自动驼峰转换		 -->
		<setting name="mapUnderscoreToCamelCase" value="true" />

		<!-- 开启懒加载 -->		
		 <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。默认:true -->
	  <setting name="aggressiveLazyLoading" value="false" />

	</settings>
	<!-- 别名定义 -->
	<typeAliases>
		<package name="com.enjoylearning.mybatis.entity" />
	</typeAliases>
	
 	<plugins>
		<plugin interceptor="com.enjoylearning.mybatis.Interceptors.ThresholdInterceptor"> 
			<property name="threshold" value="10"/>
		</plugin>
			
  		 <plugin interceptor="com.github.pagehelper.PageInterceptor">
			<property name="pageSizeZero" value="true" />
		</plugin>
	</plugins>


	<!--配置environment环境 -->
	<environments default="development">
		<!-- 环境配置1,每个SqlSessionFactory对应一个环境 -->
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://ip:port/test?useUnicode=true" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
	</environments>

	<!-- 映射文件,mapper的配置文件 -->
	<mappers>
		<!--直接映射到相应的mapper文件 -->
		<mapper resource="sqlmapper/TUserTestMapper.xml" />
	</mappers>

</configuration>  
复制代码

6. Démarrer la classe de test

public class MybatisDemo2 {
	
	private SqlSessionFactory sqlSessionFactory;
	
	@Before
	public void init() throws IOException {
		//--------------------第一阶段---------------------------
	    // 1.读取mybatis配置文件创SqlSessionFactory
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 1.读取mybatis配置文件创SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		inputStream.close();
	}

	@Test
	//知识点:resultType
	public void testAutoMapping() throws IOException {
		// 2.获取sqlSession	
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 3.获取对应mapper
		TUserTestMapper mapper = sqlSession.getMapper(TUserTestMapper.class);
		// 4.执行查询语句并返回多条数据
		
		List<TUser> users = mapper.selectAll();
		for (TUser tUser : users) {
			System.out.println(tUser);
		}
		
	}
	
}
复制代码

7. Résultats d'exécution

sql语句:“com.mysql.jdbc.JDBC4PreparedStatement@654f0d9c: select
		id, user_name, real_name, sex, mobile, email, note
		from t_user_test”执行时间为:35毫秒,已经超过阈值!
TUser [id=1, userName=zhangsan, realName=张三, sex=1, mobile=186995587411, [email protected], note=zhangsan的备注, positionId=]
TUser [id=2, userName=lisi, realName=李四, sex=1, mobile=18677885200, [email protected], note=lisi的备注, positionId=]
TUser [id=3, userName=wangwu, realName=王五, sex=2, mobile=18695988747, [email protected], note=wangwu's note, positionId=]
复制代码

Il est recommandé de sélectionner resultType lors du retour du type de base. Lors du retour de la classe POJO, elle doit correspondre complètement au champ de la base de données, ce qui est inflexible et difficile à dépanner.

2. resultMap

1. Introduction à resultMap

L'élément resultMap est l'élément le plus important et le plus puissant de MyBatis. Il vous libère de 90 % du code d'extraction de données JDBC ResultSets, et il est susceptible de remplacer des milliers de lignes de code équivalent en ce qui concerne le mappage conjoint d'instructions complexes. L'idée de conception de ResultMap est que les instructions simples n'ont pas besoin d'un mappage de résultats explicite, tandis que les instructions plus complexes n'ont besoin que de décrire leurs relations.

2. La propriété resultMap

Les attributs décris
identifiant Identificateur unique dans l'espace de noms actuel qui identifie une carte de résultats.
taper Le nom qualifié complet de la classe ou un alias de type.
mappage automatique Si cette propriété est définie, MyBatis activera ou désactivera le mappage automatique pour ce ResultMap. Cette propriété remplace la propriété globale autoMappingBehavior. La valeur par défaut est : non défini.

3. Scénarios d'utilisation

  1. Les champs ont des règles de conversion personnalisées
  2. requête multitable complexe

4, attributs de l'élément enfant resultMap

  1. id - un résultat d'ID ; le marquage du résultat en tant qu'ID peut aider à améliorer les performances globales, utilisé pour la fusion d'ensembles de résultats dans des requêtes un-à-plusieurs ;
  2. result – le résultat normal injecté dans le champ ou la propriété JavaBean
  3. association - une association d'un type complexe ; de nombreux résultats seront intégrés à ce type. Les associations peuvent être spécifiées en tant qu'élément resultMap ou référencer un
  4. collection – une collection de types complexes

5. Démo de code

Classe d'entité, le fichier de configuration est le même que ci-dessus

1. interface de cartographie



public interface TUserMapper {


	List<TUser> selectTestResultMap();
    
}
复制代码

2、Mappeur.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.mybatis.mapper.TUserMapper">

	<resultMap id="UserResultMap" type="TUser" autoMapping="true">
		<id column="id" property="id" />
        <result column="userName" property="userName"/>
		<result column="realName" property="realName" />
		<result column="sex" property="sex" />
		<result column="mobile" property="mobile" />
		<result column="email" property="email" />
		<result column="note" property="note" />
		<association property="position" javaType="TPosition" columnPrefix="post_">
			<id column="id" property="id"/>
			<result column="name" property="postName"/>
			<result column="note" property="note"/>
		</association>
	</resultMap>

	<select  id="selectTestResultMap" resultMap="UserResultMap" >
		select
		    a.id,
		    userName,
			realName,
			sex,
			mobile,
			email,
			a.note,
			b.id  post_id,
			b.post_name,
			b.note post_note
		from t_user a,
			t_position b
		where a.position_id = b.id

	</select>

</mapper>
复制代码

3. Lancez le test


public class MybatisDemo2 {
	

	private SqlSessionFactory sqlSessionFactory;
	
	@Before
	public void init() throws IOException {
		//--------------------第一阶段---------------------------
	    // 1.读取mybatis配置文件创SqlSessionFactory
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 1.读取mybatis配置文件创SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		inputStream.close();
	}


	
	@Test
	public void testResultMap() throws IOException {
		//--------------------第二阶段---------------------------
		// 2.获取sqlSession	
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 3.获取对应mapper
		TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
		
		//--------------------第三阶段---------------------------

		// 4.执行查询语句并返回单条数据
		List<TUser> users = mapper.selectTestResultMap();
		for (TUser tUser : users) {
			System.out.println(tUser.getUserName());
			System.out.println(tUser.getPosition().getPostName());
		}
	}
}
复制代码

4. Résultats d'exécution

sql语句:“com.mysql.jdbc.JDBC4PreparedStatement@19bb07ed: select
		    a.id,
		    userName,
			realName,
			sex,
			mobile,
			email,
			a.note,
			b.id  post_id,
			b.post_name,
			b.note post_note
		from t_user a,
			t_position b
		where a.position_id = b.id”执行时间为:52毫秒,已经超过阈值!
zhangsan
总经理
lisi
零时工
wangwu
总经理
复制代码

3.Conclusion

Lorsque l'objet renvoyé est un type de base, il est recommandé d'utiliser resultType, et lorsque l'objet renvoyé est POJO, il est forcé d'utiliser resultMap. Dans le même temps, vous pouvez vous référer à la section 5.4.3 du manuel de développement Alibaba JAVA.Le retour doit être découplé et la resultClass doit être utilisée directement.

Je suppose que tu aimes

Origine juejin.im/post/7082352714297901064
conseillé
Classement