1.什么是表之间映射关系

就是多张表进行关联,如果查询等操作不只是与一张表有关系,同时其他表也要进行操作。

2.数据库中的连接查询

表结构:

顾客表:customers                                                订单表:orders                                         员工表emps                                             

内连接:查询哪个顾客在订单中买的什么样水果的名称和价格

sql语句:

SELECT c.name,o.isbn,o.price FROM customers c INNER JOIN orders o on c.id=o.customers_id;

结果:

外连接之左外连接:通过顾客名称分组,查询每个顾客在订单中购买商品的数量

sql语句:

select c.name,count(o.isbn) from customers c LEFT OUTER JOIN orders o on c.id=o.customers_id GROUP BY c.name;

结果:

外连接之右外连接:通过顾客名称分组,查询每个顾客在订单中购买商品的数量

sql语句:

SELECT c.name,count(o.isbn) from orders o RIGHT OUTER JOIN customers c on o.customers_id=c.id GROUP BY c.name;

结果:

解释:和左外连接的结果是一样的,所以说左外连接和右外连接是差不多的,只是二者以哪个表为基准不同而已。

内自连接:求出员工表中AA的老板是EE

sql语句:

SELECT user.ename AS '员工',boss.ename AS '员工对应的上级' from emps user INNER JOIN emps boss on user.mgr=boss.empno;

结果:

外左自连接:求出员工表中AA的老板是EE

sql语句:

SELECT user.ename AS '员工',boss.ename AS '员工对应的上级' FROM emps user left OUTER JOIN emps boss on user.mgr=boss.empno;

结果:

外右自连接:求出员工表中AA的老板是EE

sql语句:

SELECT user.ename AS '员工',boss.ename AS '员工对应的上级' FROM emps boss RIGHT OUTER JOIN emps user on user.mgr=boss.empno;

结果:

3.Mybatis准备工作

导入jar包:

asm-3.3.1.jar 、cglib-2.2.2.jar 、commons-logging-1.1.1.jar 、log4j-1.2.16.jar 、mybatis-3.1.1.jar 、mysql-connector-java-5.1.26-bin.jar

日志文件:log4j.properties

log4j.rootLogger=debug,stdout,logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

数据库配置文件:db.properties

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/relation?characterEncoding=utf-8
mysql.username=root
mysql.password=

工具类:

public class MybatisUtil {private static ThreadLocal<SqlSession> threadLocal =new ThreadLocal<SqlSession>();private static SqlSessionFactory sqlSessionFactory;static{try {Reader reader =Resources.getResourceAsReader("mybatis.xml");sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();throw new RuntimeException(e);}}private MybatisUtil(){}public static SqlSession getSqlSession(){SqlSession sqlSession =threadLocal.get();if(sqlSession ==null){sqlSession =sqlSessionFactory.openSession();threadLocal.set(sqlSession);}return sqlSession;}public static void closeSqlSession(){SqlSession sqlSession =threadLocal.get();if(sqlSession !=null){sqlSession.close();threadLocal.remove();}}public static void main(String[] args) {Connection conn =MybatisUtil.getSqlSession().getConnection();System.out.println(conn !=null ?"连接成功":"连接失败");MybatisUtil.closeSqlSession();}
}

4.Mybatis实现一对一关系

需求就是:查询一个学生的学号、查询一个id号对应的学生

Mybatis总配置文件:

<?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><typeAliases><typeAlias type="cn.spy.model.Student" alias="Student"/><typeAlias type="cn.spy.model.Card" alias="Card"/></typeAliases><environments default="mysql_developer"><!-- mysql环境信息 --><environment id="mysql_developer"><!-- mybatis使用jdbc事务管理方式 --><transactionManager type="jdbc"></transactionManager><!-- mybatis使用连接池方式来获取连接 --><dataSource type="pooled"><!-- 配置与数据库交互的四个必要属性 --><property name="driver" value="${mysql.driver}"/><property name="url" value="${mysql.url}"/><property name="username" value="${mysql.username}"/><property name="password" value="${mysql.password}"/></dataSource></environment></environments><mappers><mapper resource="cn\spy\model\CardMapper.xml"/><mapper resource="cn\spy\model\StudentMapper.xml"/></mappers>
</configuration>

model模型及对应的mapper:

Student:

public class Student {private Integer id;private String name;private Card card;public Student(){}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Card getCard() {return card;}public void setCard(Card card) {this.card = card;}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", card=" + card + "]";}
}

