Make writing a habit together! This is the third day of my participation in the “Gold Digging Day New Plan · April More text Challenge”. Click here for more details


Mybatis returns Xml with resultType and resultMap.

A, resultType

1. Introduction to resultType

When processing the resultType returned by SQL statements using resultType, the fields queried by SQL statements must have the same field in the corresponding pojo, and the content in the resultType is the position of the pojo in the project.

2. Mapping rules

  1. Basic type: resultType= Basic type
  2. List type: resultType= The type of the element in the List
  3. Map Type One record: resultType =Map Multiple records: resultType = Value type in the Map

3. Precautions for automatic mapping

  1. Prerequisite: SQL column names are consistent with JavaBean attributes;
  2. If resultType is used, typeAliases (alias) needs to be configured.
  3. MapUnderscoreToCamelCase can be set to true if the column name is inconsistent with the JavaBean, but the column name conforms to the word underline, and Java is a camel name.

4. Code demonstration

1. Prepare 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 'iD ',' sex 'tinyint(3) DEFAULT NULL COMMENT' iD ', 'mobile' varchar(20) DEFAULT NULL COMMENT 'phone ',' email 'varchar(60) DEFAULT NULL COMMENT' email ', 'note' varchar(200) DEFAULT NULL COMMENT '注 意 ', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=142 DEFAULT CHARSET=utf8;Copy the code

2. Entity classes

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; }}Copy the code

Mapper interface class

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

}
Copy the code

4, Mapper XML

<? The 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>Copy the code

5. Configuration files

<? The 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" /> <! -- Enable lazy loading --> <! When enabled, objects with lazy loading properties will be fully loaded with any properties when called. Otherwise, each attribute will be loaded as needed. Default: true -> <setting name=" introduction to sivelazyloading "value="false" /> </ Settings > <! - alias definition - > < 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 default="development"> <! -- Environment configuration 1, Each SqlSessionFactory corresponds to an environment --> <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> <! -- map file, mapper configuration file --> <mappers> <! - directly mapped to the corresponding mapper file - > < mapper resource = "sqlmapper/TUserTestMapper. XML" / > < / mappers > < / configuration >Copy the code

6. Start the test class

public class MybatisDemo2 { private SqlSessionFactory sqlSessionFactory; @ Before public void init () throws IOException {/ / -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- the first stage -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- / / 1. SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); inputStream.close(); ResultType public void testAutoMapping() throws IOException {// 2. Get sqlSession sqlSession sqlSession = sqlSessionFactory. OpenSession (); GetMapper (TUserTestMapper) = sqlsession. getMapper(tUserTestmapper.class); List<TUser> users = mapper.selectAll(); // 4. for (TUser tUser : users) { System.out.println(tUser); }}}Copy the code

7. Execution results

The SQL statement: "com. Mysql. JDBC. JDBC4PreparedStatement @ 654 f0d9c: Select id, user_name, real_name, sex, mobile, email, note from T_user_test. TUser [id=1, userName=zhangsan, realName= zhangsan, sex=1, mobile=186995587411, [email protected], note=zhangsan PositionId =] TUser [id=2, userName=lisi, realName= Lisi, sex=1, mobile=18677885200, [email protected], note=lisi PositionId =] TUser [ID =3, userName= Wangwu, realName= Wangwu, sex=2, mobile=18695988747, [email protected], note=wangwu's note, positionId=]Copy the code

ResultType You are advised to select this parameter when returning the basic type. When returning the POJO class, it needs to completely correspond to the database field, resulting in inflexible problems and difficulty in troubleshooting.

Second, the resultMap

1. Introduction to resultMap

The resultMap element is the most important and powerful element in MyBatis. It frees you up to 90% of the JDBC ResultSets data extraction code, and it can potentially replace thousands of lines of code with equivalent functionality for joint mapping of complex statements. The idea behind ResultMap is that simple statements do not need explicit result mappings, while more complex statements only need to describe their relationships.

2. ResultMap attribute

attribute describe
id A unique identifier in the current namespace that identifies a Result map.
type The fully qualified name of the class, or a type alias.
autoMapping If this property is set, MyBatis will enable or disable automatic mapping for this ResultMap. This property overrides the global property autoMappingBehavior. The default value is unset.

3. Application scenarios

  1. Fields have custom conversion rules
  2. Complex multi-table queries

4. ResultMap subelement attributes

  1. Id – an ID result; Marking results as ids can help improve overall performance, and is used for result set unions in one-to-many queries;
  2. Result – A normal result injected into a field or JavaBean property
  3. Association – an association of a complex type; Many results will be wrapped in this type. Associations can be specified as a resultMap element, or reference one
  4. Collection – A collection of complex types

5. Code demonstration

Entity class, configuration file same as above

1. Mapper interface



public interface TUserMapper {


	List<TUser> selectTestResultMap();
    
}
Copy the code

2, Mapper) XML

<? The 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>Copy the code

3. Start the test

public class MybatisDemo2 { private SqlSessionFactory sqlSessionFactory; @ Before public void init () throws IOException {/ / -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- the first stage -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- / / 1. SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); inputStream.close(); } @ Test public void testResultMap () throws IOException {/ / -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- the second stage -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- / / 2. Get sqlSession sqlSession sqlSession = sqlSessionFactory. OpenSession (); GetMapper (TUserMapper) = sqlsession.getmapper (tUsermapper.class); / / -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- the third stage -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - / / 4. Execute the query and returns a single data List < TUser > users = mapper. SelectTestResultMap (); for (TUser tUser : users) { System.out.println(tUser.getUserName()); System.out.println(tUser.getPosition().getPostName()); }}}Copy the code

4. Execution results

SQL statements: "com. Mysql. JDBC. 19 bb07ed JDBC4PreparedStatement @ : 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. osition_id = B. id "The execution time is 52 milliseconds, which exceeds the threshold. Zhangsan general manager lisi part-time worker wangwu general managerCopy the code

Third, the conclusion

If the returned object is a basic type, resultType is recommended; if the returned object is POJO, resultMap is mandatory. At the same time, we can refer to Section 5.4.3 of Alibaba JAVA Development manual to decouple the return and use resultClass more directly without stumbling.