pom.xml
<!-- 统一版本管理 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.junit>4.12</project.junit>
<project.mybatis>3.4.6</project.mybatis>
<project.jdbc.connector>8.0.11</project.jdbc.connector>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>${project.junit}</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${project.mybatis}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${project.jdbc.connector}</version>
</dependency>
</dependencies>
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>
<!-- 为java类型起别名,在配置文件中就可以使用别名 目的:书写简单方便-->
<typeAliases>
<typeAlias type="com.xalo.model.Student" alias="Student"/>
</typeAliases>
<!--调用log4j 打印sql语句 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 数据库环境配置,一个环境对应一个数据库,将来和spring整合之后,就不在配置-->
<environments default="development">
<environment id="development">
<!-- 事物类型配置 JDBC:使用JDBC的事物管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源的配置 POOLED:使用mybatis默认的数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!-- useSSL=false: 是否使用加密 -->
<property name="url" value="jdbc:mysql://localhost:3306/mb?useUnicode=true&characterEncoding=UTF8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="12345678"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件的导入 -->
<mappers>
<!-- 1.接口必须和映射文件必须在同一个包下
2.接口名和映射文件名必须一致
-->
<package name="com/xalo/dao"/>
</mappers>
</configuration>
(1)一对多
创建一张老师表(一方)和一张学生表(多方).
<1>老师实体类:
1.定义变量:
2.和学生关联的属性: List<Student> student;
3.提供无参有参的构造方法,setter和getter方法,重写toString()方法
<2>学生实体类:
1.定义变量:
2.和老师关联的属性: private Teacher teacher;
3.提供无参有参的构造方法,setter和getter方法,重写toString()方法
<3>在Mysql中建库建表,以及插入数据
(1)建库:
create database if not exists mb character set utf8 collate utf8_general_ci;
(2)建表
create table if not exists teacher
(tid Integer primary key auto_increment,
tname varchar(20),
cname varchar(25),
tphone varchar(11)) charset=utf8;
create table if not exists student
(sid Integer primary key auto_increment,
sname varchar(20),
sage Integer,
s_t_id Integer,
constraint student_teacher_foreign foreign key(s_t_id) references teacher(tid)) charset=utf8;
(3) 插入数据
insert into teacher (sname,cname,tphone) values('碧瑶','java',15235233333);
insert into student (cname,cage,s_t_id) values ('张小凡',20,1);
<4>创建接口跟映射文件(xml)
1.接口必须和映射文件在同一包
2.接口名和映射文件名最好一致
public interface TeacherDao{
//查询某个老师信息
public abstract Teacher queryTeacherById(Integer tid);
}
public interface StudentDao {
//查询某个学生信息
public abstract Student queryStudentById(Integer sId);
}
teacherDao.xml
<!--namespase: 需要写成接口的完成类名 + 包名-->
<mapper namespase="com.xalo.dao.TeacherDao">
<!--建立多表的关联-->
<resultMap type="com.xalo.entity.Teacher" id="teacherMap">
<!--teacher的属性映射文件-->
<id column="tid", property="tid"/>
<result column="tname", property="tname"/>
<result column="cname", property="cname"/>
<result column="tphone", property="tphone"/>
<!--学生表的关联查询设置等同于设置teacher实体中的list集合
property:集合属性的名称 ofType: 集合中元素的类型-->
<collecation property="students" ofType="com.xalo.entity.Student">
<!--学生实体和查询出来的字段的匹配-->
<id column="sid" property="sid"/>
<result column="sname", property="sname"/>
<result column="sage", property="sage"/>
</collecation>
</resultMap>
<select id="queryTeacherById" parameterType="Integer" resultMap="teacherMap">
select
teacher.*,
student.sid,
studnet.sname,
student.sage
from
teacher,
student
where
teacher.tid=#{arg0}
and
teacher.tid = student.s_t_id;
</select>
</mapper>
studentDao.xml
<!-- namespase:需要写成接口的完整类名+包名 -->
<mapper namespace="com.xalo.dao.StudentDao">
<!-- 建立多表的关系 -->
<resultMap type="com.xalo.entity.Student" id="studentMap">
<!-- student的属性映射关系 -->
<id column="sid" property="sid" />
<result column="sname" property="sname" />
<result column="sage" property="sage" />
<association property="teacher" javaType="com.xalo.entity.Teacher">
<!--老师实体和查询出来的字段的匹配关系 -->
<result column="tid" property="tid"/>
<result column="tname" property="tname" />
<result column="cname" property="cname" />
<result column="tphone" property="tphone" />
</association>
</resultMap>
<select id="queryStudentById" parameterType="Integer" resultMap="studentMap">
select
teacher.*,
student.sid,
student.sname,
student.sage
from
teacher,
student
where
student.sid = #{arg0}
and
teacher.tid = student.s_t_id;
</select>
</mapper>
<5>测试
public class OneToManyTest{
@Before
public void before() throws Exception {
private SqlSessionFactory sf;
private SqlSession session;
//读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis_config.xml");
//加载配置文件并创建session工厂
sf = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws Exception {
//创建session对象
session = sf.openSession();
TeacherDao tDao = session.getMapper(TeacherDao.class);
Teacher teacher = tDao.queryTeacherById(1);
session.commit();
if (session != null) {
session.close();
}
System.out.println(teacher);
}
@After
public void after() throws Exception {
}
}
(2) 多对多
创建玩家跟英雄表
<1>玩家实体类
1.定义变量
2.和英雄相关联的属性 private List<Hero> heros;
3.提供无参有参方法,setter和getter方法,重写toString()方法
<2>英雄实体类
1.定义变量
2.和玩家相关联的属性 private List<Player> players;
3.提供无参有参方法,setter和getter方法,重写toString()方法
<3>在Mysql中建表,以及插入数据
1.建表
//建玩家表
create table if not exists player
(pid Integer key auto_increment,
pname varchar(20) ) charset=utf8;
//建英雄表
create table if not exists hero
(hid Integer key auto_increment,
hname varchar(25) )charset=utf8;
//建立中间表
create table if not exists p_h_rel
(rid Integer key auto_increment,
p_f_id Integer,
h_f_id Integer,
constraint player_rel_foreign foreign key(p_f_id)references player(pid),
constraint hero_rel_foreign foreign key(h_f_id) references hero (hid))charset=utf8;
2.插入数据
insert into player (pname) values('张三'),('李四');
insert into hero (hname) values('张小凡'),('碧瑶');
insert into p_h_rel (p_f_id, h_f_id) values (1,1),(1,2),(2,1),(2,2);
<4>创建接口跟映射文件(xml)
1.接口必须和映射文件在同一包
2.接口名和映射文件名最好一致
public interface PlayerDao {
public abstract Player queryPlayerById(Integer pid);
}
public interface HeroDao {
public abstract Hero queryHeroById(Integer hid);
}
playerDao.xml
<mapper namespace = "com.xalo.dao.PlayerDao">
<!--建立多表的关系-->
<resultMap type="com.xalo.entity.Player" id = "playerMap">
<id column = "pid" property = "pid"/>
<result column = "pname" property = "pname"/>
<collection property="heros" ofType="com.xalo.entity.Hero">
<id column="hid" property="hid" />
<result column="hname" property="hname" />
</collection>
</resultMap>
<select id="queryPlayerById" parameterType="Integer" resultMap="playerMap">
select
player.*,
hero.*
from
player,
hero,
p_h_rel
where
player.pid = #{arg0}
and
player.pid = p_h_rel.p_f_id
and
hero.hid = p_h_rel.h_f_id;
</select>
</mapper>
heroDao.xml
<mapper namespace="com.xalo.dao.HeroDao">
<!-- 建立多表的关系 -->
<resultMap type="com.xalo.entity.Hero" id="heroMap">
<id column="hid" property="hid" />
<result column="hname" property="hname" />
<collection property="players" ofType="com.xalo.entity.Player">
<!-- player实体和查询出来实体的匹配 -->
<id column="pid" property="pid" />
<result column="pname" property="pame" />
</collection>
</resultMap>
<select id="queryHeroById" parameterType="Integer" resultMap="heroMap">
select
player.*,
hero.*,
p_f_id
from
player,
hero,
p_h_rel
where
hero.pid = #{arg0}
and
player.pid = p_h_rel.p_f_id
and
hero.hid = p_h_rel.h_f_id;
</select>
</mapper>
<5>测试
public class ManyToManyTest {
private SqlSessionFactory sf;
private SqlSession session;
@Before
public void before() throws Exception {
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis_config.xml");
// 加载配置文件并创建session工厂
sf = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws Exception {
// 创建session对象
session = sf.openSession();
PlayerDao pDao = session.getMapper(PlayerDao.class);
Player player = pDao.queryPlayerById(1);
session.commit();
if (session != null) {
session.close();
}
System.out.println(player);
}
@After
public void after() throws Exception {
}
}
(3) 一对一
创建员工跟电脑表
<1>员工实体类
1.定义变量
2.和员工相关联的属性 private Computer computer;
3.提供无参有参的构造方法, setter和getter方法,toString()方法
<2>电脑实体类
1.定义变量
2.和电脑相关联的属性 private Employee employee;
3.提供无参有参的构造方法, setter和getter方法,toString()方法
<3>在Mysql中建表以及插入数据
1.建库
create table if not exists employee
(eid Integer primary key auto_increment,
ename varchar(20) ) charset = utf8;
//在表2中增加一个字段是表1的外键,并且加唯一约束
create table if not exists computer
(cid integer primary key auto_increment,
cname varchar(26),
c_e_id Integer unique, //建立约束
constraint computer_employee_foreign foreign key (c_e_id) references employee (eid))charset=utf8;
2.建表
insert into employee (ename) values ("周帅"),("碧瑶");
insert into computer (cname,c_e_id)values("联想",1),("苹果",2);
<4>创建接口跟映射文件(xml)
1.接口必须和映射文件在同一包
2.接口名和映射文件名最好一致
public interface EmployeeDao {
public abstract Employee queryEmployeeById(Integer eid);
}
public interface ComputerDao {
public abstract Computer queryComputerById(Integer cid);
}
employee.xml
<mapper namespace="com.xalo.dao.EmployeeDao">
<!-- 建立多表的关联 -->
<resultMap type="com.xalo.entity.Employee" id="employeeMap">
<id column="eid" property="eid"/>
<result column="ename" property="ename"/>
<association property="computer" javaType="com.xalo.entity.Computer">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
</association>
</resultMap>
<select id="queryEmployeeById" parameterType="Integer" resultMap="employeeMap">
select
employee.*,
computer.*
from
employee,
computer
where
employee.eid=#{arg0}
and
computer.c_e_id = employee.eid;
</select>
computer.xml
<mapper namespace="com.xalo.dao.ComputerDao">
<!-- 建立多表的关联 -->
<resultMap type="com.xalo.entity.Computer" id="computerMap">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
<association property="employee" javaType="com.xalo.entity.Employee">
<id column="eid" property="eid"/>
<result column="ename" property="ename"/>
</association>
</resultMap>
<select id="queryComputerById" parameterType="Integer" resultMap="computerMap">
select
employee.*,
computer.*
from
employee,
computer
where
computer.cid=#{arg0}
and
computer.c_e_id = employee.eid;
</select>
</mapper>
<5>测试
public class OneToOneTest {
private SqlSessionFactory sf;
private SqlSession session;
@Before
public void before() throws Exception {
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis_config.xml");
// 加载配置文件并创建session工厂
sf = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws Exception {
// 创建session对象
session = sf.openSession();
// EmployeeDao eDao = session.getMapper(EmployeeDao.class);
// Employee employee = eDao.queryEmployeeById(1);
ComputerDao cDao = session.getMapper(ComputerDao.class);
Computer computer = cDao.queryComputerById(1);
session.commit();
if (session != null) {
session.close();
}
// System.out.println(employee);
System.out.println(computer);
}
@After
public void after() throws Exception {
}
}