-
MyBatis的一对多关系的举例简单说明
2017-01-13 19:47:27以顾客(一)和订单(多)为例: 1.创建一个web项目,名字叫做oneToMany 2.导入mybatis所需的包mybatis-3.4.1.jar(以自己的版本为准) 3.配置myBatis的配置文件: 4.创建Customer类和...以顾客(一)和订单(多)为例:
1.创建一个web项目,名字叫做oneToMany
2.导入mybatis所需的包mybatis-3.4.1.jar(以自己的版本为准)
3.配置myBatis的配置文件:
4.创建Customer类和Order类
5.创建customer.xml文件和order.xml文件
-
Hibernate的关系映射-------多对一与一对多的实现举例
2011-12-08 21:34:08Hibernate的关系映射-------多对一与一对多的实现举例 此处以部门(Department)与部门员工(Employee)为例,显而易见department为一的一方,员工为多的一方。 Domain层的创建: Department类的实例化:...Hibernate的关系映射-------多对一与一对多的实现举例
此处以部门(Department)与部门员工(Employee)为例,显而易见department为一的一方,员工为多的一方。
Domain层的创建:
Department类的实例化:
public class Department {
private Integer id;
private String name;
privateSet<Employee> emps;
publicSet<Employee> getEmps() {
return emps;
}
public voidsetEmps(Set<Employee> emps) {
this.e配置文件的编写代码:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/HibernateConfiguration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="foo">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///demo</property>
<property name="hibernate.connection.username">root</property>
<property name="connection.password">123</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/hbsi/domain/Department.hbm.xml"/>
<mapping resource="com/hbsi/domain/Employee.hbm.xml"/> </session-factory>
</hibernate-configuration>
各个包的导入:
mps = emps;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(Stringname) {
this.name = name;
}
}
Department映射文件的创建:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hbsi.domain">
<class name="Department" table="department">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="emps">
<key column="depart_id"/><!-- 查找部门下所包含的员工,根据主外键查 -->
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>
Employee的实例化:
public class Employee {
private Integer id;
private String name;
private Department depart;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(Stringname) {
this.name = name;
}
public DepartmentgetDepart() {
return depart;
}
public voidsetDepart(Department depart) {
this.depart = depart;
}
}
Employee映射文件的创建:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hbsi.domain">
<class name="Employee" table="employee">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="depart"column="depart_id"/> 此处多对一的列必须要与上面set标签中key中coulmn中的相同
</class>
</hibernate-mapping>
配置文件的编写代码:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/HibernateConfiguration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="foo">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///demo</property>
<property name="hibernate.connection.username">root</property>
<property name="connection.password">123</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/hbsi/domain/Department.hbm.xml"/>
<mapping resource="com/hbsi/domain/Employee.hbm.xml"/> </session-factory>
</hibernate-configuration>
各个包的导入:
获取Session的工具类Util的编写:
public final class HibernateUtil {
private static SessionFactory sessionFactory;
private HibernateUtil(){
}
static{
Configuration cfg=new Configuration();
cfg.configure();
sessionFactory=cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession(){
return sessionFactory.openSession();
}
}
此处以插入方法实现一对多的测试类的编写:
//插入方法的实现
static Department add(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
//添加
Department dep=new Department();
dep.setName("departone");
Employee e1=new Employee();
e1.setName("Tom");
e1.setDepart(dep);//指定员工在哪个部门-----对象模型,对象建立关联关系
session.save(dep);
session.save(e1);
tx.commit();
return dep;
}finally{
if(session!=null){
session.close();
}
}
}
主函数的调用:
public static void main(String[] args) {
// TODO Auto-generatedmethod stub
add();
}
然后以查找的形式实现的多对一测试类的编写:
static Employee query(int empId){
Session session=null;
try{
session=HibernateUtil.getSession();
//查询的操作
Employee e=(Employee) session.get(Employee.class,empId);
System.out.println(e.getName()+" "+e.getDepart().getName());
return e;
}finally{
if(session!=null){
session.close();
}
}
}
主函数的调用:
public static void main(String[] args){
query(1);
}
-
【Mybatis用法】Mybatis框架中一对一,一对多association和collection的使用举例方法
2021-01-21 11:29:29association通常用来映射一对一的关系,例如,有个类User,对应的实体类如下:(getter,setter方法省略) public class User { /** * 主键 */ private String id; /** * 用户姓名 */ private String user本文目录
一、association 标签(一对一)
association通常用来映射一对一的关系,例如,有个类User,对应的实体类如下:(getter,setter方法省略)
@Data public class User { /** * 主键 */ private String id; /** * 用户姓名 */ private String userName; }
有个类Article,对应的实体类如下:
@Data public class Article { /** * 主键 */ private String id; /** * 文章标题 */ private String articleTitle; /** * 文章内容 */ private String articleContent; }
如果我想查询一个用户的时候,也查到他写的一篇文章,那么怎样写呢?其实可以在类User中加入一个属性Article类:
@Data public class User { /** * 主键 */ private String id; /** * 用户姓名 */ private String userName; /** * 类Article */ private Article article; }
mapper.xml 我在user类的UserMapper.xml这样配置
<mapper namespace="com.uiot.practice.mysqltest.dao.UserMapper"> <resultMap type="com.uiot.practice.mysqltest.entity.Article" id="articleMap"> <id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/> <result column="userName" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/> <!--这里把user的id传过去,com.uiot.practice.mysqltest为命名空间--> <association property="article" column="id" select="com.uiot.practice.mysqltest.selectArticleByUserId" /> </resultMap> </mapper>
同时,我的article对应的ArticleMapper.xml这样写:
<mapper namespace="com.uiot.practice.mysqltest.dao.ArticleMapper"> <resultMap type="com.uiot.practice.mysqltest.entity.Article" id="ArticleResultMap"> <id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/> <result column="articleTitle" property="articleTitle" jdbcType="VARCHAR" javaType="java.lang.String"/> <result column="articleContent" property="articleContent" jdbcType="VARCHAR" javaType="java.lang.String"/> </resultMap> <select id="selectArticleByUserId" parameterType="java.lang.String" resultMap="ArticleResultMap"> select * from tb_article where userId=#{userId} </select> </mapper>
二、collection 标签(一对多)
一对多,collection,理解了一对一,一对多容易理解
@Data public class User { /** * 主键 */ private String id; /** * 用户姓名 */ private String userName; /** * 类Article */ private List<Article> articleList; }
UserMapper.xml这样配置
<mapper namespace="com.uiot.practice.mysqltest.dao.UserMapper"> <resultMap type="com.uiot.practice.mysqltest.entity.User" id="articleMap"> <id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/> <result column="userName" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/> <!--这里把user的id传过去,com.uiot.practice.mysqltest为命名空间--> <collection property="articleList" column="id" select="com.uiot.practice.mysqltest.selectArticleByUserId"/> </resultMap> <!--以下省略,类同,Mybatis会把结果封装成List类型。--> </mapper>
完结!
-
MyBatis的一对一关联关系映射
2020-03-21 08:09:201 什么是一对一、一对多映射... 订单对用户是一对一关系 一对多 : 一个用户可以拥有多个订单 ==> 用户对订单是一对多关系 注意:在MyBatis中,如果要完成多对多关系,其实就是两个一对多映射! 接下来先讲解MyBa...原文链接:http://www.yiidian.com/mybatis/one-to-one.html
1 什么是一对一、一对多映射?
以用户和订单举例,
一对一 : 一个订单只属于一个用户 ==> 订单对用户是一对一关系
一对多 : 一个用户可以拥有多个订单 ==> 用户对订单是一对多关系
注意:在MyBatis中,如果要完成多对多关系,其实就是两个一对多映射!
接下来先讲解MyBatis的一对一映射如何实现。
2 建立表结构
2.1 创建用户表
CREATE TABLE `t_user` ( `id` int(11) DEFAULT NULL, `username` varchar(50) DEFAULT NULL, `password` varchar(50) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
2.2 创建订单表
CREATE TABLE `t_order` ( `id` int(11) DEFAULT NULL, `orderno` varchar(100) DEFAULT NULL, `amount` double DEFAULT NULL, `user_id` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
2.3 插入测试数据
3 设计Pojo实体,建立关系
3.1 用户实体类
package com.yiidian.domain; import java.util.List; /** * 用户实体 * 一点教程网 - www.yiidian.com */ public class User { private Integer id; private String username; public void setOrders(List<Order> orders) { this.orders = orders; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
3.2 订单实体类
package com.yiidian.domain; /** * 订单实体 * 一点教程网 - www.yiidian.com */ public class Order { private Integer id; private String orderno; private Double amount; private User user; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getOrderno() { return orderno; } public void setOrderno(String orderno) { this.orderno = orderno; } public Double getAmount() { return amount; } public void setAmount(Double amount) { this.amount = amount; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
Order实体类,通过user属性建立跟User实体的关系。注意,这里是一个User。
4 编写Dao接口
4.1 UserDao接口
package com.yiidian.dao; import com.yiidian.domain.User; import java.util.List; /** * 用户Dao接口 * 一点教程网 - www.yiidian.com */ public interface UserDao { }
4.2 OrderDao接口
package com.yiidian.dao; import com.yiidian.domain.Order; import com.yiidian.domain.User; import java.util.List; /** * 订单Dao接口 * 一点教程网 - www.yiidian.com */ public interface OrderDao { /** * 查询所有订单 */ public List<Order> findAllOrders(); }
5 编写Dao映射配置
5.1 UserDao.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"> <!-- namespace: 用于指定该映射文件需要映射的Dao接口 --> <mapper namespace="com.yiidian.dao.UserDao"> </mapper>
5.2 OrderDao.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"> <!-- namespace: 用于指定该映射文件需要映射的Dao接口 --> <mapper namespace="com.yiidian.dao.OrderDao"> <!--一对一映射--> <resultMap id="OrderResultMap" type="com.yiidian.domain.Order"> <id property="id" column="oid"/> <result property="orderno" column="orderno"/> <result property="amount" column="amount"/> <!--关联查询订单所属的用户--> <association property="user" column="id" javaType="com.yiidian.domain.User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> </association> </resultMap> <select id="findAllOrders" resultMap="OrderResultMap"> SELECT o.id oid, o.orderno orderno, o.amount amount, u.* FROM t_order o LEFT JOIN t_user u ON o.user_id = u.id </select> </mapper>
- association:用在一对一关联映射
- property:对应Order类的user属性
- column:对应外键字段名称
- javaType:User类的全限定名称
6 编写测试类
package com.yiidian.mybatis; import com.yiidian.dao.OrderDao; import com.yiidian.domain.Order; import com.yiidian.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.ArrayList; import java.util.List; /** * MyBatis测试类 - 一对一映射 * 一点教程网 - www.yiidian.com */ public class TestOne2One { /** * 测试一对一映射 */ @Test public void testOrderDao(){ //1.获取SqlSession对象 SqlSession sqlSession = MyBatisUtils.getSession(); //2.创建Mapper代理对象 OrderDao orderDao = sqlSession.getMapper(OrderDao.class); //3.调用方法 List<Order> list = orderDao.findAllOrders(); System.out.println(list); //4.关闭连接 sqlSession.close(); } }
7 运行测试类
以debug模式启动测试类,查看list变量的情况,可以看到Order对象中成功封装了User对象的数据!
源码下载:https://pan.baidu.com/s/1jZrfapjqB_VHI_GLgKPo4g
欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。 如果您对我的系列教程感兴趣,也可以关注我的网站:yiidian.com
-
请问hibernate在一对多关系中在一的一端定义mappedby具体是什么意思呢,用crud举例一下呢,谢谢
2010-04-10 23:58:23比如department和employee是一对多关系的,我在department那边设置了mappedby,最后测试的结果只是不会生成第三张多余的表,其他没感觉什么,网上都说让多的这一段作为关系维护端,可是设置了mappedby后我还是可以在... -
一对多关系和多对多关系的实现
2013-11-28 16:44:00一对多关系和多对多关系的实现 先来实现一对多关系 什么是一对多关系呢? 一对多是关系型数据中两个表之间的一种关系,该关系中第一...帖子与用户之间的关系 现有两张表,帖子表(tab_topic),用户表(tab_user)... -
hibernate一对一关系
2019-07-09 16:38:57hibernate对象与对象的关系 1.一对一关系 在实体类(表)之间建议对应关系 (举例人与身份证) ... //建立与Card表之间的联系,因为是一对一的关系所以cid是该表的外键 private Card c; //要调用... -
1.16 表之间的关系(单一主键的一对一关系)
2015-12-12 17:49:01二、一对一单向关系举例(annotation 方式)。 例如:husband和wife两个表,都有id和name字段。 在数据库的设计上,应为:wife作为主表,husband作为子表,husband表中需要加入wife表的wifeid字段。 在类的设计上, -
数据库中的一对多、多对多的关系讲解
2016-04-21 16:43:00一对一的关系就如球队与球队所在地址的关系,一支球队只有一个地址,一个地址对应一个球队。 3、多对多关系 常见的是学校中班级与老师之间的关系,一个班级有多个老师上课,而每个老师又给多个班级上... -
关于今天想到的hibernate的一对一映射关系
2016-08-19 11:16:02今天自学hibernate的映射关系,在学习的时候发现讲课的(视频中的老师)时候老师举例是使用person人,以及card身份证,二者应该是一对一的关系,但是在视频的讲解中老师·却在一个(此处是card.hbm.xml)配置文件中... -
mybatis级联之一对多的关系
2017-07-11 15:24:10mybatis多对一的级联,这里举例班级和学生的例子,一个班级有多个学生,属于一对多的关系,一个学生只属于一个班级,属于多对一的关系。 建立数据库文件CREATE TABLE f_class( c_id INT PRIMARY KEY AUTO_INCREMENT... -
9、JPA_映射双向一对一的关联关系
2015-12-01 19:56:00双向一对一的关联关系 举例说明:经理Manager和部门Department是双向一对一关联关系。则Manager实体类中有Department实体对象的引用,反之亦然。 其实体属性定义如下: List_1. Manager实体类属性定义(有对... -
操作系统-进程和程序之间的关系(一对一,一对多,多对一,多对多)
2020-02-02 11:23:03进程和程序之间可以形成一对一,一对多,多对一,多对多的关系,分别举例说明在什么情况下会形成这样的关系? 进程的定义 从不同的角度进程可以有不同的定义,比较典型的定义有: (1)进程是程序的一次执行过程。 ... -
SSM框架(八)Mybatis多表查询【一对一、一对多、多对多】举例说明
2019-06-07 00:19:34目录序导语正文(1)一对一(2)一对多(3)多对多附 序 三种对象关系映射ObjectRelationshipMapping JDBC(数据库操作) student t_student studentId t_id Mybatis(半自动的ORM) Teacher XML/@ ... -
求助:sql server两表间一对多的关系,如何数据整合到一行数据中,问题举例如下。谢谢..
2012-05-10 15:05:06有两张表,其中一张是学生表(student),另一张是各科成绩表(grade),各表包含的字段如下: student学生信息表 ----------------------------------------------------- id varchar 学生编号 name varchar... -
hibernate的表关系一对多,多对一,多对多
2019-07-11 11:15:22一对多: 举例:一门课程会有多个学生学(虽然多个可能会有多门课程,但这里就当只有一门课程,或者一个省会有多个城市) 然后要在实体类中体现出来还有在实体类对应的映射文件中也要映射出来 course的实体类 ... -
Hibernate(6) 一对多映射关系的建立
2018-08-25 15:24:401.一对多的映射关系的建立 ...首先来讲,表与表之间可以存在一对一,一对多,多对多的关系,其中1~N, M~N关系的举例说明可以用如下的图进行表示: 图示的这两种关系并不难理解,而如何在Hiberna... -
PowerDesigner让多对多的关系生成一个对应的实体
2012-11-20 11:31:12如何通过powerdesigner的设计,让多对多的关系,在数据生成对应的表结构。 举例,有个class表,一个student表,和 一个class_student关系: 在cdm中建好class和student。然后通过Relationship关联,点击... -
数据表对应关系(一对一、一对多、多对多)
2017-08-21 19:44:00数据表之间的关联关系分为三种:一对一、一对多、多对多。下面就逐一介绍下: 1. 一对一 Ø 一对一是将数据表“垂直切分”,其实是不常见,或不常用的。也就是 A 表的一条记录对应 B 表的一条记录,为什么要这样的... -
3.ORM框架一对多的关系及使用
2019-03-16 19:28:00一对多就是主键与外键的关系,通过一个用户表,角色表进行举例子 角色表role:有外键,对应的是user表的主键 用户表users: from flask import Flask, render_template from flask_sqlalchemy import ... -
【数据库】快速判断一对多,多对多关系,并建立数据库实体之间的映射
2020-11-11 15:25:11一对多关系 举例:部门和员工的对应关系 : 1. 正过来看,(“1”)一个部门里面可以有多个员工(“n”) 2. 反过来看一一对应:而一个员工只能对应一个部门 由于满足上面两条, 所以一对多关系成立, 部门是1 员工是n 策略... -
多对多之间的联合组件sql(仅以hibernate关系表举例,其他一样)
2017-04-21 16:06:24今天在学习hibernate的知识,在这里就扯点其他的,原来经常使用的orm框架是mybatis,...但是很多示意图和知识点还是比较经典和值得收藏的,最近一两天我会将我学习和总结的hibernate,写成博文然后发布,想要学习hibern -
Hibernate一对多关系
2019-07-09 17:25:09hibernate 一对多关系 2.一对多(举例省份province与城市City) public class Province { private Integer pid; private String pname; //添加省份下的多个城市集合 对于省份来讲城市属于可以有多个 private ... -
Hibernate学习之级联操作3——一对一关联关系
2015-04-09 11:22:01前面两篇博文里记录了Hibernate级联操作的一对多关联关系和一对多双向自身关联关系,这一篇记录的是一对一关联关系,例如一个人对应一张身份证,一对一的关系又可以分为共用主键的方式和一对多的特殊情况(使用外键... -
在双向多对一关联关系中如果由两端维护关联的关系会出问题
2019-10-09 08:14:46在双向多对一关联关系中如果由两端维护关联的关系会出问题。 举例: Clazz 为一端,Student为多端。多端的inverse 属性值为“false”, 也就是说此时关联关系由两端维护。那么在保存的时候,就会出现一个问题:多... -
Hibernate(6)Hibernate一对多多对一关系
2019-08-02 10:46:12顾客和联系人的关系 一个顾客可以联系多个联系人 一对多 反过来就是多对一 顾客的实体类 package cn.ycsj.domain; import java.util.HashSet; import java.util.Set; public class Customer { /* * CREATE... -
通过webapi 查询多对多(N:N)关系中的一个记录
2020-02-28 09:13:48背景:我们在项目中经常会用到多对多的关系,然后我们需要通过webapi或者service取其中一个的记录,这时一般的方法很难做到,我们可以通过构建fetchxml来实现这个过程。 举例: 此例中,有一个市场实体和客户是多对... -
解决json序列化有多对一和多对多关系的对象时造成死循环的问题
2017-01-04 09:39:26json序列化的对象中存在...使用@JsonBackReference标记在有多对一或者多对多关系的属性上即可解决这个问题,举例: @JsonBackReference @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "market_id") privat -
Mybatis(5) 多对一关系的映射与数据获取
2018-09-01 01:47:08Mybatis多对一关系的映射与数据获取 在之前的数据获取时,所针对的都是对一张表的操作。所映射的结果也都直接的是通过resultType属性映射到一个规定的实体类里。但是针对同时对多个表进行的级联查询。则需要进行...
-
物联网之mqtt实现(emqx+springboot+mqtt附源码)
-
白话:java从入门到实战
-
总结的java笔记,留作纪念
-
RapidScada从入门到精通
-
用微服务spring cloud架构打造物联网云平台
-
在产品中找到里面的bug 用excel编写缺陷报告 至少20条 好医在线app
-
H81M_for_XP.zip
-
项目管理工具与方法
-
网络基础
-
转置矩阵
-
apache-tomcat-8.5.61.zip
-
「ShadowsocksR」- 流量偷渡技术(手动滑稽) @20210225
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
zookeeper可以用来干什么
-
libFuzzer视频教程
-
对准大光度变化和噪点图像的可靠方法
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
基于相互局部三元模式的对齐不同曝光图像的方法
-
文本搜索专家.exe
-
meter:Meter-是用于Android(和Java)项目的简单的微基准测试工具。 这不是探查器,这是一个很小的实用工具类,旨在简化基准测试。 而已。 替代Android Jetpack基准测试-源码