解决MyBatis中为类配置别名,列名与属性名不对应的问题

在传参与接收返回结果的时候,咱们一直是使用的全限定名。但是MyBatis自己在使用很多类型的时候(如Integer,Boolean)却可以直接使用别名。那么,咱们自己的写的类能不能使用别名呢?可以。需要配置。

mybatis配置文件:

<?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">
<!--
 完成一个mybatis-config.xml的文件
 -> 作用:配置连接数据库的所有需要的环境
 必须连接到所有要使用的映射文件(ProductMapper.xml)
 -->

<!--configuration 根目录 -->
<configuration>
 <!-- 引入(关联)db.properties文件 -->
 <properties resource="db.properties"></properties>

 <!-- 配置别名:在MyBatis中为一个类取别名 配置别名是为了在对象映射文件中接收参数类型和返回参数类型时使用-->
 <typeAliases>
 <!--
 设置这个包下面的所有类的别名
 <package name="cn.itsource.domain"/>
 -->

 <!--
 设置单个类的别名  alias:取的别名 type:这个别名所对应的Java类 别名使用的时候与大小写无关
 -->
 <typeAlias alias="Product" type="cn.itsource.domain.Product"/>
 </typeAliases>

 <!-- 环境们:很多环境  default:表示默认使用哪一个环境-->
 <environments default="development">
 <!-- 单个环境:一个环境  id:表示这个环境的名称-->
 <environment id="development">
 <!-- transactionManager:事务管理器 (使用的JDBC事务管理器)-->
 <transactionManager type="JDBC"></transactionManager>
 <!-- MyBatis自帶POOLED连接池(数据源) -->
 <dataSource type="POOLED">
 <property name="driver" value="${db_driverClassname}" />
 <property name="url" value="${db_url}" />
 <property name="username" value="${db_username}" />
 <property name="password" value="${db_password}" />
 </dataSource>
 </environment>
 </environments>

 <!-- resource:表示 核心配置文件(mybatis-config.xml)必须与所有的对象映射文件(ProductMapper.xml)关联!!!! -->
 <mappers>
 <mapper resource="cn/itsource/domain/ProductMapper.xml" />
 </mappers>
</configuration>

上面配置了别名,那么对象与映射文件中就可以直接使用别名,而不需要使用全限定名称

<?xml version="1.0" encoding="UTF-8"?>

