多对一实例如下:
一:数据库环境搭建:
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文件中使用二级缓存:
文章结束!谢谢