經過上一小節,mybatis 和 jdbc 的區別:http://www.cnblogs.com/ysocean/p/7271600.html,咱們對 mybatis有了一個大體的瞭解,下面咱們經過一個入門實例來對mybatis有更近一步的瞭解。html
咱們用 mybatis 來對 user 表進行增刪改查操做。java
ps:本篇博客源代碼連接:http://pan.baidu.com/s/1eSEfc8i 密碼:j480mysql
這裏咱們就不寫腳本建立了,建立完成後,再向其中插入幾條數據便可。spring
user 表字段以下:sql
注意:log4j和Junit不是必須的,可是咱們爲了查看日誌以及便於測試,加入了這兩個jar包數據庫
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 實例只能選擇一個運行環境
1、development:開發模式
2、work:工做模式-->
<environments
default
=
"development"
>
<!--id屬性必須和上面的
default
同樣 -->
<environment id=
"development"
>
<!--事務管理器
1、JDBC:這個配置直接簡單使用了 JDBC 的提交和回滾設置。它依賴於從數據源獲得的鏈接來管理事務範圍
2、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>
|
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
|
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 +
"]"
;
}
}
|
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
|
<?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>
|
1
2
3
4
5
|
<mappers>
<!-- 註冊userMapper.xml文件,
userMapper.xml位於com.ys.mapper這個包下,因此resource寫成com/ys/mapper/userMapper.xml-->
<mapper resource=
"com/ys/mapper/userMapper.xml"
/>
</mappers>
|
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
|
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();
}
}
|
第一種:數據庫設置主鍵自增機制apache
userMapper.xml 文件中定義:服務器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<!-- 向 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>
|
測試:session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//向 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();
}
|
第二種:非自增主鍵機制mybatis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!-- 向 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
若是接收 pojo 對象值,經過 OGNL 讀取對象中的屬性值,即屬性.屬性.屬性...的方式獲取屬性值