Mybatis一对一映射
一、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一对一映射的更多相关文章
- mybatis一对一映射配置详解
听说mybatis一对一有三种写法,今天我试了一下. 数据库表准备 为了偷懒,我直接就拿用户权限菜单里的菜单表和菜单与权限的中间表做实现,他们原来是多对多的关系,这边我假设这两张表是一对一. 表 g ...
- mybatis 一对一 映射实体类、嵌套查询
一对一 在SysUser 类中增加SysRole字段.1.sql语句将role.role_name映射到role.roleName上. 2.还可以在XML 映射文件中配置结果映射.<result ...
- mybatis 一对一映射
xml <mapper namespace="com.oracle.dao.one2oneDao"> <sql id="personColum" ...
- Mybatis一对一映射resultMap子标签中顺序问题
直接上图 鼠标点上红线出现如下提示 The content of element type "resultMap" must match "(constructor?, ...
- 【Mybatis高级映射】一对一映射、一对多映射、多对多映射
前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...
- mybatis高级映射(一对一,一对多)
mybatis高级映射 一对一关联映射 需求:查询订单信息,关联查询用户信息(一个订单对应一个用户) (1)通过resultType实现 sql语句: select orders.* , USER.u ...
- Mybatis输入输出映射_动态sql_关联关系(一对一、一对多、多对多)
Mybatis输入输出映射_动态sql_关联关系(一对一.一对多.多对多)输入输出映射parameterType完成输入映射parameterType可以传入的参数有,基本数据类型(根据id查询用户的 ...
- MyBatis高级查询 一对一映射
drop database if exists simple; create database simple; use simple; drop table if exists sys_user; c ...
- MyBatis从入门到精通(九):MyBatis高级结果映射之一对一映射
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中实现查 ...
随机推荐
- cesium入门1
本教程将获得所有技能水平的开发人员和他们的第一个铯应用程序运行. 验证Cesium在您的Web浏览器中工作的最简单的方法是单击此处运行Hello World示例 (打开一个新窗口).如果你看到像下面的 ...
- foreach使用
1. 读取记录while($row=mysql_fetch_array($result)){$record[]=array( 'title'=>$row['title'], 'body'= ...
- mysql的引擎myisam和innodb的区别
1. MYISAM和INNODB的不同?答:主要有以下几点区别: a)构造上的区别 MyISAM在磁盘上存储成三个文件,其中.frm文件存储表定义:.MYD (MYData)为数据文件:. ...
- cocos2d 中使用jni C++ 调用 Java 方法
1.简单数据类型样例 如果我们Java中有这么一个open的静态方法,它没有參数,有一个int的返回值.怎么在C++中调用它呢? package cb.CbCCBLE; public class Cb ...
- Android DOM解析XML示例程序
DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的.DOM比较符合人的思维模式,但是其对内存的消耗比较大. activity_main.xml < ...
- mac 特殊符号的操作
——快捷键符号对照表,Mac下的那些符号都代表哪些按键? 这期我们教大家认识符号. 在Mac的快捷键中经常会有一些符号,比如⌘.⌥.⇧.⌃等,而Mac下只有command键上有一个⌘的符号,而其他按键 ...
- Java环境变量中classpath是必须配置吗
设置环境变量在java 中需要设置三个环境变量(1.5之后不用再设置classpath了,但个人强烈建议继续设置以保证向下兼用问题)JDK安装完成之后我们来设置环境变量:右击“我的电脑”,选择“属性” ...
- c#图片生成png格式和原图不同
下面这种,会生成和原图类似的图片,png格式的图片该是空的地方仍旧是空的
- linux发布项目
1.右击项目 export --->war file 上传到linux服务器 2.解压 jiar -xvf xx.war 3.移动到 tomcat webapps文件中 4.启动tomcat 访 ...
- 简明 Vim 教程
学习 vim 并且其会成为你最后一个使用的文本编辑器.没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用. 我建议下面这四个步骤: 存活 感觉良好 觉得更好,更强,更快 使用VIM的超能力 ...