resultType和resultMap是不能同时存在的
介绍:在MyBatis当中,查询结果集被封装为Java对象,可以通过resultType,也可以通过resultMap,在resultMap当中描述了数据库表的列与Java对象的属性之间的对应关系。在映射关系中,还可以通过resultMap的typeHandler设置实现查询结果值的类型转换。ResultMap不仅可以解决简单的列与属性的映射问题,还可以处理复杂的查询结果,比如联合查询、子查询等。对于这些复杂的查询结果,可以在ResultMap中使用子元素来处理,比如<collection>元素用于处理一对多、一对一的关系,<association>元素用于处理与关联对象的关系。
作用:用于将数据库查询的结果映射到Java对象。ResultMap的主要目的是解决数据库复杂查询和Java对象之间的映射问题。
<resultMap id="userResult" type="com.example.User">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
</resultMap>
resultType和resultMap是不能同时存在的
resultType用来指定查询结果集返回的数据类型,当一个select语句查询之后得到结果集,可以使用 resultType 属性来指定查询结果应映射到的 Java 类型。结果集的列名需要和java实体类的属性名一致,不一致的可以使用as关键字给列起别名。
例如:
<select id="getDeviceInfoByDeviceId" resultType="Map">
select userCount as usercount,
fingerCount as fingercount,
faceCount as facecount,
attRecordCount as recordcount,
lastOnline,
state as status
from DeviceInfo where deviceId = #{deviceId} and tb_isDelete = 0;
</select>
例如:返回值为int,resultType为int ,java.lang.Integer也可以
<mapper namespace="com.xx.xx.dao.UserMapper">
<!-- 返回值为int,resultType为int ,java.lang.Integer也可以-->
<select id="countUser" resultType="int">
select count(*) from user
</select>
</mapper>
例如,假设你有一个名为 User 的 Java 类,其中包含 id、name 和 age 等属性。你可以在 MyBatis 的 XML 映射文件中编写以下查询语句:
<select id="getUser" resultType="com.example.User">
SELECT id, name, age FROM users WHERE id = #{id}
</select>
在上面的示例中,resultType 属性被设置为 com.example.User,这意味着查询结果的一行记录数据将被映射到resultType指定类型的对象 User 类。查询结果中的每一行数据将自动填充到 User 对象中,其中 id 列映射到 User 类的 id 属性,name 列映射到 User 类的 name 属性,以此类推。
resultType和resultMap的区别
resultType不需要配置,但是resultMap要配置一下,将数据库表的字段名和实体bean对象类的属性名一一对应关系,这样的话就算你的数据库的字段名和你的实体类的属性名不一样也没有关系,都会给你对应的映射出来,所以resultMap要更强大一些。
还有一个和resultType不同的地方在于resultMap可以用在复杂联合查询上,而resultType不可以。
指定输入参数类型,mybatis通过parameterType属性用来指定参数类型,parameterType属性是专门用来给sql语句占位符#{}传值的,底层原理使用了反射机制,#{}的大括号当中需要提供实体类的属性名,底层使用属性名拼接get方法来获取属性值,将属性值传递给sql语句。parameterType传输单个简单类型值,${}括号中只能是value。从输入对象中获取参数值拼接在sql中。
这个属性在<insert>、<update>、<delete>和<select>等映射标签中都有使用。通过指定parameterType属性,MyBatis可以获取到输入参数的值,并将其转换为对应的类型后传递给SQL语句执行。
例如,在如下示例中,我们将一个User对象插入到数据库中:parameterType属性指定了输入参数的类型为com.example.User,这意味着我们在执行插入语句时,需要传递一个User对象作为输入参数。MyBatis会根据User类中的属性,将数据库中的值映射到User对象中对应的属性。
<insert id="insertUser" parameterType="com.example.User">
INSERT INTO user(username, password) VALUES(#{username}, #{password})
</insert>
除了使用类类型作为parameterType属性的值之外,还可以使用别名来指定输入参数的类型。例如,可以使用#{String}来指定输入参数为字符串类型。下面示例中,parameterType属性被设置为int,这意味着传递给查询方法的参数应该是一个整数。MyBatis将自动将传递的参数值绑定到SQL语句中的#{id}占位符。
<select id="getUserById" parameterType="int" resultType="com.example.User">
SELECT * FROM users WHERE id = #{id}
</select>
MyBatis中的type属性用在不同的地方:
①定义SQL语句
当我们在mapper.xml中定义SQL语句时,type属性通常用来指定SQL语句的类型,比如select、insert、update、delete等。
例如:
<insert id="insertUser" parameterType="com.example.User" type="INSERT">
INSERT INTO user(username, password) VALUES(#{username}, #{password})
</insert>
②用在<resultMap>
当你定义结果映射时,元素的type属性用于指定要映射到的Java类型。例如:
<resultMap id="userResult" type="com.example.User">
<result property="id" column="user_id"/>
<result property="name" column="user_name"/>
<result property="age" column="user_age"/>
</resultMap>
③别名
为了减少冗余和提高可读性,你可以在MyBatis配置文件中定义别名,然后在映射文件中使用这些别名而不是完整的类名。例如:
<typeAliases>
<typeAlias alias="User" type="com.example.User"/>
</typeAliases>
定义别名后,你可以在映射文件中使用别名:
<resultMap id="userResult" type="User">
...
</resultMap>
MyBatis包含的JdbcType类型,JdbcType类型和Java类型的对应关系主要有下面这些:
JDBC Type Java Type
CHAR String
VARCHAR String
LONGVARCHAR String
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT boolean
BOOLEAN boolean
TINYINT byte
SMALLINT short
INTEGER INTEGER
BIGINT long
REAL float
FLOAT double
DOUBLE double
BINARY byte[]
VARBINARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
CLOB Clob
BLOB Blob
ARRAY Array
DISTINCT mapping of underlying type
STRUCT Struct
REF Ref
DATALINK java.net.URL
JdbcType类型的作用:MyBatis中的jdbcType属性用于指定参数或结果应该使用的JDBC类型。这个属性对于确保数据正确地传递给JDBC驱动程序非常重要。
在Mybatis明文建议在映射字段数据时需要将JdbcType属性加上,这样相对来说是比较安全的。
<resultMap id="BaseResultMap" type="com.bjpowernode.money.model.BidInfo">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="loan_id" jdbcType="INTEGER" property="loanId" />
<result column="uid" jdbcType="INTEGER" property="uid" />
<result column="bid_money" jdbcType="DOUBLE" property="bidMoney" />
<result column="bid_time" jdbcType="TIMESTAMP" property="bidTime" />
<result column="bid_status" jdbcType="INTEGER" property="bidStatus" />
</resultMap>
javaType:用于指定结果集中某列的Java类型。它可以是Java类的全限定名、别名或简单的类型。通过javaType可以告诉MyBatis将查询结果中的某一列映射为何种Java类型。
在这个例子中,javaType被分别设置为java.lang.String和java.lang.Integer,表示结果集中的name列对应的Java类型是String,age列对应的Java类型是Integer。
<resultMap id="userResultMap" type="com.example.User">
<result column="name" property="name" javaType="java.lang.String"/>
<result column="age" property="age" javaType="java.lang.Integer"/>
</resultMap>
需要注意的是,parameterType和javaType主要用于参数类型和结果集某列的类型指定,而type和ofType主要用于整个结果集或集合元素的类型指定。它们可以根据具体情况灵活地使用,以便完成正确的类型映射和转换。
ofType:用于告诉MyBatis将查询结果转换为特定类型的集合。通常与resultType或resultMap配合使用。当查询结果是一个集合时,可以通过ofType指定集合中元素的类型。
ofType 示例:在这个例子中,resultType被设置为java.util.List,表示查询结果将被转换为List类型,而ofType被设置为com.example.User,表示List中的元素是User类型。
<select id="getAllUsers" resultType="java.util.List" ofType="com.example.User">
SELECT * FROM users
</select>
本文创造有AI参与
参考文章如下:
MyBatis的jdbcType和javaType详解
【MyBatis】mybatis中parameterType、javaType、type和ofType