一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - mybatis關系映射之一對多和多對一

mybatis關系映射之一對多和多對一

2021-07-11 18:09muzidigbig Java教程

今天小編就為大家分享一篇關于mybatis關系映射之一對多和多對一,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

本實例使用用戶和訂單的例子做說明: 一個用戶可以有多個訂單, 一個訂單只對應一個用戶。(其中應用到注釋)

1.代碼的結構

mybatis關系映射之一對多和多對一

2. 建表語句:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
create database test; 
  use test;
  create table person(
   personid varchar(36) primary key,
   personname varchar(64),
   personaddress varchar(128),
   persontel varchar(11)
  );
  create table orders(
   orderid varchar(36) primary key,
   ordernumber varchar(20),
   orderprice int,
   pid varchar(36)
  );
insert into person values('1', '木子', '湖北', '110');
insert into person values('2', '木子大大', '武漢', '120');
insert into person values('1', '木子苗苗', '天門', '119');
  insert into orders values('1', '001', 100, '1');
  insert into orders values('2', '002', 200, '1');
  insert into orders values('3', '003', 300, '2');
  insert into orders values('4', '004', 400, '2');
  insert into orders values('5', '005', 500, '3');
select p.*, o.* from person p join orders o on (p.personid=o.pid) where p.personid = '1' ;
*指顯示所有字段

3. 用戶實體:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.mybatis.domain;
import java.util.list;
import lombok.data;
@data//注釋(person為單方)
public class person {
  private string personid;
  private string personname;
  private string personaddress;
  private string persontel;
  //這個代表多方里面的內容(orders)
  private list<orders> orders;
 @override
 public string tostring() {
 return "person [personid=" + personid + ", personname=" + personname
  + ", personaddress=" + personaddress + ", persontel="
  + persontel + ", orders=" + orders + "]";
 }
}

4. 訂單實體:

?
1
2
3
4
5
6
7
8
9
10
package com.mybatis.domain;
import lombok.data;
@data//(orders為多方)
public class orders {
  private string orderid;
  private string ordernumber;
  private integer orderprice;
  //對象(單方person)與外鍵進行關聯
  private person person;
}

5.寫personmapper.java的接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.mybatis.dao.mapper;
import com.mybatis.domain.orders;
import com.mybatis.domain.person;
import java.util.list;
public interface personmapper {
  int deletebyprimarykey(string personid);
  int insert(person record);
  person selectbyprimarykey(string personid);
  list<person> selectall();
  int updatebyprimarykey(person record);
  //一對多查詢(根據id查詢)
  public list<orders> findpersonandorders(string pid);
  //一對多查詢返回一個對象
  public person selectpersonbyid(string id);
}

6. 一對多實體配置: personmapper.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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="com.mybatis.dao.mapper.personmapper" >
 <resultmap id="personresultmap" type="com.mybatis.domain.person" >
  <id column="personid" property="personid" jdbctype="varchar" />
  <result column="personname" property="personname" jdbctype="varchar" />
  <result column="personaddress" property="personaddress" jdbctype="varchar" />
  <result column="persontel" property="persontel" jdbctype="varchar" />
 <!-- 一對多的關系(這個是關聯集合)這個是orders里面的多方 -->
    <!-- property: 指的是集合屬性的名, oftype:指的是集合中元素的類型的路徑 (實現類)-->
    <collection property="orders" oftype="com.mybatis.domain.orders">
     <!-- id有一個單獨標簽 -->
      <id column="orderid" property="orderid"/>
      <!--column指sql中字段的名字  property指java中對應sql中屬性的名 -->
      <result column="ordernumber" property="ordernumber"/>
      <result column="orderprice" property="orderprice"/>
    </collection>
 </resultmap>
  <!-- 根據id查詢person, 關聯將orders查詢出來(注意放置的位置) -->
  <select id="findpersonandorders" parametertype="string" resultmap="personresultmap">
    select p.*,o.* from person o,orders b where o.personid=#{pid};
  </select>
   <select id="selectpersonbyid" parametertype="string" resultmap="personresultmap">
    select p.*, o.* from person p, orders o where p.personid = o.pid and p.personid = #{id}
  </select>
 </mapper>

