Mybatis之表之间映射关系总结
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之表之间映射关系总结相关推荐
- mysql表和表的关系_mysql表与表之间建关系
2.浪费硬盘空间 3.扩展性极差 上述的弊端产生原因类似于把代码全部写在一个py文件中,应该怎么做? >> 解耦合! 将上述两张表拆成员工的部门两张表 分析表数据之间的关系:多个员工对应 ...
- MySQL如何找到表与表之间的关系?
如何找到两张表之间的关系? 先站在左表的角度上去找,如果可以找到左表的多个字段可以对应右表的一个字段,那么左表的一个字段foregin key右表的一个字段.一般情况下为id... 2.如果右表的多个 ...
- mysql表一对多关系,mysql表与表之间的关系(多对多,一对多)
#创建数据库 CREATE DATABASE day15; #使用 USE day15; #创建表 CREATE TABLE test1( id INT PRIMARY KEY AUTO_INCREM ...
- 第一阶段:前端开发_Mysql——表与表之间的关系
2018-06-26 表与表之间的关系 一.一对多关系: 常见实例:分类和商品,部门和员工 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的一方 二.多对多关系 常见实例:学 ...
- mysql无关子查询_mysql中相关,无关子查询,表与表之间的关系以及编码和乱码的解决...
※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样) SHOW VARIABLES; //查看系统变量 //查询字符编码相关的系统变量 SHOW VARIABLES WHERE ...
- mysql表的级联操作_mysql表之间的关系及级联操作
表之间的关系 foreign key 外键约束,用于指向另一个表的主键字段 # 创建表的时候添加外键 create table teacher( id int primary key auto_inc ...
- mysql 建表覆盖原先表_mysql表与表之间建关系
一对多 定义一张部门员工表 id name gender dep_name dep_desc 1 yzy male 教学部 教书育人 2 yolo male 外交部 形象大使 3 zmm female ...
- 第三天,编码设置,主键设置与删除,无关子查询,相关子查询,表与表之间的关系...
※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样) SHOW VARIABLES; //查看系统变量 //查询字符编码相关的系统变量 SHOW VARIABLES WHERE ...
- mysql建立表间键关系,MySQL外键(表与表之间的关系)
外键:用来建立两张表之间的关系 键语法:foreign key(当前表中建立观念西的外键字段)references 被关联表名(id)三种表与表之间的关系一对多 多对多 一对一 研究表与表之间的关系如 ...
最新文章
- 82年 AI程序员征婚启示火了!年薪百万,女生神回复
- 【数据库】Kingbase金仓数据库工程维护简明手册
- 【2008】奥运门票4月15日开始预定 四种购买方式供选
- 笔记-信息系统安全管理-信息安全保障系统
- python嗅探网页视频_网络嗅探python
- apache fop_Apache FOP与Eclipse和OSGi的集成
- matlab if 中的等于符号,if 嵌套里的逻辑选择语句出现符号函数不能向逻辑运算转换...
- 【转】No JVM could be found on your system解决方法
- 用户界面设计参考 (ZT)
- asp.net—单例模式
- python训练Faster RCNNC++调用训练好的模型进行物体检测-基于opencv3.4.3(超详细)
- socket编程学习笔记:关于TCP Test Tool的安装和使用
- C语言程序设计的课程目标,《C语言程序设计》课程标准
- wps垂直居中快捷键_wps文字如何上下居中
- 倪光南回应方舟CPU失败论,企业失败不等于技术失败
- ONF(Open Networking Foundation)
- 关于通过前端xslx解析excel日期少一天原因
- 最厉害的面试技巧都有哪些?
- chrome frame节点 取_爬虫3-下(利用Selenium + Chrome Driver模拟用户操作浏览器)
- 数据库文件.mdf太大的解决方法
热门文章
- html div自适应布局,css两个div自适应宽度布局方法大全(精华)
- spring注解日志
- baocms伪静态_最新BAOCMS 6.2本地O2O生活门户系统多城市完整版源码下载 贴吧圈子+缴费服务+政务活动+微信等...
- Python 3 教程(二)
- 合并 多个pdf文件_如何在多个子文件夹中合并合并PDF文件
- 如何有效建设企业薪酬管理体系?
- 全局与成员函数做友元(学自王桂林)
- Eclipse 简介和插件开发天气预报
- openedx学习笔记
- MATLAB马尔科夫决策过程遗传,科学网—【RL系列】马尔可夫决策过程与动态编程笔记 - 管金昱的博文...