Mybatis學習筆記之多對一與一對多關係
阿新 • • 發佈:2018-12-08
Mybatis一對多關係
一、資料庫與資料表的建立
學生與班級是一對多的關係,首先建立一個學生表
create table tb_student( -> id int not null auto_increment, -> name varchar(10), -> sex bool default true, -> age int, -> address varchar(100), -> telphone varchar(100), -> classmateid int not null, -> primary key(id) -> );
新增學生資訊
insert into tb_student(name,age,address,telphone) values('張三丰',108,'武當山','13262183425');
insert into tb_student(name,age,address,telphone) values('張無忌',24,'光明頂','13423678543');
其次,建立班級表
create table tb_classmate( -> id int not null auto_increment, -> name varchar(20), -> primary key(id) -> );
新增測試資料
insert into tb_classmate(name) values('武功速成171班');
二、建立Java專案
1.配置資料庫連線資訊
1)mybatis-config.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="msqldatasource.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <!-- <mapper resource="com/sky/demo/dao/AccountMapper.xml" /> --> <package name="com.sky.dao"/> </mappers> </configuration>
資料庫連線資訊msqldatasource.properties內容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisstudy
username=root
password=123456
三、建立Java bean
1.Student.java內容如下
public class Student {
private int id;
private String name;
private boolean sex;
private int age;
private String address;
private String telphone;
private int classmateid;
private ClassMate classMate;
//省略其setter和getter方法
}
2.ClassMate.java內容如下:
public class ClassMate {
private int id;
private String name;
private List<Student> students;
//省略其setter和getter方法
}
四、建立資料訪問層
1.建立Student資料訪問層介面
package com.sky.dao;
import com.sky.bean.Student;
import java.util.List;
public interface StudentMapper {
/**
* 根據班級編號取得所有的學生資訊
* @param id 班級編號
* @return
*/
public List<Student> getStudentsByClassMateId(int id);
}
2.建立Student的SQL對映
<?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.sky.dao.StudentMapper">
<resultMap id="studentMap" type="com.sky.bean.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
<result column="address" property="address"/>
<result column="telphone" property="telphone"/>
</resultMap>
<select id="getStudentsByClassMateId" resultMap="studentMap">
select * from tb_student where classmateid = #{id}
</select>
</mapper>
3.建立ClassMate資料訪問層介面
package com.sky.dao;
import com.sky.bean.ClassMate;
public interface ClassMateMapper {
/**
* 根據班級id取得班級的資訊
* @param id 班級id
* @return 返回該班級的資訊
*/
public ClassMate getClassMateById(int id);
}
4.建立ClassMate的SQL對映
<?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.sky.dao.ClassMateMapper">
<resultMap id="classMateMap" type="com.sky.bean.ClassMate">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="students" column="id" ofType="Student"
select="com.sky.dao.StudentMapper.getStudentsByClassMateId">
</collection>
</resultMap>
<select id="getClassMateById" resultMap="classMateMap">
select * from tb_classmate where id = #{id}
</select>
</mapper>
此是一對多關係的實現,在ClassMate的對映中,
<collection property="students" column="id" ofType="Student"
select="com.sky.dao.StudentMapper.getStudentsByClassMateId">
</collection>
為取得學生表中的資訊,其中property的值與ClassMateMapper.java中的屬性名相同,column的值,因為取得學生資訊,是根據班級表的id資訊取得的,所以此處的值為 id,select的值,注意要寫全類名,否則,會找不到相應的對映資訊。
最後,執行結果如下:
package com.sky;
import com.sky.bean.ClassMate;
import com.sky.dao.ClassMateMapper;
import com.sky.util.DBUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class MyDemo1 {
public static void main(String[] args) {
SqlSession session=DBUtil.getSession();
ClassMateMapper mateMapper=session.getMapper(ClassMateMapper.class);
ClassMate classMate=mateMapper.getClassMateById(1);
System.out.println(classMate.toString());
}
}
ClassMate{id=1, name='武功速成171班', students=[Student{id=1, name='張三丰', sex=true, age=108, address='武當山', telphone='13262183425', classmateid=1, classMate=null}, Student{id=2, name='張無忌', sex=true, age=24, address='光明頂', telphone='13423678543', classmateid=1, classMate=null}]}
五、多對一的關係
1.修改Student的介面與對映檔案
package com.sky.dao;
import com.sky.bean.Student;
import java.util.List;
public interface StudentMapper {
/**
* 根據班級編號取得所有的學生資訊
* @param id 班級編號
* @return
*/
public List<Student> getStudentsByClassMateId(int id);
/**
* 根據學生編號取得學生資訊
* @param id 學生編號
* @return 學生資訊
*/
public Student getStudentById(int 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">
<mapper namespace="com.sky.dao.StudentMapper">
<resultMap id="studentMap" type="com.sky.bean.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="age" property="age"/>
<result column="address" property="address"/>
<result column="telphone" property="telphone"/>
<association property="classMate" column="classmateid"
select="com.sky.dao.ClassMateMapper.getClassMateById">
</association>
</resultMap>
<select id="getStudentsByClassMateId" resultMap="studentMap">
select * from tb_student where classmateid = #{id}
</select>
<select id="getStudentById" resultMap="studentMap">
select * from tb_student where id=#{id}
</select>
</mapper>
執行結果如下:
package com.sky;
import com.sky.bean.ClassMate;
import com.sky.bean.Student;
import com.sky.dao.ClassMateMapper;
import com.sky.dao.StudentMapper;
import com.sky.util.DBUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class MyDemo1 {
public static void main(String[] args) {
SqlSession session=DBUtil.getSession();
StudentMapper studentMapper=session.getMapper(StudentMapper.class);
Student stu=studentMapper.getStudentById(1);
ClassMate classMate=stu.getClassMate();
System.out.println(stu.getName()+"\t"+stu.getAge()+"\t"+stu.getAddress());
System.out.println(classMate.getName());
/*
ClassMateMapper mateMapper=session.getMapper(ClassMateMapper.class);
ClassMate classMate=mateMapper.getClassMateById(1);
System.out.println(classMate.toString());
*/
}
}
張三丰 108 武當山
武功速成171班