7.寫ordersmapper.java的接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.mybatis.dao.mapper;
import com.mybatis.domain.orders;
import java.util.list;
public interface ordersmapper {
  int deletebyprimarykey(string orderid);
  int insert(orders record);
  orders selectbyprimarykey(string orderid);
  list<orders> selectall();
  int updatebyprimarykey(orders record);
  //多查一 根據id
  public orders selectorderbyid(string oid);
  //多查一 根據ordernumber
  public orders selectordernumber(string number);
}

8.多對一實體配置:ordersmapper.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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="com.mybatis.dao.mapper.ordersmapper" >
 <resultmap id="ordersresultmap" type="com.mybatis.domain.orders" >
  <id column="orderid" property="orderid" jdbctype="varchar" />
  <result column="ordernumber" property="ordernumber" jdbctype="varchar" />
  <result column="orderprice" property="orderprice" jdbctype="integer" />
  <!--
  <result column="pid" property="pid" jdbctype="varchar" />
  -->
   <!-- 多對一的關系 這個是person里面的單方 -->
    <!-- property: 指的是屬性的值, javatype:指的是屬性的類型的路徑 (實現類)-->
    <association property="person" javatype="com.mybatis.domain.person">
      <!--注意:在此column和property的值要一樣都為person的屬性 -->
 <id column="personid" property="personid"/>
<result column="personname" property="personname"/>
<result column="personaddress" property="personaddress"/>
<result column="persontel" property="persontel"/>
</association>
 </resultmap>
<!-- 根據id查詢order, 關聯將person查詢出來 -->
<select id="selectorderbyid" parametertype="string" resultmap="ordersresultmap">
 select p.*, o.* from person p, orders o where p.personid = o.pid and o.orderid = #{oid}
</select>
<!-- 根據ordernumber查詢order, 關聯將person查詢出來 -->
<select id="selectordernumber" parametertype="string" resultmap="ordersresultmap">
select p.*, o.* from person p, orders o where p.personid = o.pid and o.orderid = #{number}
 </select>
</mapper>

9.其他配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
db.properties配置(sql語句的基本鏈接)
db.driver=com.mysql.jdbc.driver
db.url=jdbc:mysql://localhost:3306/wang1?useunicode=true&characterencoding=utf8
db.username=root
db.password=123456
   log4j.properties配置(注釋)
# global logging configuration
log4j.rootlogger=debug, stdout
# console output...
log4j.appender.stdout=org.apache.log4j.consoleappender
log4j.appender.stdout.layout=org.apache.log4j.patternlayout
log4j.appender.stdout.layout.conversionpattern=%5p [%t] - %m%n
  mybatis.xml(逆向生成domain、dao層)
<?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>
<!-- mybatis核心配置文件 -->
 <!-- 加載java的配置文件或者聲明屬性信息 -->
 <properties resource="db.properties">
 </properties>
 <!-- alias別名 -->
 <typealiases>  <!--這里需要修改 domain層的路徑-->
 <typealias type="com.mybatis.domain.person" alias="person" />
 <typealias type="com.mybatis.domain.orders" alias="orders" />
 </typealiases>
 <!-- 配置mybatis的環境信息,與spring整合,該信息由spring來管理
 如果說我們需要連接數據庫,那么必須在mybatis中配置環境 運行環境
 -->
 <environments default="development">
 <environment id="development">
  <!-- 配置jdbc事務控制,由mybatis進行管理 -->
  <transactionmanager type="jdbc"></transactionmanager>
  <!-- 配置數據源,采用mybatis連接池 -->
  <datasource type="pooled">
  <property name="driver" value="${db.driver}" />
  <property name="url" value="${db.url}" />
  <property name="username" value="${db.username}" />
  <property name="password" value="${db.password}" />
  </datasource>
 </environment>
 </environments>
 <!-- 加載映射文件(注意反\)-->
 <mappers>  <!--這里需要修改 dao層的路徑-->
 <mapper resource="com\mybatis\dao\mapper\personmapper.xml"/>
 <mapper resource="com\mybatis\dao\mapper\ordersmapper.xml"/>
 </mappers>
</configuration>
  generatorconfig.xml配置(對mysql進行操作)下面標紅部分根據自己建立的進行修改
<?xml version="1.0" encoding="utf-8"?>
<!doctype generatorconfiguration
 public "-//mybatis.org//dtd mybatis generator configuration 1.0//en"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置生成器 -->
