一.mybatis注解開發單表操作 ***
1.1 mybatis的常用注解
之前我們在mapper映射文件中編寫的sql語句已經各種配置,其實是比較麻煩的
而這幾年來注解開發越來越流行,mybatis也可以使用注解開發方式,這樣我們就可以減少編寫mapper映射文件了
常用注解
@select(“查詢的 sql 語句”):執行查詢操作注解
@insert(“查詢的 sql 語句”):執行新增操作注解
@update(“查詢的 sql 語句”):執行修改操作注解
@delete(“查詢的 sql 語句”):執行刪除操作注解
1.2 注解實現查詢操作
表:我們還是用db1中的student表
新建mybatis04項目
- 導入所需要的包
- 配置相關的幾個配置文件(配置文件的內容與之前項目都一致,這里就不在羅列)
- 新建所需要的包
javabean
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
|
package com.itheima.bean; ? public class student { private integer id; private string name; private integer age; ? public student() { } ? public student(integer id, string name, integer age) { this .id = id; this .name = name; this .age = age; } ? 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 integer getage() { return age; } ? public void setage(integer age) { this .age = age; } ? @override public string tostring() { return "student{" + "id=" + id + ", name='" + name + '\ '' + ", age=" + age + '}' ; } } |
創建mapper接口
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.itheima.mapper; ? import com.itheima.bean.student; import org.apache.ibatis.annotations.select; ? import java.util.list; ? public interface studentmapper { //查詢全部 @select ( "select * from student" ) public abstract list<student> selectall(); } |
配置mybatisconfig.xml
1
2
3
4
5
|
<!--配置映射關系:這里已經沒有mapper映射文件了,但是我們需要配置mapper接口所在的包--> <mappers> < package name= "com.itheima.mapper" /> </mappers> <!--其實是注解的方式幫助我們生成了映射文件,所以我們依然是在mappers節點里配置--> |
測試類:com.itheima.test.test01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@test public void selectall() throws exception{ //1.加載核心配置文件 inputstream is = resources.getresourceasstream( "mybatisconfig.xml" ); ? //2.獲取sqlsession工廠對象 sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(is); ? //3.通過工廠對象獲取sqlsession對象 sqlsession sqlsession = sqlsessionfactory.opensession( true ); ? //4.獲取studentmapper接口的實現類對象 studentmapper mapper = sqlsession.getmapper(studentmapper. class ); ? //5.調用實現類對象中的方法,接收結果 list<student> list = mapper.selectall(); ? //6.處理結果 for (student student : list) { system.out.println(student); } } |
注意:
修改mybatis的核心配置文件,我們使用了注解替代的映射文件,所以我們只需要加載使用了注解的mapper接口即可
1
2
3
4
|
<mappers> <!--掃描使用注解的類--> <mapper class = "com.itheima.mapper.usermapper" ></mapper> </mappers> |
或者指定掃描包含映射關系的接口所在的包也可以
1
2
3
4
|
<mappers> <!--掃描使用注解的類所在的包--> < package name= "com.itheima.mapper" ></ package > </mappers> |
1.3 注解實現新增操作
studentmapper新增接口方法
1
2
3
|
//新增操作: sql的參數與之前的寫法一致,從insert方法的參數中獲取對應屬性值 @insert ( "insert into student values (#{id},#{name},#{age})" ) public abstract integer insert(student stu); |
測試方法
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
|
@test public void insert() throws exception{ //1.加載核心配置文件 inputstream is = resources.getresourceasstream( "mybatisconfig.xml" ); ? //2.獲取sqlsession工廠對象 sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(is); ? //3.通過工廠對象獲取sqlsession對象 sqlsession sqlsession = sqlsessionfactory.opensession( true ); ? //4.獲取studentmapper接口的實現類對象 studentmapper mapper = sqlsession.getmapper(studentmapper. class ); ? //5.調用實現類對象中的方法,接收結果 student stu = new student( 4 , "趙六" , 26 ); integer result = mapper.insert(stu); ? //6.處理結果 system.out.println(result); ? //7.釋放資源 sqlsession.close(); is.close(); } |
返回自動增長主鍵
介紹
代碼
- 在insert注解之上添加options注解
- 指定主鍵列為id,主鍵屬性為id(意味會將注解列id最終的自增結果返回,并且賦值給stu的id屬性)
測試
在mapper.insert(stu)之后,會將操作結果返回,并且也會對stu本身的id進行賦值
結果
1.4 注解實現修改操作
studentmapper新增接口方法
1
2
3
|
//修改操作 @update ( "update student set name=#{name},age=#{age} where id=#{id}" ) public abstract integer update(student stu); |
測試方法
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
|
@test public void update() throws exception{ //1.加載核心配置文件 inputstream is = resources.getresourceasstream( "mybatisconfig.xml" ); ? //2.獲取sqlsession工廠對象 sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(is); ? //3.通過工廠對象獲取sqlsession對象 sqlsession sqlsession = sqlsessionfactory.opensession( true ); ? //4.獲取studentmapper接口的實現類對象 studentmapper mapper = sqlsession.getmapper(studentmapper. class ); ? //5.調用實現類對象中的方法,接收結果 student stu = new student( 4 , "趙六" , 36 ); integer result = mapper.update(stu); ? //6.處理結果 system.out.println(result); ? //7.釋放資源 sqlsession.close(); is.close(); } |
1.5 注解實現刪除操作
studentmapper新增接口方法
1
2
3
|
//刪除操作 @delete ( "delete from student where id=#{id}" ) public abstract integer delete(integer id); |
測試方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@test public void delete() throws exception{ //1.加載核心配置文件 inputstream is = resources.getresourceasstream( "mybatisconfig.xml" ); ? //2.獲取sqlsession工廠對象 sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(is); ? //3.通過工廠對象獲取sqlsession對象 sqlsession sqlsession = sqlsessionfactory.opensession( true ); ? //4.獲取studentmapper接口的實現類對象 studentmapper mapper = sqlsession.getmapper(studentmapper. class ); ? //5.調用實現類對象中的方法,接收結果 integer result = mapper.delete( 4 ); ? //6.處理結果 system.out.println(result); ? //7.釋放資源 sqlsession.close(); is.close(); } |
1.6 注解開發總結
注解可以簡化開發操作,省略映射配置文件的編寫
常用注解
@select(“查詢的 sql 語句”):執行查詢操作注解
@insert(“查詢的 sql 語句”):執行新增操作注解
@update(“查詢的 sql 語句”):執行修改操作注解
@delete(“查詢的 sql 語句”):執行刪除操作注解
配置映射關系
1
|
<mappers> < package name= "接口所在包" /> </mappers> |
二.mybatis注解開發的多表操作
2.1 mybatis的注解實現復雜映射開發
-
實現復雜關系映射之前我們可以在映射文件中通過配置
<resultmap>
來實現, - 使用注解開發后,我們可以使用@results注解,@result注解,@one注解,@many注解組合完成復雜關系的配置
2.2 一對一查詢
2.2.0 準備工作
創建項目: mybatis05
javabean - card
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
|
package com.itheima.bean; ? public class card { private integer id; //主鍵id private string number; //身份證號 ? private person p; //所屬人的對象 ? public card() { } ? public card(integer id, string number, person p) { this .id = id; this .number = number; this .p = p; } ? public integer getid() { return id; } ? public void setid(integer id) { this .id = id; } ? public string getnumber() { return number; } ? public void setnumber(string number) { this .number = number; } ? public person getp() { return p; } ? public void setp(person p) { this .p = p; } ? @override public string tostring() { return "card{" + "id=" + id + ", number='" + number + '\ '' + ", p=" + p + '}' ; } } |
javabean - person
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
|
package com.itheima.bean; ? public class person { private integer id; //主鍵id private string name; //人的姓名 private integer age; //人的年齡 ? public person() { } ? public person(integer id, string name, integer age) { this .id = id; this .name = name; this .age = age; } ? 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 integer getage() { return age; } ? public void setage(integer age) { this .age = age; } ? @override public string tostring() { return "person{" + "id=" + id + ", name='" + name + '\ '' + ", age=" + age + '}' ; } } |
cardmapper接口:我們的核心就是要在card中做一些處理,實現一對一的查詢
1
2
3
4
5
6
7
8
9
10
|
package com.itheima.one_to_one; ? import com.itheima.bean.card; ? import java.util.list; ? public interface cardmapper { //查詢全部 public abstract list<card> selectall(); } |
2.2.1 一對一查詢的模型
一對一查詢的需求:查詢一個用戶信息,與此同時查詢出該用戶對應的身份證信息
2.2.2 一對一查詢的語句
對應的sql語句:
1
2
3
|
select * from card; -- 只根據這個sql語句只能查詢出來card的數據 select * from person where id=#{id}; -- 需要根據card表中查詢出來的pid,再次查詢person數據才能將person數據也查詢出來 |
2.2.3 創建personmapper接口
1
2
3
4
5
|
public interface personmapper { //根據id查詢 @select ( "select * from person where id=#{id}" ) public abstract person selectbyid(integer id); } |
2.2.4 使用注解配置cardmapper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public interface cardmapper { //查詢全部 @select ( "select * from card" ) @results ({ @result (column = "id" ,property = "id" ), @result (column = "number" ,property = "number" ), @result ( property = "p" , // 被包含對象的變量名 javatype = person. class , // 被包含對象的實際數據類型 column = "pid" , // 根據查詢出的card表中的pid字段來查詢person表 /* one、@one 一對一固定寫法 select屬性:指定調用哪個接口中的哪個方法 */ one = @one (select = "com.itheima.one_to_one.personmapper.selectbyid" ) ) }) public abstract list<card> selectall(); } |
2.2.5 測試類
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
|
package com.itheima.one_to_one; import com.itheima.bean.card; 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.test; import java.io.inputstream; import java.util.list; public class test01 { @test public void selectall() throws exception{ //1.加載核心配置文件 inputstream is = resources.getresourceasstream( "mybatisconfig.xml" ); //2.獲取sqlsession工廠對象 sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(is); //3.通過工廠對象獲取sqlsession對象 sqlsession sqlsession = sqlsessionfactory.opensession( true ); //4.獲取cardmapper接口的實現類對象 cardmapper mapper = sqlsession.getmapper(cardmapper. class ); //5.調用實現類對象中的方法,接收結果 list<card> list = mapper.selectall(); //6.處理結果 for (card card : list) { system.out.println(card); } //7.釋放資源 sqlsession.close(); is.close(); } } |
結果
2.2.6 一對一配置總結
1
2
3
4
5
6
7
8
9
|
@results :封裝映射關系的父注解。 result[] value():定義了 result 數組 @result :封裝映射關系的子注解。 column 屬性:查詢出的表中字段名稱 property 屬性:實體對象中的屬性名稱 javatype 屬性:被包含對象的數據類型 one 屬性:一對一查詢固定屬性 @one :一對一查詢的注解。 select 屬性:指定調用某個接口中的方法 |
2.2.7 分析
2.3 一對多查詢
2.3.1 一對多查詢的模型
一對多查詢的需求:查詢一個課程,與此同時查詢出該該課程對應的學生信息
2.3.2 一對多查詢的語句
對應的sql語句:
1
2
3
|
select * from classes select * from student where cid=#{cid} |
2.3.3 創建studentmapper接口
1
2
3
4
5
|
public interface studentmapper { //根據cid查詢student表 @select ( "select * from student where cid=#{cid}" ) public abstract list<student> selectbycid(integer cid); } |
2.3.4 使用注解配置mapper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public interface classesmapper { //查詢全部 @select ( "select * from classes" ) @results ({ @result (column = "id" ,property = "id" ), @result (column = "name" ,property = "name" ), @result ( property = "students" , // 被包含對象的變量名 javatype = list. class , // 被包含對象的實際數據類型 column = "id" , // 根據查詢出的classes表的id字段來查詢student表 /* many、@many 一對多查詢的固定寫法 select屬性:指定調用哪個接口中的哪個查詢方法 */ many = @many (select = "com.itheima.one_to_many.studentmapper.selectbycid" ) ) }) public abstract list<classes> selectall(); } |
2.3.5 測試類
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
|
public class test01 { @test public void selectall() throws exception{ //1.加載核心配置文件 inputstream is = resources.getresourceasstream( "mybatisconfig.xml" ); //2.獲取sqlsession工廠對象 sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(is); //3.通過工廠對象獲取sqlsession對象 sqlsession sqlsession = sqlsessionfactory.opensession( true ); //4.獲取classesmapper接口的實現類對象 classesmapper mapper = sqlsession.getmapper(classesmapper. class ); //5.調用實現類對象中的方法,接收結果 list<classes> list = mapper.selectall(); //6.處理結果 for (classes cls : list) { system.out.println(cls.getid() + "," + cls.getname()); list<student> students = cls.getstudents(); for (student student : students) { system.out.println( "\t" + student); } } //7.釋放資源 sqlsession.close(); is.close(); } } |
2.3.6 一對多配置總結
1
2
3
4
5
6
7
8
9
|
@results :封裝映射關系的父注解。 result[] value():定義了 result 數組 @result :封裝映射關系的子注解。 column 屬性:查詢出的表中字段名稱 property 屬性:實體對象中的屬性名稱 javatype 屬性:被包含對象的數據類型 many 屬性:一對多查詢固定屬性 @many :一對多查詢的注解。 select 屬性:指定調用某個接口中的方法 |
2.3.7 分析
2.4 多對多查詢
2.4.1 多對多查詢的模型
多對多查詢的需求:查詢學生以及所對應的課程信息
2.4.2 多對多查詢的語句
對應的sql語句:
1
2
|
select distinct s.id,s.name,s.age from student s,stu_cr sc where sc.sid=s.id select c.id,c.name from stu_cr sc,course c where sc.cid=c.id and sc.sid=#{id} |
2.4.3 添加coursemapper 接口方法
1
2
3
4
5
|
public interface coursemapper { //根據學生id查詢所選課程 @select ( "select c.id,c.name from stu_cr sc,course c where sc.cid=c.id and sc.sid=#{id}" ) public abstract list<course> selectbysid(integer id); } |
2.4.4 使用注解配置mapper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public interface studentmapper { //查詢全部 @select ( "select distinct s.id,s.name,s.age from student s,stu_cr sc where sc.sid=s.id" ) @results ({ @result (column = "id" ,property = "id" ), @result (column = "name" ,property = "name" ), @result (column = "age" ,property = "age" ), @result ( property = "courses" , // 被包含對象的變量名 javatype = list. class , // 被包含對象的實際數據類型 column = "id" , // 根據查詢出student表的id來作為關聯條件,去查詢中間表和課程表 /* many、@many 一對多查詢的固定寫法 select屬性:指定調用哪個接口中的哪個查詢方法 */ many = @many (select = "com.itheima.many_to_many.coursemapper.selectbysid" ) ) }) public abstract list<student> selectall(); } |
2.4.5 測試類
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
|
public class test01 { @test public void selectall() throws exception{ //1.加載核心配置文件 inputstream is = resources.getresourceasstream( "mybatisconfig.xml" ); //2.獲取sqlsession工廠對象 sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(is); //3.通過工廠對象獲取sqlsession對象 sqlsession sqlsession = sqlsessionfactory.opensession( true ); //4.獲取studentmapper接口的實現類對象 studentmapper mapper = sqlsession.getmapper(studentmapper. class ); //5.調用實現類對象中的方法,接收結果 list<student> list = mapper.selectall(); //6.處理結果 for (student student : list) { system.out.println(student.getid() + "," + student.getname() + "," + student.getage()); list<course> courses = student.getcourses(); for (course cours : courses) { system.out.println( "\t" + cours); } } //7.釋放資源 sqlsession.close(); is.close(); } } |
2.4.6 多對多配置總結
1
2
3
4
5
6
7
8
9
|
@results :封裝映射關系的父注解。 result[] value():定義了 result 數組 @result :封裝映射關系的子注解。 column 屬性:查詢出的表中字段名稱 property 屬性:實體對象中的屬性名稱 javatype 屬性:被包含對象的數據類型 many 屬性:一對多查詢固定屬性 @many :一對多查詢的注解。 select 屬性:指定調用某個接口中的方法 |
2.4.7 分析
三.構建sql
3.1 sql構建對象介紹
我們之前通過注解開發時,相關 sql 語句都是自己直接拼寫的。一些關鍵字寫起來比較麻煩、而且容易出錯。
mybatis 給我們提供了 org.apache.ibatis.jdbc.sql 功能類,專門用于構建 sql 語句
創建項目:將之前的注解的所有相關代碼,配置文件拿過來
新建測試類: com.itheima.sql.sqltest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.itheima.sql; public class sqltest { public static void main(string[] args) { string sql = getsql(); system.out.println(sql); } //定義方法,獲取查詢student表的sql語句 public static string getsql() { string sql = "select * from student" ; return sql; } } |
如果sql語句比較長,sql中的關鍵字較多時,就可能會寫錯
修改代碼:使用sql類通過的方法來編寫sql語句
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
|
package com.itheima.sql; import org.apache.ibatis.jdbc.sql; public class sqltest { public static void main(string[] args) { string sql = getsql(); system.out.println(sql); } //定義方法,獲取查詢student表的sql語句 /*public static string getsql() { string sql = "select * from student"; return sql; }*/ public static string getsql() { string sql = new sql(){ //通過sql類提供的方法來實現sql語句的編寫 { select( "*" ); from( "student" ); } }.tostring(); return sql; } } |
結果
3.2 查詢功能的實現
定義功能類并提供獲取查詢的 sql 語句的方法
新建類:com.itheima.sql.returnsql,定義獲取sql語句的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package com.itheima.sql; import org.apache.ibatis.jdbc.sql; public class returnsql { //定義方法,返回查詢的sql語句 public string getselectall() { return new sql() { { select( "*" ); from( "student" ); } }.tostring(); //以上代碼說明:內層的花括號是一個構造代碼塊,在實例化一個對象時會先于構造方法執行,編譯時會將構造代碼塊移入構造方法中 //如果上述不理解,可以使用以下方式:builder風格 string sql = new sql() .select( "*" ) .from( "student" ) .tostring(); return sql; } } |
- 那么如何獲取這個提供了sql語句的方法呢?
- 之前是在mapper接口中直接通過注解(@select,@insert等)來設置的sql
- 現在有提供了sql語句的方法,如何獲取呢?
- 通過@selectprovider注解來獲取
@selectprovider:生成查詢用的 sql 語句注解( 調用提供sql語句的方法,獲取到查詢的sql語句 )
type 屬性:用于指定生成 sql 語句功能的類對象
method 屬性:用于指定類中要執行獲取sql語句的方法 (指定方法名,不加小括號)
修改studentmapper
1
2
3
4
5
|
//查詢全部 //@select("select * from student") //注意:method只是指定一個方法的名字,selectprovider內部會自己調用 @selectprovider (type = returnsql. class , method = "getselectall" ) public abstract list<student> selectall(); |
運行test包中的test01的selectall方法,能查詢出數據即可
3.3 新增功能的實現
定義功能類并提供獲取新增的 sql 語句的方法,在returnsql中增加如下方法:
1
2
3
4
5
6
7
8
9
|
//定義方法,返回新增的sql語句 public string getinsert(student stu) { return new sql() { { insert_into( "student" ); into_values( "#{id},#{name},#{age}" ); } }.tostring(); } |
@insertprovider:生成新增用的 sql 語句注解( 調用提供sql語句的方法,獲取到新增的sql語句 )
type 屬性:生成 sql 語句功能類對象
method 屬性:指定調用方法
修改studentmapper
1
2
3
4
|
//新增功能 //@insert("insert into student values (#{id},#{name},#{age})") @insertprovider (type = returnsql. class , method = "getinsert" ) public abstract integer insert(student stu); |
運行test包中的test01的insert方法,能插入數據即可
3.4 修改功能的實現
定義功能類并提供獲取修改的 sql 語句的方法
1
2
3
4
5
6
7
8
9
10
|
//定義方法,返回修改的sql語句 public string getupdate(student stu) { return new sql() { { update( "student" ); set( "name=#{name}" , "age=#{age}" ); where( "id=#{id}" ); } }.tostring(); } |
@updateprovider:生成修改用的 sql 語句注解( 調用提供sql語句的方法,獲取到更新的sql語句 )
type 屬性:生成 sql 語句功能類對象
method 屬性:指定調用方法
修改studentmapper
1
2
3
4
|
//修改功能 //@update("update student set name=#{name},age=#{age} where id=#{id}") @updateprovider (type = returnsql. class , method = "getupdate" ) public abstract integer update(student stu); |
運行test包中的test01的update方法,能更新數據即可
3.5 刪除功能的實現
定義功能類并提供獲取刪除的 sql 語句的方法
1
2
3
4
5
6
7
8
9
|
//定義方法,返回刪除的sql語句 public string getdelete(integer id) { return new sql() { { delete_from( "student" ); where( "id=#{id}" ); } }.tostring(); } |
@deleteprovider:生成刪除用的 sql 語句注解( 調用提供sql語句的方法,獲取到刪除的sql語句 )
type 屬性:生成 sql 語句功能類對象
method 屬性:指定調用方法
修改studentmapper
1
2
3
4
|
//刪除功能 //@delete("delete from student where id=#{id}") @deleteprovider (type = returnsql. class , method = "getdelete" ) public abstract integer delete(integer id); |
運行test包中的test01的delete方法,能刪除數據即可
四.綜合案例 ***
4.1 系統介紹
我們之前在做學生管理系統時,使用的是原始jdbc操作數據庫的,操作非常麻煩,現在我們使用mybatis操作數據庫,簡化dao的開發。
4.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
25
26
27
28
29
30
31
32
33
|
-- 創建db3數據庫 create database db3; -- 使用db3數據庫 use db3; -- 創建用戶表 create table user( uid varchar( 50 ) primary key, -- 用戶id ucode varchar( 50 ), -- 用戶標識 loginname varchar( 100 ), -- 登錄用戶名 password varchar( 100 ), -- 登錄密碼 username varchar( 100 ), -- 用戶名 gender varchar( 10 ), -- 用戶性別 birthday date, -- 出生日期 dutydate date -- 入職日期 ); -- 添加一條測試數據 insert into user values ( '11111111' , 'zhangsan001' , 'zhangsan' , '1234' , '張三' , '男' , '2008-10-28' , '2018-10-28' ); -- 創建student表 create table student( sid int primary key auto_increment, -- 學生id name varchar( 20 ), -- 學生姓名 age int , -- 學生年齡 birthday date -- 學生生日 ); -- 添加數據 insert into student values ( null , '張三' , 23 , '1999-09-23' ),( null , '李四' , 24 , '1998-08-10' ), ( null , '王五' , 25 , '1996-06-06' ),( null , '趙六' , 26 , '1994-10-20' ); |
將之前的“jdbc基礎網頁版”項目copy過來
運行起來:注意這個項目的虛擬目錄必須是/,因為界面中的鏈接寫死了
輸入zhangsan,1234,登陸進去,我們現在要處理的是 在校學生管理:
在這里,可以對學生進行增刪改查,之前是通過jdbc實現的這些功能,現在我們需要通過mybatis來實現
增加jar包:
復制相關的配置文件:log4j和mybatisconfig
修改config.properties(這個其實就是jdbc配置文件)
1
2
3
4
|
driver=com.mysql.jdbc.driver url=jdbc:mysql: //192.168.59.143:3306/db3 username=root password=itheima |
修改mybatisconfig主配置文件:
1
2
3
4
5
6
7
|
<!--引入數據庫連接的配置文件--> <properties resource= "config.properties" /> 起別名的配置刪掉 <!--配置映射關系--> <mappers> < package name= "com.itheima.dao" /> </mappers> |
刪除studentdaoimpl,我們不需要實現類,我們會通過接口代理的方式來實現
修改studentdao,給接口方法通過注解的方式配置sql語句
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
|
package com.itheima.dao; import com.itheima.domain.student; import org.apache.ibatis.annotations.delete; import org.apache.ibatis.annotations.insert; import org.apache.ibatis.annotations.select; import org.apache.ibatis.annotations.update; import java.util.arraylist; /* dao層接口 */ public interface studentdao { //查詢所有學生信息 @select ( "select * from student" ) public abstract arraylist<student> findall(); //條件查詢,根據id獲取學生信息 @select ( "select * from student where sid=#{sid}" ) public abstract student findbyid(integer sid); //新增學生信息 @insert ( "insert into student values (#{sid},#{name},#{age},#{birthday})" ) public abstract int insert(student stu); //修改學生信息 @update ( "update student set name=#{name},age=#{age},birthday=#{birthday} where sid=#{sid}" ) public abstract int update(student stu); //刪除學生信息 @delete ( "delete from student where sid=#{sid}" ) public abstract int delete(integer sid); } |
修改studentserviceimpl,刪除之前的daoimpl的邏輯
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
|
package com.itheima.service.impl; import com.itheima.domain.student; import com.itheima.service.studentservice; import java.util.list; /** * 學生的業務層實現類 * @author 黑馬程序員 * @company http://www.itheima.com */ public class studentserviceimpl implements studentservice { @override public list<student> findall() { } @override public student findbyid(integer sid) { } @override public void save(student student) { } @override public void update(student student) { } @override public void delete(integer sid) { } } |
4.3 代碼改造
我們主要是將原來的jdbc實現的方式改為mybatis實現
新建com.itheima.utils.mybatisutils.java
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
|
package com.itheima.utils; 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 java.io.ioexception; /* 工具類 */ public class mybatisutils { // 私有構造方法 private mybatisutils(){} // 聲明連接工廠對象 private static sqlsessionfactory sqlsessionfactory; // 靜態代碼塊,讀取核心配置文件并工廠對象賦值 static { try { sqlsessionfactory = new sqlsessionfactorybuilder().build(resources.getresourceasstream( "mybatisconfig.xml" )); } catch (ioexception e) { e.printstacktrace(); } } // 提供靜態方法,返回sqlsession對象 public static sqlsession getsqlsession() { return sqlsessionfactory.opensession( true ); } } |
修改studentserviceimpl代碼
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
package com.itheima.service.impl; import com.itheima.dao.studentdao; import com.itheima.domain.student; import com.itheima.service.studentservice; import com.itheima.utils.mybatisutils; import org.apache.ibatis.session.sqlsession; import java.util.arraylist; import java.util.list; /** * 學生的業務層實現類 * @author 黑馬程序員 * @company http://www.itheima.com */ public class studentserviceimpl implements studentservice { @override public list<student> findall() { // 獲取sqlsession對象 sqlsession sqlsession = mybatisutils.getsqlsession(); // 獲取studentdao接口的實現類對象 studentdao mapper = sqlsession.getmapper(studentdao. class ); // 調用實現類對象相應的功能 arraylist<student> list = mapper.findall(); // 釋放資源 sqlsession.close(); // 返回結果 return list; } @override public student findbyid(integer sid) { // 獲取sqlsession對象 sqlsession sqlsession = mybatisutils.getsqlsession(); // 獲取studentdao接口的實現類對象 studentdao mapper = sqlsession.getmapper(studentdao. class ); // 調用實現類對象相應的功能 student stu = mapper.findbyid(sid); // 釋放資源 sqlsession.close(); // 返回結果 return stu; } @override public void save(student student) { // 獲取sqlsession對象 sqlsession sqlsession = mybatisutils.getsqlsession(); // 獲取studentdao接口的實現類對象 studentdao mapper = sqlsession.getmapper(studentdao. class ); // 調用實現類對象相應的功能 mapper.insert(student); // 釋放資源 sqlsession.close(); } @override public void update(student student) { // 獲取sqlsession對象 sqlsession sqlsession = mybatisutils.getsqlsession(); // 獲取studentdao接口的實現類對象 studentdao mapper = sqlsession.getmapper(studentdao. class ); // 調用實現類對象相應的功能 mapper.update(student); // 釋放資源 sqlsession.close(); } @override public void delete(integer sid) { // 獲取sqlsession對象 sqlsession sqlsession = mybatisutils.getsqlsession(); // 獲取studentdao接口的實現類對象 studentdao mapper = sqlsession.getmapper(studentdao. class ); // 調用實現類對象相應的功能 mapper.delete(sid); // 釋放資源 sqlsession.close(); } } package com.itheima.service.impl; import com.itheima.dao.studentdao; import com.itheima.domain.student; import com.itheima.service.studentservice; import com.itheima.utils.mybatisutils; import org.apache.ibatis.session.sqlsession; import java.util.arraylist; import java.util.list; /** * 學生的業務層實現類 * @author 黑馬程序員 * @company http://www.itheima.com */ public class studentserviceimpl implements studentservice { @override public list<student> findall() { // 獲取sqlsession對象 sqlsession sqlsession = mybatisutils.getsqlsession(); // 獲取studentdao接口的實現類對象 studentdao mapper = sqlsession.getmapper(studentdao. class ); // 調用實現類對象相應的功能 arraylist<student> list = mapper.findall(); // 釋放資源 sqlsession.close(); // 返回結果 return list; } @override public student findbyid(integer sid) { // 獲取sqlsession對象 sqlsession sqlsession = mybatisutils.getsqlsession(); // 獲取studentdao接口的實現類對象 studentdao mapper = sqlsession.getmapper(studentdao. class ); // 調用實現類對象相應的功能 student stu = mapper.findbyid(sid); // 釋放資源 sqlsession.close(); // 返回結果 return stu; } @override public void save(student student) { // 獲取sqlsession對象 sqlsession sqlsession = mybatisutils.getsqlsession(); // 獲取studentdao接口的實現類對象 studentdao mapper = sqlsession.getmapper(studentdao. class ); // 調用實現類對象相應的功能 mapper.insert(student); // 釋放資源 sqlsession.close(); } @override public void update(student student) { // 獲取sqlsession對象 sqlsession sqlsession = mybatisutils.getsqlsession(); // 獲取studentdao接口的實現類對象 studentdao mapper = sqlsession.getmapper(studentdao. class ); // 調用實現類對象相應的功能 mapper.update(student); // 釋放資源 sqlsession.close(); } @override public void delete(integer sid) { // 獲取sqlsession對象 sqlsession sqlsession = mybatisutils.getsqlsession(); // 獲取studentdao接口的實現類對象 studentdao mapper = sqlsession.getmapper(studentdao. class ); // 調用實現類對象相應的功能 mapper.delete(sid); // 釋放資源 sqlsession.close(); } } |
員工管理也有增刪改查,大家可以作為課下作業
到此這篇關于mybatis注解開發單表、多表操作的實現代碼的文章就介紹到這了,更多相關mybatis注解開發內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:http://www.cnblogs.com/859630097com/p/14439046.html