天天看點

mybatis 詳解(二)------入門執行個體(基于XML)

通過上一小節,我們對 mybatis有了一個大緻的了解,下面我們通過一個入門執行個體來對mybatis有更近一步的了解。

  我們用 mybatis 來對 user 表進行增删改查操作。

   ps:本篇部落格源代碼連結:http://pan.baidu.com/s/1eSEfc8i 密碼:j480

1、建立MySQL資料庫:mybatisDemo和表:user

  這裡我們就不寫腳本建立了,建立完成後,再向其中插入幾條資料即可。

  user 表字段如下:

  

mybatis 詳解(二)------入門執行個體(基于XML)
mybatis 詳解(二)------入門執行個體(基于XML)

2、建立一個Java工程,并導入相應的jar包,具體目錄如下

  注意:log4j和Junit不是必須的,但是我們為了檢視日志以及便于測試,加入了這兩個jar包

mybatis 詳解(二)------入門執行個體(基于XML)

3、在 MyBatisTest 工程中添加資料庫配置檔案 mybatis-configuration.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

30

31

32

33

<?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>

<!-- 注意:environments标簽,當mybatis和spring整合之後,這個标簽是不用配置的 -->

<!-- 可以配置多個運作環境,但是每個 SqlSessionFactory 執行個體隻能選擇一個運作環境  

一、development:開發模式

二、work:工作模式-->

<environments

default

=

"development"

>

<!--id屬性必須和上面的

default

一樣  -->

<environment id=

"development"

>

<!--事務管理器

一、JDBC:這個配置直接簡單使用了 JDBC 的送出和復原設定。它依賴于從資料源得到的連接配接來管理事務範圍

二、MANAGED:這個配置幾乎沒做什麼。它從來不送出或復原一個連接配接。而它會讓容器來管理事務的整個生命周期

比如 spring 或 JEE 應用伺服器的上下文,預設情況下,它會關閉連接配接。然而一些容器并不希望這樣,

是以如果你需要從連接配接中停止它,就可以将 closeConnection 屬性設定為

false

,比如:

<transactionManager type=

"MANAGED"

>

<property name=

"closeConnection"

value=

"false"

/>

</transactionManager>

-->

<transactionManager type=

"JDBC"

/>

<!--dataSource 元素使用标準的 JDBC 資料源接口來配置 JDBC 連接配接對象源  -->

<dataSource type=

"POOLED"

>

<property name=

"driver"

value=

"com.mysql.jdbc.Driver"

/>

<property name=

"url"

value=

"jdbc:mysql://localhost:3306/mybatisdemo"

/>

<property name=

"username"

value=

"root"

/>

<property name=

"password"

value=

"root"

/>

</dataSource>

</environment>

</environments>

</configuration>

4、定義表所對應的實體類

mybatis 詳解(二)------入門執行個體(基于XML)

34

35

36

37

38

39

40

41

42

43

44

45

46

package

com.ys.po;

import

java.util.Date;

public

class

User {

private

int

id;

private

String username;

private

String sex;

private

Date birthday;

private

String address;

public

int

getId() {

return

id;

}

public

void

setId(

int

id) {

this

.id = id;

}

public

String getUsername() {

return

username;

}

public

void

setUsername(String username) {

this

.username = username;

}

public

String getSex() {

return

sex;

}

public

void

setSex(String sex) {

this

.sex = sex;

}

public

Date getBirthday() {

return

birthday;

}

public

void

setBirthday(Date birthday) {

this

.birthday = birthday;

}

public

String getAddress() {

return

address;

}

public

void

setAddress(String address) {

this

.address = address;

}

@Override

public

String toString() {

return

"User [id="

+ id +

", username="

+ username +

", sex="

+ sex

+

", birthday="

+ birthday +

", address="

+ address +

"]"

;

}

}

5、定義操作 user 表的sql映射檔案userMapper.xml  

mybatis 詳解(二)------入門執行個體(基于XML)

47

48

49

50

51

52

<?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.ys.po.userMapper"

>

<!-- 根據 id 查詢 user 表中的資料

