mybatis中xml文件容易搞混的属性

发布时间:2023年12月18日


友情提醒:
先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。

第一章、

1.1)MyBatis中resultMap标签

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>

1.2)MyBatis的resultType

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不可以。

1.3)MyBatis的parameterType

指定输入参数类型,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>

1.4)type属性

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>

1.5)jdbcType属性

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>

1.6)javaType属性

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主要用于整个结果集或集合元素的类型指定。它们可以根据具体情况灵活地使用,以便完成正确的类型映射和转换。

1.7)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

文章来源:https://blog.csdn.net/baomingshu/article/details/135013403
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。