mysql多对多关键字_MyBatis 详解(一对一,一对多,多对多)

1、什么是MyBatis?

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

再给大家推荐一个比较好的mybatis学习网站:www.mybatis.cn

2、MyBatis 入门实例基于xml配置

①、创建MySQL数据库:mybatisDemo和表:person

create database mybatisDemo;

use mybatisDemo;

create table person(pid int primary key AUTO_INCREMENT, pname varchar(50), page int);

520ef763bc3b04a2132515f84728e3af.png

②、建立一个Java工程,并导入相应的jar包

5d3ca4451b33f8d5218b256bed783e0b.png

③、在 MyBatisDemo 工程中添加数据库配置文件 mybatis-configuration.xml

④、定义表所对应的实体类

012e18ce9267de4727c5bc1bb1887d8c.png

package com.ys.bean;

public class Person {

private int pid;

private String pname;

private int page;

public int getPid() {

return pid;

}

public void setPid(int pid) {

this.pid = pid;

}

public String getPname() {

return pname;

}

public void setPname(String pname) {

this.pname = pname;

}

public int getPage() {

return page;

}

public void setPage(int page) {

this.page = page;

}

@Override

public String toString() {

return "Person [pid=" + pid + ", pname=" + pname + ", page=" + page

+ "]";

}

}

⑤、定义操作 person 表的sql映射文件personMapper.xml

/p>

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

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

resultType="com.ys.bean.Person" parameterType="int">

select * from person where pid = #{pid}

select * from person

update person set pname=#{pname},page=#{page} where pid = #{pid}

