在Navicat创建关联表:
创建Student,Class实体类:
package com.zzx.model;
import java.io.Serializable;
import java.util.Date;
/**
* @auther ZhengZiXuan
* @date 2021/3/9 14:59
* @desc
*/
public class Student implements Serializable {
private Integer sid;
private String sname;
private Float score;
private Integer cid;
private Date sbirthday;
private Integer zid;
private Class aclass;
public Student(Integer sid, String sname, Float score, Integer cid, Date sbirthday, Integer zid, Class aclass) {
this.sid = sid;
this.sname = sname;
this.score = score;
this.cid = cid;
this.sbirthday = sbirthday;
this.zid = zid;
this.aclass = aclass;
}
public Student() {
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Float getScore() {
return score;
}
public void setScore(Float score) {
this.score = score;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public Date getSbirthday() {
return sbirthday;
}
public void setSbirthday(Date sbirthday) {
this.sbirthday = sbirthday;
}
public Integer getZid() {
return zid;
}
public void setZid(Integer zid) {
this.zid = zid;
}
public Class getAclass() {
return aclass;
}
public void setAclass(Class aclass) {
this.aclass = aclass;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", score=" + score +
", cid=" + cid +
", sbirthday=" + sbirthday +
", zid=" + zid +
", aclass=" + aclass +
'}';
}
}
package com.zzx.model;
/**
* @auther ZhengZiXuan
* @date 2021/3/9 15:03
* @desc
*/
public class Class {
private Integer cid;
private String cname;
private Student student;
public Class(Integer cid, String cname, Student student) {
this.cid = cid;
this.cname = cname;
this.student = student;
}
public Class() {
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Class{" +
"cid=" + cid +
", cname='" + cname + '\'' +
", student=" + student +
'}';
}
}
创建db.properties:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/dog
jdbc.username=root
jdbc.password=123456
创建sqlconfigtion.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>
<!--加载配置文件-->
<properties resource="db.properties"></properties>
<!--添加缓存-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<!--类型别名-->
<typeAliases>
<!--每个单独的类取别名-->
<!--<typeAlias type=""alias=""/>-->
<!--给包下的所有类起别名-->
<package name="com.zzx"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--第一种写法-加载包下指定是映射文件 -->
<!--<mapper resource="com/zzx/mapper/UserMapper.xml"/>-->
<!--第二种写法-加载包下的所有的映射文件 -->
<package name="com.zzx.mapper"/>
</mappers>
</configuration>
首先是常见的一对一:
需求:查询学生信息时关联查询学生所对应的班级信息:
首先在StudentMapper接口添加方法:
package com.zzx.mapper;
import com.zzx.model.Class;
import com.zzx.model.Student;
import com.zzx.model.User;
import org.apache.ibatis.annotations.Param;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @auther ZhengZiXuan
* @date 2021/3/8 11:41
* @desc
*/
public interface StudentMapper {
List<Student> findAll();
}
然后配置StudentMapp.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="com.zzx.mapper.StudentMapper">
<!--开启当前mapper的二级缓存
默认使用的是mybatis自己提供的缓存处理类perpetualcache-->
<cache></cache>
<!--关联查询表时需要使用resultMap-->
<resultMap id="student" type="Student">
<!--封装到自己的属性中-->
<!--id标签主要用于封装主键列-->
<!--column对应的是数据库的列名 property 对应的是封装类的属性名-->
<id column="sid" property="sid"/>
<result column="sname" property="sname"/>
<result column="score" property="score"/>
<result column="cid" property="cid"/>
<result column="sbirthday" property="sbirthday"/>
<result column="zid" property="zid"/>
<!--一对一使用到的标签-->
<!--property="aclass" 中的aclass对应的是Student表中Class属性的属性名
javaType="Class" 中的Class对应的是封装类的Class类-->
<association property="aclass" javaType="Class">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
</association>
</resultMap>
<!--resultMap="student"中的sudent对应的是封装结果集中的id-->
<select id="findAll" resultMap="student">
select s.*,c.cname from student s left join `class` c on s.cid = c.cid
</select>
</mapper>
最后创建实体类测试代码:
package com.zzx.test;
import com.zzx.mapper.StudentMapper;
import com.zzx.model.Class;
import com.zzx.model.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @auther ZhengZiXuan
* @date 2021/3/9 15:21
* @desc
*/
public class MainClass1 {
private SqlSession sqlSession = null;
@Before
public void beforTest() throws IOException {
String path = "sqlconfigtion.xml";
// 1 加载配置文件
InputStream stream = Resources.getResourceAsStream(path);
// 2 通过配置文件,创建sqlsession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder( ).build(stream);
// 3 创建出sqlsession
sqlSession = sqlSessionFactory.openSession( );
}
@Test
public void findAll(){
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> all = studentMapper.findAll();
for (Student s : all){
System.out.println(s);
}
}
@After
public void afterTest(){
//关闭会话
sqlSession.close();
}
}
然后是一对多:
需求:查询班级信息,一并查询出班级所关联的学生信息;
1.首先在StudentMapper接口添加方法:
package com.zzx.mapper;
import com.zzx.model.Class;
import com.zzx.model.Student;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @auther ZhengZiXuan
* @date 2021/3/8 11:41
* @desc
*/
public interface StudentMapper {
List<Class> findAlls();
}
2.然后配置StudentMapp.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="com.zzx.mapper.StudentMapper">
<!--一对多写法-->
<resultMap id="classs" type="Class">
<result column="cid" property="cid"/>
<result column="cname" property="cname"/>
<!--property="student" 中student对应的是class中Student 的类名
ofType="Student" 中的Student对应的是实体类Stduent类的类名-->
<collection property="student" ofType="Student">
<id column="sid" property="sid"/>
<result column="sname" property="sname"/>
<result column="score" property="score"/>
<result column="cid" property="cid"/>
<result column="sbirthday" property="sbirthday"/>
<result column="zid" property="zid"/>
</collection>
</resultMap>
<select id="findAlls" resultMap="classs">
select s.*,c.cname from `student` s right join `class` c on s.cid = c.cid
</select>
</mapper>
3.最后创建实体类测试代码:
package com.zzx.test;
import com.zzx.mapper.StudentMapper;
import com.zzx.model.Class;
import com.zzx.model.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @auther ZhengZiXuan
* @date 2021/3/9 15:21
* @desc
*/
public class MainClass1 {
private SqlSession sqlSession = null;
@Before
public void beforTest() throws IOException {
String path = "sqlconfigtion.xml";
// 1 加载配置文件
InputStream stream = Resources.getResourceAsStream(path);
// 2 通过配置文件,创建sqlsession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder( ).build(stream);
// 3 创建出sqlsession
sqlSession = sqlSessionFactory.openSession( );
}
@Test
public void findAlls(){
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Class> all = studentMapper.findAlls();
for (Class c : all){
System.out.println(c);
}
}
@After
public void afterTest(){
//关闭会话
sqlSession.close();
}