<generatorconfiguration>  d盤中要有此包mysql-connector-java-5.1.7-bin.jar
<classpathentry location="d:\mysql-connector-java-5.1.7-bin.jar" />
 <context id="mysql" defaultmodeltype="hierarchical" targetruntime="mybatis3simple">
 <!-- 自動識別數據庫關鍵字,默認false,如果設置為true,根據sqlreservedwords中定義的關鍵字列表;
         一般保留默認值,遇到數據庫關鍵字(java關鍵字),使用columnoverride覆蓋 -->
 <property name="autodelimitkeywords" value="false" />
 <!-- 生成的java文件的編碼 -->
 <property name="javafileencoding" value="utf-8" />
 <!-- beginningdelimiter和endingdelimiter:指明數據庫的用于標記數據庫對象名的符號,比如oracle就是雙引號,mysql默認是`反引號; -->
 <property name="beginningdelimiter" value="`" />
 <property name="endingdelimiter" value="`" />
 <!-- 注釋生成器 -->
 <commentgenerator>
  <property name="suppressdate" value="true"/>
  <property name="suppressallcomments" value="true" />
 </commentgenerator>
 <!-- 必須要有的,使用這個配置鏈接數據庫 @todo:是否可以擴展 -->
 <jdbcconnection driverclass="com.mysql.jdbc.driver"
  connectionurl="jdbc:mysql://localhost:3306/wang1" userid="root" password="123456">
  <!-- 這里面可以設置property屬性,每一個property屬性都設置到配置的driver上 -->
 </jdbcconnection>
 <!-- java模型創建器,是必須要的元素 負責:1,key類(見context的defaultmodeltype);2,java類;3,查詢類
  targetpackage:生成的類要放的包,真實的包受enablesubpackages屬性控制;
         targetproject:目標項目,指定一個存在的目錄下,生成的內容會放到指定目錄中,如果目錄不存在,mbg不會自動建目錄 -->
 <javamodelgenerator targetpackage="com.mybatis.domain" targetproject="mybatis03/src">
  <!-- for mybatis3/mybatis3simple 自動為每一個生成的類創建一個構造方法,構造方法包含了所有的field;而不是使用setter; -->
  <property name="constructorbased" value="false" />
  <!-- for mybatis3 / mybatis3simple 是否創建一個不可變的類,如果為true, 那么mbg會創建一個沒有setter方法的類,
          取而代之的是類似constructorbased的類 -->
  <property name="immutable" value="false" />
 </javamodelgenerator>
 <!-- 生成sql map的xml文件生成器, 注意,在mybatis3之后,我們可以使用mapper.xml文件+mapper接口(或者不用mapper接口),
  或者只使用mapper接口+annotation,所以,如果 javaclientgenerator配置中配置了需要生成xml的話,這個元素就必須配置
  targetpackage/targetproject:同javamodelgenerator -->
 <sqlmapgenerator targetpackage="com.mybatis.dao.mapper" targetproject="mybatis03/src">
  <!-- 在targetpackage的基礎上,根據數據庫的schema再生成一層package,最終生成的類放在這個package下,默認為false -->
  <property name="enablesubpackages" value="true" />
 </sqlmapgenerator>
   <!-- 對于mybatis來說,即生成mapper接口,注意,如果沒有配置該元素,那么默認不會生成mapper接口 targetpackage/targetproject:同javamodelgenerator
  type:選擇怎么生成mapper接口(在mybatis3/mybatis3simple下):
   1,annotatedmapper:會生成使用mapper接口+annotation的方式創建(sql生成在annotation中),不會生成對應的xml;
  2,mixedmapper:使用混合配置,會生成mapper接口,并適當添加合適的annotation,但是xml會生成在xml中;
  3,xmlmapper:會生成mapper接口,接口完全依賴xml;
  注意,如果context是mybatis3simple:只支持annotatedmapper和xmlmapper -->
 <javaclientgenerator targetpackage="com.mybatis.dao.mapper" type="xmlmapper" targetproject="mybatis03/src">
  <!-- 在targetpackage的基礎上,根據數據庫的schema再生成一層package,最終生成的類放在這個package下,默認為false -->
  <property name="enablesubpackages" value="true" />
  <!-- 可以為所有生成的接口添加一個父接口,但是mbg只負責生成,不負責檢查 <property name="rootinterface"
  value=""/> -->
 </javaclientgenerator>
            <!--逆向生成的文件-->
 <table tablename="person" delimitidentifiers="true">