<!-- 完成一个对象关系映射文件 ->
作用:一个对象的所有SQL都应该写在这个映射文件中 这个文件一般和我们的domain写在同一个包里面,取名为
 -> domain的名称+Mapper.xml -->
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace:命名空间(每个Mapper必须有命名空间) -->
<mapper namespace="cn.itsource.domain.ProductMapper">

 <!--
  select:它里面写查询语句
  id:查询语句的唯一标识(名称不能重复)
  如何在 java代码中找到sql语句? 命名空间+id
  例子:cn.itsource.domain.ProductMapper.select
  parameterType:传入的参数类型。 除了MyBatis支持的类型,其它的类型都通通使用全限定名
  resultType:返回的每一条数据的结果类型(结果类型写权限定名称 ) 查询功能使用
 -->
 <select id="selectOne" parameterType="Long" resultType="Product">
 select * from product where id = #{id}
 </select>

 <!-- resultType:表示返回的数据类型 -->
 <select id="selectAll" resultType="Product">
 select * from Product
 </select>

 <!--parameterType :表示传入参数(Product)。
 useGeneratedKeys:是否需要获取主键
 keyColumn:主键在数据库中的名称(不写的话默认名称和keyProperty一致)
 keyProperty:对象中的属性(代表主键的那个属性)
 -->
 <insert id="save" parameterType="Product"
 useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 insert into product (productName,dir_id,salePrice,supplier,brand,cutoff,costPrice)
 values(#{productName},#{dir_id},#{salePrice},#{supplier},#{brand},#{cutoff},#{costPrice})
 </insert>

 <!-- parameterType:接收参数没有写权限顶名称,使用的别名(简写) -->
 <delete id="delete" parameterType="long">
 delete from product where id = #{id}
 </delete>

 <update id="update" parameterType="Product">
 update product set productName=#{productName},dir_id=#{dir_id},
 salePrice=#{salePrice},supplier=#{supplier},brand=#{brand},cutoff=#{cutoff},costPrice=#{costPrice}
 where id = #{id}
 </update>

</mapper>

列名与属性名不对应的解决方案(截图不完整)

做映射文件的时候,只做了表与对象之间的联系。并没有做列与字段之间的联系。那么它们之间是怎么联系上的呢?

由于之前咱们的列名与属性名是一样的,因此框架进行了自动的识别。

那么,如果咱们的列名与属性名不一致了(对应不上),这时候应该怎么办呢?这时候需要把哪些列名与属性名对应上。

在MyBatis中,提供了一个resultMap的标签,就是让咱们来完成返回结果的关系对应的,使用方式如下:

注意:主键设置需要单独配置 如: <id column="id" property="id" />

<!--
 返回的数据映射
 type:代表是要映射的对象
 id:代表唯一(过会我们要拿到它)
-->
<resultMap type="cn.itsource.domain.Product" id="productMap">
 <!--
 column:对应的列名
 property:对应的属性名
 -->
 <id column="id" property="id" />
 <result column="productName" property="name" />
</resultMap> 

<select id="queryOne" parameterType="long" resultMap="productMap">
 select * from product where id = #{id}
</select>

补充知识:MyBatis - 实体类的属性名和数据库列名不一致时的两种解决办法!

问题:两者不一致时 , 查询结果无法封装到实体!(也就无法查询出来)

① 查询的sql语句中使用别名进行查询.

但要注意: 字段名的别名 要和 实体类的属性名一致!

UserMapper.xml

<!-- namespace:接口的全路径名. -->
<mapper namespace="com.xxx.dao.UserMapper">
 <!-- 使用别名 -->
 <select id="queryAll" resultType="com.xxx.domain.User">
  select
   id as userId,
   username as userName,
   address as userAddress,
   sex as userSex,
   birthday as userBirthday
  from user;
 </select>
</mapper>

注: 如果使用别名 , 每一个sql语句都需要加别名 (很麻烦)

故: 一般都使用第二种.

② 使用resultMap ★

UserMapper.xml

<mapper namespace="com.jxj.dao.UserDao">
 <resultMap id="userResultMap" type="User">
  <!--
  主键字段
   property: 实体类属性名.
   column: 库中表的列名
   javaType: 数据类型.
  -->
  <id property="userId" column="id" javaType="int"></id>
  <!-- 非主键字段 -->
  <result property="userSex" column="sex" javaType="string"></result>
  <result property="userAddress" column="address" javaType="string"></result>
  <result property="userBirthday" column="birthday" javaType="date"></result>
  <result property="username" column="username" javaType="string"></result>
 </resultMap>

 <select id="queryAll" resultMap="userResultMap">
  select * from user
 </select>

注: select中resultMap的属性值 要和 resultMap中id的属性值一样.

测试类: UserMapper.java

@Test
public void queryAll() throws IOException {
 // 1.创建工厂类.
 InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
 // 2.创建sql对象.
 SqlSession sqlSession = sqlSessionFactory.openSession();
 // 3.创建接口的实现类对象.
 UserMapper mapper = sqlSession.getMapper(UserMapper.class);
 // 4.调用接口中的方法 (代理)
 List<User> users = mapper.queryAll();
 for (User user : users) {
  System.out.println(user);
 }
 sqlSession.close();
 in.close();
}

以上这篇解决MyBatis中为类配置别名,列名与属性名不对应的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 在Mybatis @Select注解中实现拼写动态sql

    现在随着mybatis plus的应用,越来越多的弱化了SQL语句,对于单表操作可以说几乎不需要进行自己编写SQL语句了,但对于多表查询操作目前mybatis plus还没有很好的支持,还需要自己编写SQL语句,如: import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.anno

  • Mybatis返回单个实体或者返回List的实现

    Mybatis 的强大之处之一体现在映射语句上,让我们可以使用简单的配置,就可以实现对参数和返回结果的映射. 实体 package com.test.User public class User{ private String userId; private String userName; private String userPassword; private Date createTime; ... setter getter.... } DAO public interface User

  • Mybatis plus逻辑删除失败的BUG操作

    开发调试的时候发现Mybatis Plus的逻辑删除失效了,看了下配置文件发现没有问题,通过查看以下源码发现 逻辑删除需要注入的bean,查看这个bean的源码如下 查看其中一个实例的类的源码,如通过ID逻辑删除LogicDeleteById的源码,如下 mp在项目启动时预加载SQL是通过TableInfo中logicDelete字段判断是否开启逻辑删除的.然后让我们来看看mp内部是如何判断是否开启逻辑删除的. 先看如下源码 大概就是讲实体类中的字段进行循环映射数据库字段并封装到TableFie

  • MybatisPlus:使用SQL保留字(关键字)的操作

    MySQL8将over作为了保留字,此时操作这个字段应当加 ``,在MybatispPlus中的做法为使用@TableField注解: 同样的,如果表名是关键字,则使用@TableName注解 @TableName("`over`") public class over extends BaseEntity { } 补充知识:mybatis-plus sql报错 字段与Mysql关键字重名 字段中包含describe字段,通过mybatis-plus插入数据一直报错,经排查,原来是与M

  • 最全MyBatis核心配置文件总结(需要收藏)

    前言 上一篇我们通过将MyBatis和传统JDBC,DBUtils,以及Hibernate作了简单的对比,并且列举了一个非常简单的demo,今天这篇主要介绍一下MyBatis的全局配置文件的使用 configuration mybatis-config.xml文件的头部格式我们就不说了,直接从属性开始介绍,configuration为最顶层节点,其余所有的属性都必须嵌套在configuration内,MyBatis配置文件的顶层节点如下: <properties></properties

  • 解决MyBatis中为类配置别名,列名与属性名不对应的问题

    在传参与接收返回结果的时候,咱们一直是使用的全限定名.但是MyBatis自己在使用很多类型的时候(如Integer,Boolean)却可以直接使用别名.那么,咱们自己的写的类能不能使用别名呢?可以.需要配置. mybatis配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//

  • MyBatis使用resultMap如何解决列名和属性名不一致

    目录 使用resultMap如何解决列名和属性名不一致 OrderMapper.xml配置 单元测试 实体属性名与表字段名不匹配问题 问题 解决方案一 解决方案二 使用resultMap如何解决列名和属性名不一致 resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中. 需

  • Mybatis中实体类属性与数据列表间映射方法介绍

    Mybatis不像Hibernate中那么自动化,通过@Column注解或者直接使用实体类的属性名作为数据列名,而是需要自己指定实体类属性和 数据表中列名之间的映射关系,这一点让用惯了Hibernate的人很不习惯,所幸经过探索找到了建立映射关系的三种办法,其中总也有比较 简单的. 首先先定义一个实体类,如下: public class User implements Serializable { private Integer userId; private String userName;

  • 解决mybatis 中collection嵌套collection引发的bug

    我就废话不多说了,大家还是直接看代码吧~ <resultMap id="ParentMap" type="org.example.mybatis.Parent"> <id column="Id" jdbcType="VARCHAR" property="id" /> <result column="Name" jdbcType="VARCHAR&q

  • MyBatis中的properties配置(推荐)

    这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递.例如: <properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password&quo

  • 解决Mybatis中mapper.xml文件update,delete及insert返回值问题

    最近写了几个非常简单的接口(CRUD),在单元测试的时候却出了问题,报错如下: Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'messageListener': Unsatisfied dependency expressed through field 'reviewCheckInfoService'; nested exce

  • 解决MyBatis中Enum字段参数解析问题

    目录 基础Class和TypeHandler 请求参数解析问题 问题解决 基础Class和TypeHandler MyBatis操作的基本User对象结构如下: @Data @Alias(value = "user") public class User implements Serializable { private static final long serialVersionUID = -4947062488310146862L; private Long id; @NotNu

  • 解决vue中使用proxy配置不同端口和ip接口问题

    问题描述: 使用vue-cli创建的项目,开发地址是localhost:8080,由于后台开发不同的模块,导致每个模块请求的ip和端口号不一致 例如:http://192.168.10.22:8081  或者 http://192.168.10.30:9999等 解决问题: 在vue.config.js中配置不同的端口号 module.exports = { publicPath: process.env.NODE_ENV === 'production' ? './' : '/', devSe

  • 解决myBatis中删除条件的拼接问题

    今天刚刚学习了mybatis,做了简单的对数据库的增删改查.在进行删除操作时,单条删除时很简单,但是批量删除的时候拼接删除条件却有些麻烦,现记录一下做法. Sql语句中,当删除条件并不唯一的时候,我们有两种删除的sql语句,一种使用or拼接where中的条件,例如delete from 表名where 条件1 or 条件2,另一种是使用in 例如delete from 表名where 元素in( ) 利用第一种删除语句在mybatis中的mapping.xml中进行拼接: 利用第二种删除语句在m

  • 解决mybatis中order by排序无效问题

    1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2.$将传入的数据直接显示生成在sql中.如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order b

随机推荐