zoukankan      html  css  js  c++  java
  • 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());
        }
    }
  • 相关阅读:
    1063. Set Similarity
    A1047. Student List for Course
    A1039. Course List for Student
    最大公约数、素数、分数运算、超长整数计算总结
    A1024. Palindromic Number
    A1023. Have Fun with Numbers
    A1059. Prime Factors
    A1096. Consecutive Factors
    A1078. Hashing
    A1015. Reversible Primes
  • 原文地址:https://www.cnblogs.com/jiyukai/p/9458499.html
Copyright © 2011-2022 走看看