<!-- 參考 javamodelgenerator 的 constructorbased屬性 -->
<property name="constructorbased" value="false" />
<generatedkey column="id" sqlstatement="jdbc"/>
</table>
<table tablename="orders" delimitidentifiers="true">
<!-- 參考 javamodelgenerator 的 constructorbased屬性 -->
<property name="constructorbased" value="false" />
<generatedkey column="id" sqlstatement="jdbc"/>
</table>
</context>
</generatorconfiguration>

10.測試文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.mybatis.test;
import java.io.inputstream;
import java.text.parseexception;
import java.text.simpledateformat;
import java.util.date;
import java.util.iterator;
import java.util.list;
import lombok.data;
import org.apache.ibatis.io.resources;
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.mybatis.dao.mapper.ordersmapper;
import com.mybatis.dao.mapper.personmapper;
import com.mybatis.domain.orders;
import com.mybatis.domain.person;
public class teststudentmapper {
 sqlsessionfactory sessionfactory = null;
 // 這方法之前
 @before
 public void setup() throws exception {
 string resource = "mybatis.xml";
 // 這個是加載配置文件
 inputstream inputstream = resources.getresourceasstream(resource);
 // 得到會話工廠
 sessionfactory = new sqlsessionfactorybuilder().build(inputstream);
 }
 //查詢一對多 根據這個person里面的id號就能查詢出這個用戶有多少個訂單記錄
// @test
 public void testselectpersonbyid(){
 sqlsession sq = sessionfactory.opensession();
 // 得到dao層的實現類
 personmapper u = sq.getmapper(personmapper.class);
 person person = u.selectpersonbyid("2");
 system.out.println(person);
 }
 //多對一 根據多對一id進行查詢
// @test//多對一關聯查詢
   public void testselectorderbyid(){
   sqlsession sq = sessionfactory.opensession();
  // 得到dao層的實現類
   ordersmapper u = sq.getmapper(ordersmapper.class);
  orders od = u.selectorderbyid( "2");
  system.out.println(od.getperson().getpersonname());
  system.out.println(od.getperson().getpersonaddress());
   }
  @test//多對一關聯查詢
   public void testselectordernumber(){
   sqlsession sq = sessionfactory.opensession();
  // 得到dao層的實現類
   ordersmapper u = sq.getmapper(ordersmapper.class);
  orders od = u.selectordernumber("001");
  system.out.println(od.getperson().getpersonname());
  system.out.println(od.getperson().getpersonaddress());
   }
}

如有問題請多多指教!希望給您帶來幫助!祝您生活愉快。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

原文鏈接:https://blog.csdn.net/muzidigbig/article/details/78551132

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本免费全黄一级裸片视频 | 国产99在线a视频 | xxx86日本人| 国产91在线精品狼人 | 亚洲狠狠婷婷综合久久久久网站 | 日本无遮挡亲吻膜下面免费 | 久久99亚洲AV无码四区碰碰 | 国产二区视频在线观看 | 国产xx肥老妇视频奂费 | 韩国最新三级网站在线播放 | 456亚洲老头视频 | 欧美伦乱 | 成人免费体验区福利云点播 | 色婷婷精品 | 亚洲欧洲日产国码天堂 | 日本最大的黄色网站 | 2021久久| 秋霞在线观看成人高清视频51 | 国产日韩欧美在线一区二区三区 | 国产麻豆精品入口在线观看 | 国产尤物视频 | tube69中国露脸 | 日韩欧美亚洲一区二区综合 | 污到你怀疑人生 | 女教师雪白老汉 | 青草久久影院 | 精品国产一区二区三区久久影院 | 免费特黄一级欧美大片 | 精品久久久噜噜噜久久久app | chinese调教踩踏视频 | 日本在线不卡免 | 国产亚洲精品精品国产亚洲综合 | 男人边吃奶边做好爽视频免费 | 久久一er精这里有精品 | 欧美一区二区三区免费观看视频 | 精品精品国产自在久久高清 | 国产精品香蕉在线观看不卡 | 男女姓交大视频免费观看 | 四虎影音先锋 | 黄色a站 | 国产久热香蕉在线观看 |