一、Mybatis一对一映射

  本例讲述使用mybatis开发过程中常见的一对一映射查询案例。只抽取关键代码和mapper文件中的关键sql和配置,详细的工程搭建和Mybatis详细的流程代码可参见《Mybatis入门和简单Demo》和《Mybatis的CRUD案例

  案例:根据一个学生id查询对应的唯一的身份证信息

  步骤1.建表脚本,创建身份证表cards和students,students字段cid(身份证id)作为cards字段id的外键

create table cards(
id int(5) primary key,
num varchar(20)
);
create table students(
id int(5) primary key,
name varchar(10),
cid int(5),
constraint cid_fk foreign key(cid) references cards(id)
);

insert into cards(id,num) values(2,'12345');
insert into students(id,name,cid) values(1,'cat',2);

  步骤2.构建身份证,学生信息实体类

package com.jyk.mybatis.oneByone;

public class Card {

    private int cid;            //身份证id
private String cnum; //身份证号码 public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCnum() {
return cnum;
}
public void setCnum(String cnum) {
this.cnum = cnum;
} }
package com.jyk.mybatis.oneByone;

public class Student {

    private int id;                //学生id
private String name; //学生姓名
private Card card; //身份证信息 public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Card getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
}

  步骤3.编写mapper文件,在CardMapper.xml中编写身份证信息和表字段的映射关系,在StudentMapper.xml中编写学生实体和表字段的映射关系,并编写好根据id查询身份证信息的SQL,并将mapper文件和对应实体类的别名加入mybatis.xml(mybatis.xml的描述见Mybatis系列第一篇博客)

  在Student实体中有一属性为Card对象,意为一个学生对应的完整身份证信息,此时在配置映射关系时,可使用<association property="card" resultMap="cardNamespace.cardMap"/>标签来引入,property为属性名,resultMap关联到对应实体类的mapper配置,用名称空间.id来表示。

<?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"> <!-- 名称空间namespace必须唯一 -->
<mapper namespace="studentNamespace"> <!--
resultMap标签:映射实体与表
type属性:实体全路径名
id属性:为实体与表的映射取一个唯一的编号
-->
<resultMap type="student" id="studentMap">
<!--
id标签:映射主键属性
result标签:映射非主键属性
property属性:实体属性名
column属性:表的字段名
-->
<id property="id" column="id"/>
<result property="name" column="name"/>
<association property="card" resultMap="cardNamespace.cardMap"/>
</resultMap> <!-- 根据学生id找到对应学生信息和身份证信息 -->
<select id="findById" parameterType="int" resultMap="studentMap">
select s.id,s.name,c.id as cid,c.num as cnum
from students s inner join cards c
on s.cid = c.id
and s.id = #{id}
</select>
</mapper>
<?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"> <!-- 名称空间namespace必须唯一 -->
<mapper namespace="cardNamespace"> <!--
resultMap标签:映射实体与表
type属性:实体全路径名
id属性:为实体与表的映射取一个唯一的编号
-->
<resultMap type="card" id="cardMap">
<!--
id标签:映射主键属性
result标签:映射非主键属性
property属性:实体属性名
column属性:表的字段名
-->
<id property="cid" column="cid"/>
<result property="cnum" column="cnum"/>
</resultMap>
</mapper>
<?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">
</properties> <!-- 设置类型别名 -->
<typeAliases>
<typeAlias type="com.jyk.mybatis.oneByone.Card" alias="card"/>
<typeAlias type="com.jyk.mybatis.oneByone.Student" alias="student"/>
</typeAliases> <!-- 设置一个默认的连接环境信息 -->
<environments default="mysql_env">
<!-- 连接环境信息,取一个唯一的编号 -->
<environment id="mysql_env">
<!-- mybatis使用的jdbc事务管理方式 -->
<transactionManager type="jdbc">
</transactionManager> <!-- mybatis使用连接池方式来获取链接 -->
<dataSource type="pooled">
<!-- 配置与数据库交互的四个属性 -->
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="com/jyk/mybatis/oneByone/StudentMapper.xml"/>
<mapper resource="com/jyk/mybatis/oneByone/CardMapper.xml"/>
</mappers> </configuration>

  步骤4.编写Java代码实现该一对一查询

package com.jyk.mybatis.oneByone;