StudentMapper.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="studentNamespace"><resultMap type="Student" id="studentMap"><id property="id" column="sid"/><result property="name" column="sname"/><!-- 引入CardMapper.xml文件中的映射信息 property表示Student类的关联属性resultMap表示引入 CardMapper.xml文件的映射类型--><association property="card" resultMap="cardNamespace.cardMap"></association></resultMap><select id="findById" parameterType="int" resultMap="studentMap">select * from students s inner join cards c on s.sid=c.cid and s.sid=#{id};</select><select id="findByName" parameterType="string" resultMap="studentMap">select * from students s inner join cards c on s.sid=c.cid and s.sname=#{name};</select>
</mapper>

Card:

public class Card {private Integer id;private String num;public Card(){}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getNum() {return num;}public void setNum(String num) {this.num = num;}@Overridepublic String toString() {return "Card [id=" + id + ", num=" + num + "]";}
}

CardMapper.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="cardNamespace"><resultMap type="Card" id="cardMap"><id property="id" column="cid"/><result property="num" column="cnum"/></resultMap>
</mapper>

dao实现类:

public class StudentCardDaoImpl implements IStudentCardDao{@Overridepublic Student findById(Integer id) throws Exception {SqlSession sqlSession =null;try{sqlSession =MybatisUtil.getSqlSession();return sqlSession.selectOne("studentNamespace.findById", id);}catch(Exception e){e.printStackTrace();throw e;}finally{MybatisUtil.closeSqlSession();}}@Overridepublic Student findByName(String name) throws Exception {SqlSession sqlSession =null;try{sqlSession =MybatisUtil.getSqlSession();return sqlSession.selectOne("studentNamespace.findByName", name);}catch(Exception e){e.printStackTrace();throw e;}finally{MybatisUtil.closeSqlSession();}}public static void main(String[] args) throws Exception {IStudentCardDao scd =new StudentCardDaoImpl();Student stu =scd.findByName("哈哈");System.out.println(stu);}
}

结果:

5.Mybatis实现一对多关系

需求:就是一个学生在哪个班级,哪个方向班级里又有哪些学生

Mybatis总配置文件:

<?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><typeAliases><typeAlias type="cn.spy.model.Student2" alias="Student2"/><typeAlias type="cn.spy.model.Grade" alias="Grade"/></typeAliases><environments default="mysql_developer"><!-- mysql环境信息 --><environment id="mysql_developer"><!-- mybatis使用jdbc事务管理方式 --><transactionManager type="jdbc"></transactionManager><!-- mybatis使用连接池方式来获取连接 --><dataSource type="pooled"><!-- 配置与数据库交互的四个必要属性 --><property name="driver" value="${mysql.driver}"/><property name="url" value="${mysql.url}"/><property name="username" value="${mysql.username}"/><property name="password" value="${mysql.password}"/></dataSource></environment></environments><mappers><mapper resource="cn\spy\model\GradeMapper.xml"/><mapper resource="cn\spy\model\Student2Mapper.xml"/></mappers>
</configuration>

model模型及对应的mapper

Student2类:

public class Student2 {private Integer id;private String name;private Grade grade;public Student2(){}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Grade getGrade() {return grade;}public void setGrade(Grade grade) {this.grade = grade;}@Overridepublic String toString() {return "Student2 [id=" + id + ", name=" + name + ", grade=" + grade+ "]";}
}

Student2Mapper.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="studentNamespace"><resultMap type="Student2" id="studentMap"><id property="id" column="sid"/><result property="name" column="sname"/><association property="grade" resultMap="gradeNamespace.gradeMap"></association></resultMap><select id="findAllByName" parameterType="string" resultMap="studentMap">select * from students2 s2 inner join grades g on s2.sgid=g.gid and g.gname=#{name}</select>
</mapper>

Grade类:

public class Grade {private Integer id;private String name;private List<Student2> list =new ArrayList<Student2>();public Grade(){}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Student2> getList() {return list;}public void setList(List<Student2> list) {this.list = list;}@Overridepublic String toString() {return "Grade [id=" + id + ", name=" + name + ", list=" + list + "]";}
}

GradeMapper.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="gradeNamespace"><resultMap type="Grade" id="gradeMap"><id property="id" column="gid"/><result property="name" column="gname"/></resultMap><select id="findGradeByName" parameterType="string" resultMap="gradeMap">select * from students2 s2 inner join grades g on s2.sgid=g.gid and s2.sname=#{name}</select></mapper>

dao实现类:

