mybatis多对一以及一对多实例

多对一实例如下:

一:数据库环境搭建:

USE mybatis;

CREATE  TABLE teacher(

id INT(10)   NOT NULL,

NAME  VARCHAR(30)  DEFAULT  NULL,

PRIMARY KEY  (id)

)ENGINE=INNODB   DEFAULT  CHARSET=UTF8;

INSERT INTO teacher(id,NAME)   VALUES(1,'张老师');

CREATE  TABLE   student(

id  INT(10)  NOT NULL,

NAME  VARCHAR(30)  DEFAULT   NULL,

tid INT(10) DEFAULT  NULL,

PRIMARY  KEY (id),

KEY fktid  (tid),

CONSTRAINT  fktid    FOREIGN  KEY (tid)   REFERENCES  teacher (id)

)ENGINE=INNODB   DEFAULT  CHARSET=UTF8;

INSERT INTO  student(id,NAME,tid) VALUES(1,'张飞','1');

INSERT INTO  student(id,NAME,tid) VALUES(2,'张一','1');

INSERT INTO  student(id,NAME,tid) VALUES(3,'张二','1');

INSERT INTO  student(id,NAME,tid) VALUES(4,'张三','1');

INSERT INTO  student(id,NAME,tid) VALUES(5,'张四','1');

二:编写两个表格的实体类(此处省略)

三:编写接口以及具体的xml文件(这里接口类省略)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"
>
<mapper namespace="com.zhang.dao.StudentMapper">

<!--  第一种  思路 :1查询所有学生
2根据查询出来的学生的tid,寻找对应的老师-->
<select id="getStudent" resultMap="StudentTeacher">

select * from student ;
</
select>
    <
resultMap id="StudentTeacher" type="Student">
        <
result property="id"  column="id"/>
        <
result property="name"  column="name"/>
<!--        复杂的属性,我们需要单独处理
对象:
assocation
集合:collection-->
       
<association property="teacher" column="tid" javaType="Teacher" select="getteacher"/>
       
    </
resultMap>
   
    <
select id="getteacher" resultType="Teacher">
        select * from teacher where id=#{id}
    </
select>

</
mapper>

按照结果嵌套处理:

<!--    第二种方式-->
  
<select id="getStudent2" resultMap="StudentTeacher2">
       select
s.id sid,s.name sname,t.name tname
      
from student s,teacher t
      
where s.tid=t.id;
   </
select>
    <
resultMap id="StudentTeacher2" type="Student">
        <
result property="id" column="sid"/>
        <
result property="name" column="sname"/>
        <
association property="teacher" javaType="Teacher">
            <
result property="name" column="tname"/>
        </
association>
    </
resultMap>

实例二:一对多

一:数据库

二:实体类

三:接口

四:具体的xml文件(有两个xml文件,)

student,xml文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.zhang.dao.StudentMapper">





<!--    第二种方式-->

   <select id="getStudent2" resultMap="StudentTeacher2">

       select s.id sid,s.name sname,t.name tname

       from student s,teacher t

       where s.tid=t.id;

   </select>

    <resultMap id="StudentTeacher2" type="Student">

        <result property="id" column="sid"/>

        <result property="name" column="sname"/>

        <association property="teacher" javaType="Teacher">

            <result property="name" column="tname"/>

        </association>

    </resultMap>





<!--    第一种

思路 :1查询所有学生

2根据查询出来的学生的tid,寻找对应的老师-->

<select id="getStudent" resultMap="StudentTeacher">



select * from student ;

</select>

    <resultMap id="StudentTeacher" type="Student">

        <result property="id"  column="id"/>

        <result property="name"  column="name"/>

<!--        复杂的属性,我们需要单独处理

对象:assocation

集合:collection-->

        <association property="teacher" column="tid" javaType="Teacher" select="getteacher"/>



    </resultMap>



    <select id="getteacher" resultType="Teacher">

        select * from teacher where id=#{id}

    </select>



</mapper>

teacher。xml文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.zhang.dao.TeacherMapper">



<!--    <select id="getTeacher" resultType="Teacher">-->

<!--        select * from  mybatis.teacher;-->

<!--    </select>-->





<!--    按结果嵌套查询-->

    <select id="getTeacher" resultMap="TeacherStudent">

        select s.id sid,s.name sname,t.name tname,t.id tid

        from  student s,teacher t

        where  s.tid=t.id and t.id=#{tid}

    </select>

    <resultMap id="TeacherStudent" type="Teacher">

        <result property="id"  column="tid"/>

        <result property="name"  column="tname"/>

<!--        复杂的属性需要单独处理,对象:assocation  集合:collection

JavaType=指定属性的类型,集合中的泛型信息,我们使用ofType获取-->

        <collection property="student" ofType="Student">

            <result property="id"  column="sid"/>

            <result property="name"  column="sname"/>

            <result property="tid"  column="tid"/>



        </collection>

    </resultMap>







