本實例使用用戶和訂單的例子做說明: 一個用戶可以有多個訂單, 一個訂單只對應一個用戶。(其中應用到注釋)
1.代碼的結構
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