id:唯一辨別符,此檔案中的id值不能重複

resultType:傳回值類型,一條資料庫記錄也就對應實體類的一個對象

parameterType:參數類型,也就是查詢條件的類型

-->

<select id=

"selectUserById"

resultType=

"com.ys.po.User"

parameterType=

"int"

>

<!-- 這裡和普通的sql 查詢語句差不多,對于隻有一個參數,後面的 #{id}表示占位符,裡面不一定要寫id,寫啥都可以,但是不要空着,如果有多個參數則必須寫pojo類裡面的屬性 -->

select * from user where id = #{id}

</select>

<!-- 查詢 user 表的所有資料

注意:因為是查詢所有資料,是以傳回的應該是一個集合,這個集合裡面每個元素都是User類型

-->

<select id=

"selectUserAll"

resultType=

"com.ys.po.User"

>

select * from user

</select>

<!-- 模糊查詢:根據 user 表的username字段

下面兩種寫法都可以,但是要注意

1

、${value}裡面必須要寫value,不然會報錯

2

、${}表示拼接 sql 字元串,将接收到的參數不加任何修飾拼接在sql語句中

3

、使用${}會造成 sql 注入

-->

<select id=

"selectLikeUserName"

resultType=

"com.ys.po.User"

parameterType=

"String"

>

select * from user where username like

'%${value}%'

<!-- select * from user where username like #{username} -->

</select>

<!-- 向 user 表插入一條資料 -->

<insert id=

"insertUser"

parameterType=

"com.ys.po.User"

>

insert into user(id,username,sex,birthday,address)