public class StudentGradeDaoImpl implements IStudentGradeDao{/*功能:查询学软件工程的人有哪些* name表示学科名*/@Overridepublic List<Student2> findAllByName(String name) throws Exception {SqlSession sqlSession =null;try{sqlSession =MybatisUtil.getSqlSession();return sqlSession.selectList("studentNamespace.findAllByName", name);}catch(Exception e){e.printStackTrace();throw e;}finally{MybatisUtil.closeSqlSession();}}/** 查询张三是属于哪个方向的* * */public Grade findGradeByName(String name) throws Exception{SqlSession sqlSession =null;try{sqlSession =MybatisUtil.getSqlSession();return sqlSession.selectOne("gradeNamespace.findGradeByName", name);}catch(Exception e){e.printStackTrace();throw e;}finally{MybatisUtil.closeSqlSession();}}public static void main(String[] args) throws Exception {IStudentGradeDao sgd =new StudentGradeDaoImpl();
//      List<Student2> list =sgd.findAllByName("软件工程");
//      for(Student2 student2 :list){
//          System.out.println(student2);
//      }Grade grade =sgd.findGradeByName("张三");System.out.println(grade);}}

6.Mybatis实现多对多关系

需求:一个学生选修了多个课程、一个课程被多个学生选修了。

Mybatis总配置文件:

<?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="lazyLoadingEnabled" value="true"/><!-- 按需加载 --><setting name="aggressiveLazyLoading" value="false"/></settings><typeAliases><typeAlias type="cn.spy.model.Student3" alias="Student3"/><typeAlias type="cn.spy.model.Course" alias="Course"/></typeAliases><environments default="mysql_developer"><!-- mysql环境信息 --><environment id="mysql_developer"><!-- mybatis使用jdbc事务管理方式 --><transactionManager type="jdbc"></transactionManager><!-- mybatis使用连接池方式来获取连接 --><dataSource type="pooled"><!-- 配置与数据库交互的四个必要属性 --><property name="driver" value="${mysql.driver}"/><property name="url" value="${mysql.url}"/><property name="username" value="${mysql.username}"/><property name="password" value="${mysql.password}"/></dataSource></environment></environments><mappers><mapper resource="cn\spy\model\CourseMapper.xml"/><mapper resource="cn\spy\model\Student3Mapper.xml"/></mappers>
</configuration>

Student3类:

public class Student3 {private Integer id;private String name;private List<Course> courseList =new ArrayList<Course>();public Student3(){}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Course> getCourseList() {return courseList;}public void setCourseList(List<Course> courseList) {this.courseList = courseList;}@Overridepublic String toString() {return "Student3 [id=" + id + ", name=" + name + ", courseList="+ courseList + "]";}
}

Student3Mapper.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="studentNamespace"><resultMap type="Student3" id="studentMap"><id property="id" column="sid"/><result property="name" column="sname"/></resultMap><select id="findStudent3ByName" parameterType="string" resultMap="studentMap">select s3.sid,s3.sname from students3 s3 inner join middles m on s3.sid= m.msid inner join courses c on c.cid=m.mcid and c.cname=#{name};</select>
</mapper>

Course类:

public class Course {private Integer id;private String name;private List<Student3> student3List =new ArrayList<Student3>();public Course(){}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Student3> getStudent3List() {return student3List;}public void setStudent3List(List<Student3> student3List) {this.student3List = student3List;}@Overridepublic String toString() {return "Course [id=" + id + ", name=" + name + ", student3List="+ student3List + "]";}
}

CourseMapper.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="courseNamespace"><resultMap type="Course" id="courseMap"><id property="id" column="cid"/><result property="name" column="cname"/></resultMap><select id="findCourseByName" parameterType="string" resultMap="courseMap"> select * from students3 s3 inner join middles m on s3.sid=m.msid inner join courses c on m.mcid=c.cid and s3.sname=#{name};</select>
</mapper>

dao实现类:

public class StudentCourseDaoImpl implements IStudentCourseDao{public static void main(String[] args) throws Exception {IStudentCourseDao scd =new StudentCourseDaoImpl();
//      List<Course> list =scd.findCourseByName("张三");
//      for(Course course :list){
//          System.out.println(course);
//      }List<Student3> list =scd.findStudent3ByName("软件工程");for(Student3 student3 :list){System.out.println(student3);}}//通过学生名,查看其选学了哪些课程@Overridepublic List<Course> findCourseByName(String name) throws Exception {SqlSession sqlSession =null;try{sqlSession =MybatisUtil.getSqlSession();return sqlSession.selectList("courseNamespace.findCourseByName",name);}catch(Exception e){e.printStackTrace();throw e;}finally{MybatisUtil.closeSqlSession();}}//通过课程名,查看有哪些学生选择学习该课程@Overridepublic List<Student3> findStudent3ByName(String name) throws Exception {SqlSession sqlSession =null;try{sqlSession =MybatisUtil.getSqlSession();return sqlSession.selectList("studentNamespace.findStudent3ByName", name);}catch(Exception e){e.printStackTrace();throw e;}finally{MybatisUtil.closeSqlSession();}}
}

结果:

解释:

多对多其实就是将两个表之间再创建一个中间转换表,现在就三个表,让两个表与中间表形成一对多的关系,多对多就可以转化为两个一对多的关系了。

Mybatis之表之间映射关系总结相关推荐