import org.apache.ibatis.session.SqlSession;
import com.jyk.mybatis.util.MyBatisUtil; public class StudentDao { /*
* 根据ID查找
*/
public Student findById(int id)
{
SqlSession sqlSession = null;
try{
sqlSession = MyBatisUtil.getSqlSession();
Student stu = sqlSession.selectOne("studentNamespace.findById", id);
return stu;
}catch(Exception e){
e.printStackTrace();
throw e;
}finally{
MyBatisUtil.closeSqlSession();
}
} public static void main(String[] args) {
StudentDao sd = new StudentDao();
Student stu = sd.findById(1);
System.out.println("id=="+stu.getId());
System.out.println("name=="+stu.getName());
System.out.println("cid=="+stu.getCard().getCnum());
}
}

Mybatis一对一映射的更多相关文章

  1. mybatis一对一映射配置详解

    听说mybatis一对一有三种写法,今天我试了一下. 数据库表准备 为了偷懒,我直接就拿用户权限菜单里的菜单表和菜单与权限的中间表做实现,他们原来是多对多的关系,这边我假设这两张表是一对一. 表  g ...

  2. mybatis 一对一 映射实体类、嵌套查询

    一对一 在SysUser 类中增加SysRole字段.1.sql语句将role.role_name映射到role.roleName上. 2.还可以在XML 映射文件中配置结果映射.<result ...

  3. mybatis 一对一映射

    xml <mapper namespace="com.oracle.dao.one2oneDao"> <sql id="personColum" ...

  4. Mybatis一对一映射resultMap子标签中顺序问题

    直接上图 鼠标点上红线出现如下提示 The content of element type "resultMap" must match  "(constructor?, ...

  5. 【Mybatis高级映射】一对一映射、一对多映射、多对多映射

    前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...

  6. mybatis高级映射(一对一,一对多)

    mybatis高级映射 一对一关联映射 需求:查询订单信息,关联查询用户信息(一个订单对应一个用户) (1)通过resultType实现 sql语句: select orders.* , USER.u ...

  7. Mybatis输入输出映射_动态sql_关联关系(一对一、一对多、多对多)

    Mybatis输入输出映射_动态sql_关联关系(一对一.一对多.多对多)输入输出映射parameterType完成输入映射parameterType可以传入的参数有,基本数据类型(根据id查询用户的 ...

  8. MyBatis高级查询 一对一映射

    drop database if exists simple; create database simple; use simple; drop table if exists sys_user; c ...

  9. MyBatis从入门到精通(九):MyBatis高级结果映射之一对一映射

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中实现查 ...

随机推荐

  1. c语言常用数据类型转换整理

    你要发送原始数据流 还是 格式化输出? 如果是格式化 按原子说的 ,用sprintf / printf; 如果发送原始内存数据流, 可按下面发送, 发送 #define BYTE0(pointer) ...

  2. “浪潮杯”山东省第五届ACM大学生程序设计竞赛(总结贴)

    第一次參加省赛有点小激动,尽管是作为打星队參赛,但心情却是上下起伏. 5月9号晚上11点多到威海,有点略冷.可是空气比淄博好多了,大家到了旅馆的时候都非常晚了,抱怨了一下三星级的酒店的待遇,喝杯咖啡早 ...

  3. oracle数据库字符集

    Oracle字符集的基本原理 1. Oracle服务器字符集 oracle以哪种字符编码存储字符,可以通过以下语句查出数据库字符集的设置. 方法1 SQL> select * from v$nl ...

  4. 复习前面一个月的学习C#感觉道路好艰难啊

    今天是复习前面学习的内容,感觉这一个月来真的学习了很多,但是掌握的不好,好多都是在老师讲完课后做起来练习感觉这知识用起来蛮轻松地,但是经过昨天和今天的复习发现好多还是给忘记啦,甚是失落啊,刚开始就知道 ...

  5. Nginx遇上Access Denied提示怎么解决

    这几天在摆弄linux下面的各种服务器,对nginx非常有兴趣. 于是把phpmyadmin传上去了,先是phpmyadmin配了半天,结果配好之后发现phpmyadmin一些logo.css.js文 ...

  6. ios Instruments 内存泄露

    本文转载至 http://my.oschina.net/sunqichao/blog?disp=2&p=3 虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是 ...

  7. $.post和jquerySubmit返回json数据获取的区别

    $.post("/patrol/patrolDataContent!deleteContent.action",{"ids":ids},function(dat ...

  8. vux 局部注册组件

    在home.vue里面,引入Prop.vue组件: 其中 <child :message="msg"></child>的时候 是这么赋值的: data () ...

  9. 报错 ERROR in static/js/vendor.b3f56e9e0cd56988d890.js from UglifyJs

    开发vux项目在引入 // 表单验证组件-start import zh_CN from 'vee-validate/dist/locale/zh_CN' import Validator from ...

  10. 生命游戏/Game of Life的Java实现

    首先简单介绍一下<生命游戏> 生命游戏其实是一个零玩家游戏.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死 ...