mybatis用注解实现 一对一,一对多,多对多哟
先给大家看一下我的项目 整个的一个 构造:
好,然后 开始我的mybatis关系,用的是mysql
1.首先,先导入依赖:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope> </dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version> </dependency> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.43</version> </dependency>
2.然后,连接数据库,写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><!-- 懒加载 --> <settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/><setting name="cacheEnabled" value="true"/> </settings><!--设置别名--> <typeAliases><!--<typeAlias type="com.desert.Dto.MyPerson" alias="a"></typeAlias>--> <package name="com.desert"></package></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!-- Q 加载dao方法 --> <!--一对一--> <mapper class="com.desert.dao.ICardDao"/><mapper class="com.desert.dao.IPersonDao"/><!--一对多--> <mapper class="com.desert.dao.ICityDao"></mapper><mapper class="com.desert.dao.IProvincesDao"></mapper><!--多对多--> <mapper class="com.desert.dao.IUserDao"></mapper><mapper class="com.desert.dao.IRolesDao"></mapper></mappers> </configuration>
一:说一下 我的一对一关系:
一对一我那Person和Card拿来做实列:
Person表:
private String pname; private int pid; private int page;private Card card;
-------------------------------------------------------------
Person数据库:
然后 再是我的Card表:(也可以定义一个Person属性,这里我就不定义了)
private int uid; private String cnumber;
------------------------------------
数据库:
然后,再是我的dao方法:
IPersonDao:
public interface IPersonDao {@Select("select * from person where pid = #{pid}")@Results({@Result(id=true,column="pid",property="pid"),@Result(column="pname",property="pname"),@Result(column="page",property="page"),@Result(column="pid",property="card",one=@One(select="com.desert.dao.ICardDao.getCard",fetchType= FetchType.EAGER))})public Person getPerson(int pid);}
ICardDao:
public interface ICardDao {@Select("select * from card where uid = #{uid} ")public Card getCard(int uid);}
这样,一个简单的一对一关系就好了。
然后,再是去测试
@Test //一对一 public void Testonttoone() throws IOException {SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config"));SqlSession sqlSession = sqlSessionFactory.openSession();IPersonDao iPersonDao=sqlSession.getMapper(IPersonDao.class);// 根据id查询Person对象,同时需要获得关联的Card对象 Person person=iPersonDao.getPerson(1);System.out.println(person);System.out.println(person.getCard().getCnumber());sqlSession.close();}
二:再说一下 一对多的关系:
这里 我拿省份(Provinces)和城市(Citys)拿来做实列:
Provinces表:
private int pid; private String pname;private Set<Citys> citysSet;
--------------------------------
数据库:
Citys表:
private int cid;
private String cname;
private int pid;
--------------------------------------------
数据库:
然后,再是我的dao方法:
IProvincesDao:
public interface IProvincesDao {@Select("select * from provinces where pid = #{pid}")@Results({@Result(id=true,column="pid",property="pid"),@Result(column="pname",property="pname"),@Result(column="pid",property="citysSet",many=@Many(select="com.desert.dao.ICityDao.getCitybypid",fetchType= FetchType.LAZY ))})public Provinces getProvincesByid(int pid);}
ICitysDao:
public interface ICityDao {@Select("select * from city where pid=#{pid}")public List<Citys> getCitybypid(int pid);}
之后,再mybatis-config加载之后,就可以测试了:
测试类:
@Test //一对多 public void Testonttomany() throws IOException {SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config"));SqlSession sqlSession = sqlSessionFactory.openSession();IProvincesDao iProvincesDao=sqlSession.getMapper(IProvincesDao.class);Provinces provinces=iProvincesDao.getProvincesByid(1);System.out.println(provinces.getPname());for (Citys citys : provinces.getCitysSet()) {System.out.println(citys.getCname());}sqlSession.close();}
三:再是我的多对多,这里,拿用户(Users)和角色(Roles)来做实列:
Users:
private int uid; private String uname;private Set<Roles> roles;
------------------------------------------------
数据库:
Roles:
private int rid; private String rname;private Set<Users> users;
-----------------------------------------
数据库:
然后 再是我的IUsersDao:
public interface IUserDao {//根据id得到用户: @Select("select * from users where uid = #{uid}")@Results({@Result(id=true,column="uid",property="uid"),@Result(column="uname",property="uname"),@Result(column="uid",property="roles",many=@Many(select="com.desert.dao.IRolesDao.getAllRolesByuid",fetchType= FetchType.LAZY ))})public Users getUsersById(int uid);}
我的IRolesDao:
public interface IRolesDao {//根据用户id得到所有的角色: @Select("select * from roles where rid in(select rid from u_r where uid=1)")public List<Roles> getAllRolesByuid(int uid);}
然后,在mybatis-config加载好配置文件 就可以直接去测试了:
@Test //多对多 public void Testmanytomany() throws IOException {SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config"));SqlSession sqlSession = sqlSessionFactory.openSession();IUserDao iUserDao=sqlSession.getMapper(IUserDao.class);Users users=iUserDao.getUsersById(1);System.out.println(users.getUname());for (Roles roles : users.getRoles()) {System.out.println(roles.getRname());} sqlSession.close();}
其实个人觉得 mybatis中注解比xml配置文件 好用些
mybatis用注解实现 一对一,一对多,多对多哟相关推荐
- 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多
7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...
- mybatis的一对一 一对多 多对多
mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...
- SQLAlchemy_定义(一对一/一对多/多对多)关系
SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置 ----喝最烈的酒.
1.Mybatis多表查询 1.1 一对一查询 1.1.1 一对一查询的模型 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单 ...
- Mybatis—— 使用注解实现一对一复杂关系映射及延迟加载
@Results 注解 代替的是标签<resultMap> 该注解中可以使用单个@Result 注解,也可以使用@Result 集合 @Results({@Result(),@Result ...
- JPA 一对一 一对多 多对一 多对多配置
1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一多对一/一对多,多对多{类中的定义方法}day691. 昨日内容回顾1. 单表增删改查2. 单表查询API返回QuerySet对象的:1. .all() ...
- Django一对一 ,一对多,多对多
Django 数据库一对多,多对多 目录 app01/models.py app01/views.py app01/urls.py Python_Django/urls.py 目录 app01/mod ...
- 高级MyBatis -- resultMap实现联表(一对多,多对一)
前言: 结合实际生活来看联表,拿一个习以为常的例子来说,学生和老师: 多个学生对应一个老师 -- 多对一 (当然是在一个课堂上,嘻嘻) 一个老师对应多个学生 -- 一对多 (同上) 在实际操作时,我们 ...
最新文章
- PyTorch 训练可视化教程 visdom
- cxGrid功能_用于备查【转】
- 基于Tablestore管理海量快递轨迹数据架构实现
- 多线程-共享全局变量(python版)
- Python05 梯形公式 Simpson公式 Cotes公式 Romber公式(附代码)
- android检测手机网络连接不上,Android WIFI及手机网络连接情况检查
- VisualBrush
- 助力开发者的魔法式“绝招儿”,你了解几个?
- 深入理解分布式事务(XA及rocketmq事务)
- oracle excel总结,oracle导出excel 步骤总结
- PS:更换证件照背景颜色
- 市场规模、市场份额、市场定位、产品类型以及发展规划-园艺电动工具
- 光盘刻录 CD刻录软件 Ashampoo Burning Studio特别版 刻录CD就这么简单
- win7计算机出现空白图标,win7任务栏右下角图标显示为空白如何解决_win7任务栏右下角图标空白怎么去掉...
- 【JavaWeb】火车票管理系统 (三)用户登录-03
- 字蛛的用法以及遇到的问题
- 程序员电脑组装_解密中国互联网企业创始人,程序员是如何打下半壁江山的?...
- 2018华北五省计算机应用大赛,“远洋航空杯”2019年华北五省(市、自治区) 及港澳台大学生计算机应用大赛隆重举行...
- 凸优化——凸优化问题与算法
- Linux音频驱动之二:Control接口的调用