</mapper>

小结:多对一:association(关联)

          一对多:collection(集合)

javaType :用来指定实体类中属性的类型

ofType:用来指定映射到list或者集合中的pojo类型,泛型中的约束类型。

核心文件中配置:

<mappers>

    <mapper class="com.zhang.dao.TeacherMapper"/>

    <mapper class="com.zhang.dao.StudentMapper"/>



</mappers>

动态SQL:指根据不同的条件生成不同的SQL语句。

实例如下:

一:环境搭建

CREATE TABLE blog(

id VARCHAR(50) NOT NULL  COMMENT '博客id',

title VARCHAR(100)  NOT NULL COMMENT '博客标题',

author VARCHAR(30)  NOT NULL COMMENT '博客作者',

create_time DATETIME  NOT NULL COMMENT '创建时间',

views INT(30) NOT NULL COMMENT '浏览量'

)ENGINE=INNODB DEFAULT CHARSET=utf8

二:实体类

public class Blog {

    private String id;

    private String title;

    private String author;

    private Date creatTime;

    private int views;



    public Blog() {

    }



    public Blog(String id, String title, String author, Date creatTime, int views) {

        this.id = id;

        this.title = title;

        this.author = author;

        this.creatTime = creatTime;

        this.views = views;

    }



    public String getId() {

        return id;

    }



    public void setId(String id) {

        this.id = id;

    }



    public String getTitle() {

        return title;

    }



    public void setTitle(String title) {

        this.title = title;

    }



    public String getAuthor() {

        return author;

    }



    public void setAuthor(String author) {

        this.author = author;

    }



    public Date getCreatTime() {

        return creatTime;

    }



    public void setCreatTime(Date creatTime) {

        this.creatTime = creatTime;

    }



    public int getViews() {

        return views;

    }



    public void setViews(int views) {

        this.views = views;

    }



    @Override

    public String toString() {

        return "Blog{" +

                "id='" + id + '\'' +

                ", title='" + title + '\'' +

                ", author='" + author + '\'' +

                ", creatTime=" + creatTime +

                ", views=" + views +

                '}';

    }

}

三:添加一个工具类(为了使id永不重复)

这个工具类的作用是,生成的序号不连续,是随机的。

UUID含义是通用唯一识别码 (Universally Unique Identifier),指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。换句话说能够在一定的范围内保证主键id的唯一性。

public class IDutils{

  public static String getID(){

return UUID.randomUUID().tuString().replaceAll(" -",“”);

}
@Test

public void test(){
sout(IDutils.getID());

}

 四:编写接口类以及xml文件(接口省略)

<insert id=addBolg  parameterType=blog>

insert into mybatis.blog(id,title)

values(#{id},#{title});

</insert>

五:测试类

public class Test{

//注意这个工具类(MybatisUtils)就不在这里面贴了

SqlSession session=MybatisUtils.getSession();

BlogMapper  mapper=session.getMapper(BlogMapper.class);

Blog blog=new Blog();

blog.setId(IDutil.genid());

blog.setTitle("我是如此优秀");

blog.setCreateTime(new Date());

mapper.addBlog(blog);

session.close();

}

补充几个知识点:

动态SQL之IF:

<select id='''  prameterType=''' resultTtpe=''''>

select * from mybatis.blog

<where>

<if test=title!=null">

title=#{title}

</if>

<if test=author!=null">

author=#{author}

</if>

<where>

动态SQL之choose:

<select id='''  prameterType=''' resultTtpe=''''>

select * from mybatis.blog

<where>

<choose>

<when test=title!=null">

title=#{title}

</when>

<when test=author!=null">

author=#{author}

</when>

<otherwise>

and view=#{view}

</otherwise>

</choose>

<where>

所谓的动态SQL,本质还是SQL语句,只是我们可以在SQL层面去执行一个逻辑代码。

这里添加一个小知识点:关于注解实现mybatis开发。如下

一:编写接口

二:添加注解

package com.zhang.dao;





import com.zhang.pojo.User;

import org.apache.ibatis.annotations.Param;

import org.apache.ibatis.annotations.Select;



import java.util.List;



public interface UserDao {

    @Select("select * from user")

    List<User>getUser();

//方法存在多个参数加上@param

    @Select("select  * from  user  where  id=#{id}")

    User  getuserid(@Param("id"int id);



}

这里上面参数对应的是注解后面的参数

测试类:

注意:我们必须要将接口注册绑定到我们的核心配置文件中

<mappers>
    <
mapper  class="com.zhang.dao.UserDao"/>
</
mappers>

关于缓存:

 

 一级缓存:

 二级缓存:

 

在核心配置文件中开启:

在当前xml文件中使用二级缓存:

文章结束!谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值