insert into person(pid,pname,page) values(#{pid},#{pname},#{page})

delete from person where pid=#{pid}

⑥、向 mybatis-configuration.xml 配置文件中注册 personMapper.xml 文件

如下图所示:

15566f245d17501a615f2b2d47759505.png

⑦、创建测试类

package com.ys.test;

import java.io.InputStream;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.Before;

import org.junit.Test;

import com.ys.bean.Person;

public class MyBatisTest {

SqlSession session;

@Before

public void beforeLoadXML(){

//加载 mybatis 配置文件

InputStream inputStream = MyBatisTest.class.

getClassLoader().getResourceAsStream("mybatis-configuration.xml");

//构建sqlSession的工厂

SqlSessionFactory sqlSessionFactory =

new SqlSessionFactoryBuilder().build(inputStream);

//根据 sqlSessionFactory 产生 session

session = sqlSessionFactory.openSession();

}

//根据 pid 查询 person 表中的数据

@Test

public void testSelectById(){

//这个字符串有 personMapper.xml 文件中 两个部分构成

// 的 namespace 的值

// id 值

String statement = "com.ys.bean.personMapper"+".selectPersonById";

Person p = session.selectOne(statement, 1);

System.out.println(p);

session.close();

}

//查询person 表所有数据

@Test

public void testGetAllPerson(){

String statement = "com.ys.bean.personMapper.getAllPerson";

List listPerson = session.selectList(statement);

System.out.println(listPerson);

session.close();

}

//根据id更新数据

@Test

public void updateById(){

String statement = "com.ys.bean.personMapper.updatePersonById";

Person p = new Person();

p.setPid(1);

p.setPname("aaa");

p.setPage(11);

session.update(statement, p);

session.commit();

session.close();

}

//向 person 表插入一条数据

@Test

public void addPerson(){

String statement = "com.ys.bean.personMapper.addPerson";

Person p = new Person();

//由于我们设置了主键的自增长机制,故这里不需要手动设置 pid 的值

//p.setPid(1);

p.setPname("add");

p.setPage(11);

session.insert(statement, p);

session.commit();

session.close();

}

//根据 pid 删除person 表中的数据

@Test

public void deletePersonById(){

String statement = "com.ys.bean.personMapper.deletePersonById";

session.delete(statement, 1);

session.commit();

session.close();

}

}

3、MyBatis 入门实例注解配置

①、上面的前面四步都是一样的,但是第五步不一样,我们不需要创建 personMapper.xml 文件,首先在 src 目录下创建 personMapper.java 文件

bd7fad9f4e587662e71b44759f910c64.png

内容如下:

package com.ys.annocation;

import org.apache.ibatis.annotations.Delete;

import org.apache.ibatis.annotations.Insert;

import org.apache.ibatis.annotations.Select;

import org.apache.ibatis.annotations.Update;

import com.ys.bean.Person;

public interface PersonMapper {

@Insert("insert into person(pid,pname,page) values(#{pid},#{pname},#{page})")

public int add(Person person);

@Select("select * from person where pid = #{pid}")

public Person getPerson(int pid);

@Update("update person set pname=#{pname},page=#{page} where pid = #{pid}")

public int updatePerson(Person preson);

@Delete("delete from person where pid=#{pid}")

public int deletePerson(int pid);

}

②、向 mybatis-configuration.xml 配置文件中注册 personMapper.xml 文件

7515097a55c65f38a23dbc9555047320.png

③、编写测试类

@Test

public void testAnnocation(){

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

Person p = new Person();

p.setPid(7);

p.setPname("abc");

p.setPage(11);

//调用增加方法

mapper.add(p);

//调用查询方法

Person p1 = mapper.getPerson(3);

System.out.println(p1);

//调用更新方法

p.setPage(100);

mapper.updatePerson(p);

//调用删除方法

mapper.deletePerson(7);

session.commit();

session.close();

}

4、MyBatis 入门实例  一对一  基于xml配置

这里我们以老师和班级为例,假设一般班级只能拥有有一个老师,一个老师只能带一个班级。

①、创建实体类

4b3666db6ee8e305cdee835208c5a54d.png

Teacher.java

package one.to.one;

public class Teacher {

private int tid;

private String tname;

private Classes classes;

public int getTid() {

return tid;

}

public void setTid(int tid) {

this.tid = tid;

}

public String getTname() {

return tname;

}

public void setTname(String tname) {

this.tname = tname;

}

public Classes getClasses() {

return classes;

}

public void setClasses(Classes classes) {

this.classes = classes;

}

@Override

public String toString() {

return "Teacher [tid=" + tid + ", tname=" + tname + ", classes=" + classes + "]";

}

}

Classes.java

package one.to.one;

public class Classes {

private int cid;

private String cname;

private Teacher teacher;

public int getCid() {

return cid;

}

public void setCid(int cid) {

this.cid = cid;

}

public String getCname() {

return cname;

}

public void setCname(String cname) {

this.cname = cname;

}

public Teacher getTeacher() {

return teacher;

}

public void setTeacher(Teacher teacher) {

this.teacher = teacher;

}

@Override

public String toString() {

return "Classes [cid=" + cid + ", cname=" + cname + ", teacher=" + teacher + "]";

}

}

②、在数据库中根据实体类创建相应的数据表

③、定义操作 Classes 表的sql映射文件classesMapper.xml

/p>

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

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

select * from classes c ,teacher t

where c.tid=t.tid and c.tid=#{tid}

select * from teacher t,classes c

where t.cid = c.cid and t.cid=#{cid}

select * from classes c where c.cid = #{cid}

select tid tid,tname tname from teacher where tid=#{tid}

说明:我们这里一对一的关联操作,有两种方式:

1、使用嵌套结果映射来处理重复的联合结果的子集

2、通过执行另外一个SQL映射语句来返回预期的复杂类型

相关属性解释:

e6cdace79e8ce4117c665f852e91aff4.png

④、向 mybatis-configuration.xml 配置文件中注册 classesMapper.xml 文件

5dbad03c04318b9338d81b833d303a53.png

⑤、编写测试类

package one.to.one;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.Before;

import org.junit.Test;

import com.ys.test.MyBatisTest;

public class OneToOneTest {

SqlSession session;

@Before

public void beforeLoadXML(){

//加载 mybatis 配置文件

InputStream inputStream = MyBatisTest.class.

getClassLoader().getResourceAsStream("mybatis-configuration.xml");

//构建sqlSession的工厂

SqlSessionFactory sqlSessionFactory =

new SqlSessionFactoryBuilder().build(inputStream);

//根据 sqlSessionFactory 产生 session

session = sqlSessionFactory.openSession();

}

//一对一嵌套结果方式:根据教师id查询班级信息

@Test

public void testGetClasses(){

String statement = "one.to.one.classesMapper.getClasses";

Classes c = session.selectOne(statement, 1);

System.out.println(c);

}

//一对一嵌套结果方式:根据班级id查询教师信息

@Test

public void testGetTeacher(){

String statement = "one.to.one.classesMapper.getTeacher";

Teacher t = session.selectOne(statement, 1);

System.out.println(t);

}

//一对一嵌套查询方式:根据教师id查询班级信息

@Test

public void testGetClasses2(){

String statement = "one.to.one.classesMapper.getClasses2";

Classes c = session.selectOne(statement, 1);

System.out.println(c);

}

}

4、MyBatis 入门实例  一对多,多对一  基于xml配置

这里我们以班级和学生为例,一个班级里面对应多个学生,这是一对多;反过来,多个学生对应一个班级,这是多对一

①、建立学生和班级的实体类

Student.java

package one.to.many;

public class Student {

private int sid;

private String sname;

private Classes classes;

public int getSid() {

return sid;

}

public void setSid(int sid) {

this.sid = sid;

}

public String getSname() {

return sname;

}

public void setSname(String sname) {

this.sname = sname;

}

public Classes getClasses() {

return classes;

}

public void setClasses(Classes classes) {

this.classes = classes;

}

@Override

public String toString() {

return "Student [sid=" + sid + ", sname=" + sname + ", classes=" + classes + "]";

}

}

Classes.java

package one.to.many;

import java.util.Set;

public class Classes {

private int cid;

private String cname;

private Set students;

public int getCid() {

return cid;

}

public void setCid(int cid) {

this.cid = cid;

}

public String getCname() {

return cname;

}

public void setCname(String cname) {

this.cname = cname;

}

public Set getStudents() {

return students;

}

public void setStudents(Set students) {

this.students = students;

}

@Override

public String toString() {

return "Classes [cid=" + cid + ", cname=" + cname + ", students=" + students + "]";

}

}

②、在数据库中根据实体类创建相应的数据表

③、多对一:定义操作 Classes 表的sql映射文件classesMapper.xml

/p>

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

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

select * from classes c,student s where s.cid=c.cid and c.cid=#{cid}

④、一对多:定义操作 Student 表的sql映射文件studentMapper.xml

/p>

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

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

select * from classes c,student s where s.cid=c.cid and s.sid=#{sid}

⑤、向 mybatis-configuration.xml 配置文件中注册 classesMapper.xml 、studentMapper.xml文件

⑥、编写测试类

package one.to.many;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.Before;

import org.junit.Test;

import com.ys.test.MyBatisTest;

public class OneToManyTest {

SqlSession session;

@Before

public void beforeLoadXML(){

//加载 mybatis 配置文件

InputStream inputStream = MyBatisTest.class.

getClassLoader().getResourceAsStream("mybatis-configuration.xml");

//构建sqlSession的工厂

SqlSessionFactory sqlSessionFactory =

new SqlSessionFactoryBuilder().build(inputStream);

//根据 sqlSessionFactory 产生 session

session = sqlSessionFactory.openSession();

}

//一对多嵌套结果方式:根据班级id查询班级所有的学生信息

@Test

public void testGetClasses(){

String statement = "one.to.many.classesMapper.getClasses";

Classes c = session.selectOne(statement, 1);

System.out.println(c);

System.out.println(c.getStudents().size());

}

//多对一嵌套结果方式:根据学生id查询班级信息

@Test

public void testGetStudents(){

String statement = "many.to.one.studentMapper.getStudents";

Student s = session.selectOne(statement, 1);

System.out.println(s);

System.out.println(s.getClasses());

}

}

5、MyBatis 入门实例  多对多  基于xml配置

这里我们以 users 表和 groups 表为例,一个 users 可能加入多个 groups,而一个 groups 可能包含多个 users,故构成 多对多 的关联

①、在数据库中建立相应的表

users 表

fb67557407b6c8e7ace1ab663d4c7cb2.png

groups 表

c18800d07deb7449aad90f6854037d82.png

两者之间的关联表users_groups表

9d70e594a526dfaaad13afe26381924a.png

②、建立对应的实体类

Users.java

package many.to.many;

import java.util.Set;

public class Users {

private int uid;

private String uname;

private Set groups;

public int getUid() {

return uid;

}

public void setUid(int uid) {

this.uid = uid;

}

public String getUname() {

return uname;

}

public void setUname(String uname) {

this.uname = uname;

}

public Set getGroups() {

return groups;

}

public void setGroups(Set groups) {

this.groups = groups;

}

@Override

public String toString() {

return "User [uid=" + uid + ", uname=" + uname + ", groups=" + groups + "]";

}

}

Groups.java

package many.to.many;

import java.util.Set;

public class Groups {

private int gid;

private String gname;

private Set users;

public int getGid() {

return gid;

}

public void setGid(int gid) {

this.gid = gid;

}

public String getGname() {

return gname;

}

public void setGname(String gname) {

this.gname = gname;

}

public Set getUsers() {

return users;

}

public void setUsers(Set users) {

this.users = users;

}

@Override

public String toString() {

return "Group [gid=" + gid + ", gname=" + gname + ", users=" + users + "]";

}

}

Users_Groups.java

package many.to.many;

public class Users_Groups {

private Users user;

private Groups group;

public Users getUser() {

return user;

}

public void setUser(Users user) {

this.user = user;

}

public Groups getGroup() {

return group;

}

public void setGroup(Groups group) {

this.group = group;

}

}

③、多对多:定义操作 sql映射文件userMapper.xml

/p>

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

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

select g.gid,g.gname from users_groups ug,groups g

where ug.group_id=g.gid and ug.user_id=#{uid}

⑤、向 mybatis-configuration.xml 配置文件中注册 userMapper.xml文件

⑥、编写测试类

//多对多:根据根据用户 id 查询所有的用户组信息

@Test

public void testGetGroups(){

String statement = "many.to.many.userMapper.getUsers";

List listGroup = session.selectList(statement,1);

for(Groups g : listGroup){

System.out.println(g.toString());

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值