美文网首页
原生一对一 关联表查询

原生一对一 关联表查询

作者: _FireFly_ | 来源:发表于2020-11-13 09:15 被阅读0次

    IDCard

    package domain;
    
    public class IDCard {
    
        //自有属性
        private String cardid;
        private String address;
        //为了根据身份证号查询 身份证和人的信息
        //多添加一个关联属性
        private Person person;
    
        public IDCard() {}
        public IDCard(String cardid, String address, Person person) {
            this.cardid = cardid;
            this.address = address;
            this.person = person;
        }
    
        @Override
        public String toString() {
            return "IDCard{" +
                    "cardid='" + cardid + '\'' +
                    ", address='" + address + '\'' +
                    ", person=" + person +
                    '}';
        }
    
        public String getCardid() {
            return cardid;
        }
        public void setCardid(String cardid) {
            this.cardid = cardid;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        public Person getPerson() {
            return person;
        }
        public void setPerson(Person person) {
            this.person = person;
        }
    
    }
    
    

    Person

    package domain;
    
    public class Person {
    
        //自有属性
        private Integer pid;
        private String pname;
        //关联属性 身份证号(身份证对象中的一个属性)
        private IDCard idcard;
    
        public Person() {}
        public Person(Integer pid, String pname, IDCard idcard) {
            this.pid = pid;
            this.pname = pname;
            this.idcard = idcard;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "pid=" + pid +
                    ", pname='" + pname + '\'' +
                    ", idcard=" + idcard +
                    '}';
        }
    
        public Integer getPid() {
            return pid;
        }
        public void setPid(Integer pid) {
            this.pid = pid;
        }
        public String getPname() {
            return pname;
        }
        public void setPname(String pname) {
            this.pname = pname;
        }
        public IDCard getIdcard() {
            return idcard;
        }
        public void setIdcard(IDCard idcard) {
            this.idcard = idcard;
        }
    
    }
    
    

    IDCardDao

    public class IDCardDao {
    
        private SqlSession sqlSession = MyUtil.getSqlSession(true);
    
        //根据身份证号 查询人+身份证信息
        public IDCard selectOne(String cardid){
            return sqlSession.selectOne("selectOne",cardid);
        }
        //全部信息查询
        public List<IDCard> selectAll(){
            return sqlSession.selectList("selectAll");
        }
    }
    

    PersonDao

    package dao;
    
    import domain.Person;
    import org.apache.ibatis.session.SqlSession;
    import util.MyUtil;
    
    import java.util.List;
    
    public class PersonDao {
    
        private SqlSession sqlSession = MyUtil.getSqlSession(true);
    
        //设计一个方法 根据一个人的pid 查询人+身份证的所有信息
        public Person selectOne(Integer pid){
            return sqlSession.selectOne("selectOne",pid);
        }
        //设计一个方法 全部人员信息+人对应自己的身份证信息
        public List<Person> selectAll(){
            return sqlSession.selectList("selectAll");
        }
    }
    
    

    configuration.xml 是否开启缓存查询

    <?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>
        <settings>
            <!--开启延迟加载的机制 关联的对象可以延迟加载-->
            <setting name="lazyLoadingEnabled" value="true"/>
            <!--aggressive 攻击性 侵略性 关闭对象的侵略性 不用就不需要加载 用到了关联对象的任意属性 就加载-->
            <setting name="aggressiveLazyLoading" value="false"/>
        </settings>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"></property>
                    <property name="url" value="jdbc:mysql://localhost:3306/testmybatis?useSSL=false"></property>
                    <property name="username" value="root"></property>
                    <property name="password" value="root"></property>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <!--<mapper resource="mapper/PersonMapper.xml"></mapper>-->
            <mapper resource="mapper/IDCardMapper.xml"></mapper>
        </mappers>
    </configuration>
    

    PersonMapper.xml

    <?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">
    <mapper namespace="dao.PersonDao">
    
        <!--方案一 采用两次查询执行-->
        <!--自己定义一个赋值的规则  id是整个赋值规则的名字 -->
        <!--<resultMap id="selectPerson" type="domain.Person">-->
            <!--<id property="pid" column="pid"></id>-->
            <!--<result property="pname" column="pname"></result>-->
            <!--<association property="idcard" javaType="domain.IDCard" select="selectIDCardForPerson" column="cardid"></association>-->
        <!--</resultMap>-->
        <!--&lt;!&ndash;这个select标签是为了Person对象中的那个idcard属性再次查询用的&ndash;&gt;-->
        <!--<select id="selectIDCardForPerson" resultType="domain.IDCard">-->
            <!--select * from idcard where cardid = #{cardid}-->
        <!--</select>-->
    
        <!--方案二 以前学过的联合查询语句 等值连接 内链接 外连接-->
        <resultMap id="selectPerson" type="domain.Person">
            <id property="pid" column="pid"></id>
            <result property="pname" column="pname"></result>
            <association property="idcard" javaType="domain.IDCard">
                <id property="cardid" column="cardid"></id>
                <result property="address" column="address"></result>
            </association>
        </resultMap>
        <!--=======================================================================-->
        <!--dao调用的是下面这个标签对应的语句-->
        <select id="selectOne" resultMap="selectPerson">
            <!--方案二写法-->
            select p.pid,p.pname,i.cardid,i.address from person p inner join idcard i on p.cardid = i.cardid where p.pid = #{pid}
            <!--方案一写法-->
    --         select pid,pname,cardid from person where pid = #{pid}
        </select>
        <select id="selectAll" resultMap="selectPerson">
            <!--方案二写法-->
            select p.pid,p.pname,i.cardid,i.address from person p inner join idcard i on p.cardid = i.cardid
            <!--方案一写法-->
    --         select pid,pname,cardid from person
        </select>
    
    </mapper>
    

    IDCardMapper.xml

    <?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">
    <mapper namespace="dao.IDCardDao">
    
        <!--方案一 两次查询-->
        <!--<resultMap id="selectIDCard" type="domain.IDCard">-->
            <!--<id property="cardid" column="cardid"></id>-->
            <!--<result property="address" column="address"></result>-->
            <!--<association property="person" javaType="domain.Person" select="selectPerson" column="cardid"></association>-->
        <!--</resultMap>-->
        <!--<select id="selectPerson" resultType="domain.Person">-->
            <!--select * from person where cardid = #{cardid}-->
        <!--</select>-->
    
        <!--方案二 联合-->
        <resultMap id="selectIDCard" type="domain.IDCard">
            <id property="cardid" column="cardid"></id>
            <result property="address" column="address"></result>
            <association property="person" javaType="domain.Person">
                <id property="pid" column="pid"></id>
                <result property="pname" column="pname"></result>
            </association>
        </resultMap>
    
        <!--=============================================================-->
    
        <select id="selectOne" resultMap="selectIDCard">
            <!--方案一写法-->
    --         select * from idcard where cardid = #{cardid}
            <!--方案二写法-->
            select p.pid,p.pname,i.cardid,i.address from person p inner join idcard i on p.cardid = i.cardid where i.cardid = #{cardid}
        </select>
        <select id="selectAll" resultMap="selectIDCard">
            <!--方案一写法-->
    --         select * from idcard
            <!--方案二写法-->
            select p.pid,p.pname,i.cardid,i.address from person p inner join idcard i on p.cardid = i.cardid
        </select>
    
    </mapper>
    

    相关文章

      网友评论

          本文标题:原生一对一 关联表查询

          本文链接:https://www.haomeiwen.com/subject/gilavktx.html