  1. mysql表和表的关系_mysql表与表之间建关系

    2.浪费硬盘空间 3.扩展性极差 上述的弊端产生原因类似于把代码全部写在一个py文件中,应该怎么做?  >> 解耦合! 将上述两张表拆成员工的部门两张表 分析表数据之间的关系:多个员工对应 ...

  2. MySQL如何找到表与表之间的关系?

    如何找到两张表之间的关系? 先站在左表的角度上去找,如果可以找到左表的多个字段可以对应右表的一个字段,那么左表的一个字段foregin key右表的一个字段.一般情况下为id... 2.如果右表的多个 ...

  3. mysql表一对多关系,mysql表与表之间的关系(多对多,一对多)

    #创建数据库 CREATE DATABASE day15; #使用 USE day15; #创建表 CREATE TABLE test1( id INT PRIMARY KEY AUTO_INCREM ...

  4. 第一阶段:前端开发_Mysql——表与表之间的关系

    2018-06-26 表与表之间的关系 一.一对多关系: 常见实例:分类和商品,部门和员工 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的一方 二.多对多关系 常见实例:学 ...

  5. mysql无关子查询_mysql中相关,无关子查询,表与表之间的关系以及编码和乱码的解决...

    ※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样) SHOW VARIABLES; //查看系统变量 //查询字符编码相关的系统变量 SHOW VARIABLES WHERE ...

  6. mysql表的级联操作_mysql表之间的关系及级联操作

    表之间的关系 foreign key 外键约束,用于指向另一个表的主键字段 # 创建表的时候添加外键 create table teacher( id int primary key auto_inc ...

  7. mysql 建表覆盖原先表_mysql表与表之间建关系

    一对多 定义一张部门员工表 id name gender dep_name dep_desc 1 yzy male 教学部 教书育人 2 yolo male 外交部 形象大使 3 zmm female ...

  8. 第三天,编码设置,主键设置与删除,无关子查询,相关子查询,表与表之间的关系...

    ※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样) SHOW VARIABLES; //查看系统变量 //查询字符编码相关的系统变量 SHOW VARIABLES WHERE ...

  9. mysql建立表间键关系,MySQL外键(表与表之间的关系)

    外键:用来建立两张表之间的关系 键语法:foreign key(当前表中建立观念西的外键字段)references 被关联表名(id)三种表与表之间的关系一对多 多对多 一对一 研究表与表之间的关系如 ...

最新文章

  1. 82年 AI程序员征婚启示火了!年薪百万,女生神回复
  2. 【数据库】Kingbase金仓数据库工程维护简明手册
  3. 【2008】奥运门票4月15日开始预定 四种购买方式供选
  4. 笔记-信息系统安全管理-信息安全保障系统
  5. python嗅探网页视频_网络嗅探python
  6. apache fop_Apache FOP与Eclipse和OSGi的集成
  7. matlab if 中的等于符号,if 嵌套里的逻辑选择语句出现符号函数不能向逻辑运算转换...
  8. 【转】No JVM could be found on your system解决方法
  9. 用户界面设计参考 (ZT)
  10. asp.net—单例模式
  11. python训练Faster RCNNC++调用训练好的模型进行物体检测-基于opencv3.4.3(超详细)
  12. socket编程学习笔记:关于TCP Test Tool的安装和使用
  13. C语言程序设计的课程目标,《C语言程序设计》课程标准
  14. wps垂直居中快捷键_wps文字如何上下居中
  15. 倪光南回应方舟CPU失败论,企业失败不等于技术失败
  16. ONF(Open Networking Foundation)
  17. 关于通过前端xslx解析excel日期少一天原因
  18. 最厉害的面试技巧都有哪些?
  19. chrome frame节点 取_爬虫3-下(利用Selenium + Chrome Driver模拟用户操作浏览器)
  20. 数据库文件.mdf太大的解决方法

热门文章

  1. html div自适应布局,css两个div自适应宽度布局方法大全(精华)
  2. spring注解日志
  3. baocms伪静态_最新BAOCMS 6.2本地O2O生活门户系统多城市完整版源码下载 贴吧圈子+缴费服务+政务活动+微信等...
  4. Python 3 教程(二)
  5. 合并 多个pdf文件_如何在多个子文件夹中合并合并PDF文件
  6. 如何有效建设企业薪酬管理体系?
  7. 全局与成员函数做友元(学自王桂林)
  8. Eclipse 简介和插件开发天气预报
  9. openedx学习笔记
  10. MATLAB马尔科夫决策过程遗传,科学网—【RL系列】马尔可夫决策过程与动态编程笔记 - 管金昱的博文...