value(#{id},#{username},#{sex},#{birthday},#{address})

</insert>

<!-- 根據 id 更新 user 表的資料 -->

<update id=

"updateUserById"

parameterType=

"com.ys.po.User"

>

update user set username=#{username} where id=#{id}

</update>

<!-- 根據 id 删除 user 表的資料 -->

<delete id=

"deleteUserById"

parameterType=

"int"

>

delete from user where id=#{id}

</delete>

</mapper>

6、向 mybatis-configuration.xml 配置檔案中注冊 userMapper.xml 檔案

mybatis 詳解(二)------入門執行個體(基于XML)

<mappers>

<!-- 注冊userMapper.xml檔案,

userMapper.xml位于com.ys.mapper這個包下,是以resource寫成com/ys/mapper/userMapper.xml-->

<mapper resource=

"com/ys/mapper/userMapper.xml"

/>

</mappers>

 7、建立測試類

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

package

com.ys.test;

import

java.io.InputStream;

import

java.util.List;

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.ys.po.User;

public

class

CRUDTest {

//定義 SqlSession

SqlSession session =

null

;

@Before

public

void

init(){

//定義mybatis全局配置檔案

String resource =

"mybatis-configuration.xml"

;

//加載 mybatis 全局配置檔案

InputStream inputStream = CRUDTest.

class

.getClassLoader()

.getResourceAsStream(resource);

//建構sqlSession的工廠

SqlSessionFactory sessionFactory =

new

SqlSessionFactoryBuilder().build(inputStream);

//根據 sqlSessionFactory 産生 session

session = sessionFactory.openSession();

}

//根據id查詢user表資料

@Test

public

void

testSelectUserById(){

/*這個字元串由 userMapper.xml 檔案中 兩個部分構成

<mapper namespace="com.ys.po.userMapper"> 的 namespace 的值

<select id="selectUserById" > id 值*/

String statement =

"com.ys.po.userMapper.selectUserById"

;

User user = session.selectOne(statement,

1

);

System.out.println(user);

session.close();

}

//查詢所有user表所有資料

@Test

public

void

testSelectUserAll(){

String statement =

"com.ys.po.userMapper.selectUserAll"

;

List<User> listUser = session.selectList(statement);

for

(User user : listUser){

System.out.println(user);

}

session.close();

}

//模糊查詢:根據 user 表的username字段

@Test

public

void

testSelectLikeUserName(){

String statement =

"com.ys.po.userMapper.selectLikeUserName"

;

List<User> listUser = session.selectList(statement,

"%t%"

);

for

(User user : listUser){

System.out.println(user);

}

session.close();

}

//向 user 表中插入一條資料

@Test

public

void

testInsertUser(){

String statement =

"com.ys.po.userMapper.insertUser"

;

User user =

new

User();

user.setUsername(

"Bob"

);

user.setSex(

"女"

);

session.insert(statement, user);

//送出插入的資料

session.commit();

session.close();

}

//根據 id 更新 user 表的資料

@Test

public

void

testUpdateUserById(){

String statement =

"com.ys.po.userMapper.updateUserById"

;

//如果設定的 id不存在,那麼資料庫沒有資料更改

User user =

new

User();

user.setId(

4

);

user.setUsername(

"jim"

);

session.update(statement, user);

session.commit();

session.close();

}

//根據 id 删除 user 表的資料

@Test

public

void

testDeleteUserById(){

String statement =

"com.ys.po.userMapper.deleteUserById"

;

session.delete(statement,

4

);

session.commit();

session.close();

}

}

補充:如何得到插入資料之後的主鍵值?

第一種:資料庫設定主鍵自增機制

    userMapper.xml 檔案中定義:

<!-- 向 user 表插入一條資料 -->

<insert id=

"insertUser"

parameterType=

"com.ys.po.User"

>

<!-- 将插入的資料主鍵傳回到 user 對象中

keyProperty:将查詢到的主鍵設定到parameterType 指定到對象的那個屬性

select LAST_INSERT_ID():查詢上一次執行insert 操作傳回的主鍵id值,隻适用于自增主鍵

resultType:指定 select LAST_INSERT_ID() 的結果類型

order:AFTER,相對于 select LAST_INSERT_ID()操作的順序

-->

<selectKey keyProperty=

"id"

resultType=

"int"

order=

"AFTER"

>

select LAST_INSERT_ID()

</selectKey>

insert into user(username,sex,birthday,address)

value(#{username},#{sex},#{birthday},#{address})

</insert>

    測試:

//向 user 表中插入一條資料并擷取主鍵值

@Test

public

void

testInsertUser(){

String statement =

"com.ys.po.userMapper.insertUser"

;

User user =

new

User();

user.setUsername(

"Bob"

);

user.setSex(

"女"

);

session.insert(statement, user);

//送出插入的資料

session.commit();

//列印主鍵值

System.out.println(user.getId());

session.close();

}

第二種:非自增主鍵機制

<!-- 向 user 表插入一條資料 -->

<insert id=

"insertUser"

parameterType=

"com.ys.po.User"

>

<!-- 将插入的資料主鍵傳回到 user 對象中

流程是:首先通過 select UUID()得到主鍵值,然後設定到 user 對象的id中,在進行 insert 操作

keyProperty:将查詢到的主鍵設定到parameterType 指定到對象的那個屬性

select UUID():得到主鍵的id值,注意這裡是字元串

resultType:指定 select UUID() 的結果類型

order:BEFORE,相對于 select UUID()操作的順序

-->

<selectKey keyProperty=

"id"

resultType=

"String"

order=

"BEFORE"

>

select UUID()

</selectKey>

insert into user(id,username,sex,birthday,address)

value(#{id},#{username},#{sex},#{birthday},#{address})

</insert>

    

總結:

  ①、parameterType:指定輸入參數的類型

  ②、resultType:指定輸出結果的類型,在select中如果查詢結果是集合,那麼也表示集合中每個元素的類型

  ③、#{}:表示占位符,用來接收輸入參數,類型可以是簡單類型,pojo,HashMap等等

    如果接收簡單類型,#{}可以寫成 value 或者其他名稱

    如果接收 pojo 對象值,通過 OGNL 讀取對象中的屬性值,即屬性.屬性.屬性...的方式擷取屬性值

  ④、${}:表示一個拼接符,會引起 sql 注入,不建議使用  

    用來接收輸入參數,類型可以是簡單類型,pojo,HashMap等等

    如果接收簡單類型,${}裡面隻能是 value