mysql xml映射文件中的_Mybatis-XML映射文件

Result Maps

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来, 并在一些情形下允许你做一些 JDBC 不支持的事情。 实际上,在对复杂语句进行联合映射的时候,它很可能可以代替数千行的同等功能的代码。 ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述它们的关系就行了。

你已经见过简单映射语句的示例了,但没有明确的 resultMap。比如:

select id, username, hashedPassword

from some_table

where id = #{id}

上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。 虽然在大部分情况下都够用,但是 HashMap 不是一个很好的领域模型。 你的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通 Java 对象)作为领域模型。 MyBatis 对两者都支持。看看下面这个 JavaBean:

packagecom.someapp.model;publicclassUser{privateintid;privateStringusername;privateStringhashedPassword;publicintgetId(){returnid;}publicvoidsetId(intid){this.id =id;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username =username;}publicStringgetHashedPassword(){returnhashedPassword;}publicvoidsetHashedPassword(StringhashedPassword){this.hashedPassword =hashedPassword;}}

基于 JavaBean 的规范,上面这个类有 3 个属性:id,username 和 hashedPassword。这些属性会对应到 select 语句中的列名。

这样的一个 JavaBean 可以被映射到 ResultSet,就像映射到 HashMap 一样简单。

select id, username, hashedPassword

from some_table

where id = #{id}

类型别名是你的好帮手。使用它们,你就可以不用输入类的完全限定名称了。比如:

select id, username, hashedPassword

from some_table

where id = #{id}

这些情况下,MyBatis 会在幕后自动创建一个 ResultMap,再基于属性名来映射列到 JavaBean 的属性上。如果列名和属性名没有精确匹配,可以在 SELECT 语句中对列使用别名(这是一个 基本的 SQL 特性)来匹配标签。比如:

select

user_id as "id",

user_name as "userName",

hashed_password as "hashedPassword"

from some_table

where id = #{id}

ResultMap 最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们。 上面这些简单的示例根本不需要下面这些繁琐的配置。 出于示范的原因,让我们来看看最后一个示例中,如果使用外部的 resultMap 会怎样,这也是解决列名不匹配的另外一种方式。

引用它的语句使用 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:

select user_id, user_name, hashed_password

from some_table

where id = #{id}

如果世界总是这么简单就好了。

高级结果映射

MyBatis 创建的一个想法是:数据库不可能永远是你所想或所需的那个样子。 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们不总都是这样。 如果有一个独立且完美的数据库映射模式,所有应用程序都可以使用它,那就太好了,但可惜也没有。 ResultMap 就是 MyBatis 对这个问题的答案。

比如,我们如何映射下面这个语句?

select

B.id as blog_id,

B.title as blog_title,

B.author_id as blog_author_id,

A.id as author_id,

A.username as author_username,

A.password as author_password,

A.email as author_email,

A.bio as author_bio,

A.favourite_section as author_favourite_section,

P.id as post_id,

P.blog_id as post_blog_id,

P.author_id as post_author_id,

P.created_on as post_created_on,

P.section as post_section,

P.subject as post_subject,

P.draft as draft,

P.body as post_body,

C.id as co

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis是一个流行的持久层框架,它可以将SQL语句和Java对象之间的映射关系定义在XML文件或注解,并提供了丰富的查询语言和灵活的参数绑定方式。在使用MyBatis进行数据操作时,有时会遇到插入唯一异常的问题,下面让我们一起来看看如何解决这个问题。 1. 异常描述 当我们向数据库插入一条记录时,如果违反了唯一性约束,就会抛出插入唯一异常,如下所示: ``` ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'xxx' for key 'name_unique' ### The error may involve com.example.mapper.UserMapper.insert-Inline ### The error occurred while setting parameters ### SQL: insert into user(name, age) values (?, ?) ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'xxx' for key 'name_unique' ``` 其,'xxx'表示违反唯一性约束的值,'name_unique'表示违反唯一性约束的字段名。 2. 解决方法 为了避免插入唯一异常,我们可以采取以下两种解决方法: 2.1 使用INSERT IGNORE语句 在MySQL,可以使用INSERT IGNORE语句来向表插入记录,如果遇到违反唯一性约束的情况,就会忽略该记录,而不是抛出异常。因此,我们可以将MyBatis的插入语句改为INSERT IGNORE语句,如下所示: ``` <insert id="insertUser" parameterType="com.example.entity.User"> INSERT IGNORE INTO user(name, age) VALUES (#{name}, #{age}) </insert> ``` 2.2 使用ON DUPLICATE KEY UPDATE语句 在MySQL,还可以使用ON DUPLICATE KEY UPDATE语句来向表插入记录,如果遇到违反唯一性约束的情况,就会更新该记录,而不是抛出异常。因此,我们可以将MyBatis的插入语句改为ON DUPLICATE KEY UPDATE语句,如下所示: ``` <insert id="insertUser" parameterType="com.example.entity.User"> INSERT INTO user(name, age) VALUES (#{name}, #{age}) ON DUPLICATE KEY UPDATE age = #{age} </insert> ``` 其,ON DUPLICATE KEY UPDATE语句指定了更新操作的字段和值,这里我们只更新了年龄字段。 以上就是解决MyBatis插入唯一异常的两种方法,根据具体情况选择适合自己的方法即可。 ### 回答2: 在使用MyBatis进行插入操作时,可能会遇到插入唯一异常。该异常通常是由于数据库表的唯一约束导致的。 当我们向数据库表插入数据时,如果违反了唯一约束,数据库将抛出异常,表示插入失败。常见的唯一约束有主键约束、唯一索引等。 解决这个问题的方法有两种: 1. 在程序进行唯一性校验:在执行插入操作之前,可以先查询数据库是否已存在相同的数据。如果已存在,则不进行插入操作,避免了唯一异常的发生。这种方法比较消耗数据库资源,但可以保证数据的唯一性。 2. 使用数据库的"insert ignore"或"insert on duplicate key update"语句:这种方法是在插入操作时,使用特殊的语句来处理唯一异常。"insert ignore"语句会即使发生唯一异常,也不会抛出异常,而是直接忽略这条插入数据;"insert on duplicate key update"语句则是在发生唯一异常时,执行更新操作。这种方法相对较为简洁高效,但需要根据数据库的不同进行调整。 总结来说,解决MyBatis插入唯一异常的方法有多种,可以通过程序进行唯一性校验,或者使用特殊的数据库插入语句来处理。需要根据具体情况选择最合适的方法来解决唯一异常问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值