上一篇《javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(一)》已經(jīng)把實(shí)體類,分頁(yè)工具創(chuàng)建好了,這一篇利用mybatis創(chuàng)建DAO層.
另外mybatis的api文檔可以參考
一.mybatis的使用
1. 引入架包
這里引入mybatis和mysql的架包到lib中
2. 編寫Config.xml配置數(shù)據(jù)庫(kù)環(huán)境
先貼代碼,然后逐個(gè)解釋
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
|
<? 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 > < properties resource = "Config.properties" /> < typeAliases > < package name = "com.model" /> </ typeAliases > < environments default = "development" > < environment id = "development" > < transactionManager type = "JDBC" /> < dataSource type = "POOLED" > < property name = "driver" value = "${driver}" /> < property name = "url" value = "${url}" /> < property name = "username" value = "${username}" /> < property name = "password" value = "${password}" /> </ dataSource > </ environment > <!--第二個(gè)環(huán)境--> < environment id = "publish" > < transactionManager type = "JDBC" /> < dataSource type = "POOLED" /> </ environment > </ environments > </ configuration > |
第一步是要引入xml文件格式,也就是dtd,這個(gè)要直接復(fù)制mybatis提供的模版
1
2
3
|
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> |
問題1
properties 功能是配置相應(yīng)的properties文件,resource是指定相應(yīng)的路線,properties文件里面我們可以配置數(shù)據(jù)庫(kù)驅(qū)動(dòng),url,用戶名,密碼等,參考下面,這樣的話mybatis就會(huì)自動(dòng)讀取下面的參數(shù),你可以在xml中用${}來(lái)引用.
1
2
3
4
|
driver = com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/shop username=root password=123456 |
問題2
typeAliases配置指定路徑下的別名,我們可以配置單個(gè)別名
單個(gè)名稱<typeAlias type="com.model.User" alias="User"/>這樣就把com.model.User修改為別名User,后面就不需要寫全部名稱了,只需要User即可代替
批量修改<package name="com.model"/>這樣就可以把一個(gè)包的類全部修改,默認(rèn)別名為實(shí)體類類名
問題3
environments是配置數(shù)據(jù)庫(kù)環(huán)境的,可以配置多個(gè)環(huán)境,例如開發(fā)環(huán)境和發(fā)布環(huán)境,default是指默認(rèn)環(huán)境
environment注意沒有s,代表environments下的一個(gè)環(huán)境,通過id區(qū)分,因此id必須唯一
transactionManager代表連接數(shù)據(jù)庫(kù)類型,JDBC連接java
dataSource配置數(shù)據(jù)源模式,pooled就是連接池模式,具體其他模式可以去官方文檔看下,根據(jù)需要選擇
property這個(gè)就是配置數(shù)據(jù)庫(kù)連接了,name不用動(dòng),修改value=”driver",這里是用{}是讀取最上方properties 這個(gè)文件里面的配置,這里注意匹配名稱才能讀取進(jìn)來(lái)的哈
3.編寫mapper映射sql語(yǔ)句
這里編寫UserDao的load方法,也就是根據(jù)id讀取一個(gè)用戶,下面代碼就是相當(dāng)于public User load(int id)函數(shù)
對(duì)于mybatis有兩種替換#{}替換會(huì)根據(jù)類型自動(dòng)帶上引號(hào),例如string類型#{name}替換后為'name'.另一種是${}替換,這種是與按照原格式直接替換,不會(huì)添加其他東西
1
2
3
4
5
6
7
8
9
|
<? 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 > < select id = "load" parameterType = "int" resultType = "User" > SELECT * from user WHERE id=#{id} </ select > </ mapper > |
第一步還是引入dtd頭文件,制定xml文件規(guī)則
select 標(biāo)簽,說(shuō)明當(dāng)前是一個(gè)select語(yǔ)句
id屬性,相當(dāng)于是函數(shù)名,通過id引用
parameterType屬性,代表傳入?yún)?shù)類型,可以指定基本類型,也可以是自定義類型,是自定義類型的話,會(huì)自動(dòng)調(diào)用其get方法,獲取其屬性
resultType屬性,返回值類型,可以直接自定義類型,會(huì)自動(dòng)調(diào)用set方法把查詢出來(lái)的參數(shù)設(shè)置進(jìn)去
更多屬性在后續(xù)文章中使用到再說(shuō).
4.調(diào)用mapper映射
調(diào)用之前需要先在Config.xml中配置映射,注意這里配置的xml是文件路徑哈
1
2
3
|
< mappers > < mapper resource = "com/model/User.xml" /> </ mappers > |
然后寫測(cè)試類
1
2
3
4
5
6
7
8
9
10
11
12
|
public static void main(String[] args) { try { InputStream is = Resources.getResourceAsStream( "Config.xml" ); //讀取配置文件 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); //利用配置文件創(chuàng)建factory SqlSession session = factory.openSession(); //獲取session User user = session.selectOne(User. class .getName()+ ".load" , 1 ); //調(diào)用load函數(shù) System.out.println(user.getNickname()); //輸出昵稱 session.close(); //關(guān)閉session } catch (IOException e) { e.printStackTrace(); } } |
結(jié)果:
5.Sqlsession工具類
像上面那樣寫測(cè)試類太麻煩,就把Sqlsession封裝下,方便DAO層的使用
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
|
package com.util; 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; import java.io.InputStream; /** * Created by nl101 on 2016/2/23. */ public class SessionUtil { private static SqlSessionFactory factory= null ; static { try { InputStream is = Resources.getResourceAsStream( "Config.xml" ); //讀取配置文件 factory = new SqlSessionFactoryBuilder().build(is); //利用配置文件創(chuàng)建factory } catch (IOException e) { e.printStackTrace(); } } /** * 獲取session * @return */ public static SqlSession getSession(){ return factory.openSession(); } /** * 關(guān)閉session * @param session */ public static void closeSession(SqlSession session){ if (session!= null ) session.close(); session = null ; } } |
以上就是mybatis的基本使用,下面開始封裝DAO層
二.封裝DAO
1.UserDao.java
public User load(int id)根據(jù)id獲取一個(gè)User
上面已經(jīng)寫過了
public boolean add(User user) 增加一個(gè)用戶
XML代碼
1
2
3
4
5
|
<!--增加一個(gè)用戶--> < insert id = "add" parameterType = "User" > INSERT INTO user VALUES (null,#{username},#{password},#{nickname},#{type}) </ insert > |
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
|
/** /** * 添加一個(gè)用戶 * @param user 要添加的用戶 * @return true成功 */ public boolean add(User user){ int isAdd = 0 ; SqlSession session = SessionUtil.getSession(); try { isAdd = session.insert(User. class .getName()+ ".add" ,user); session.commit(); //提交 } catch (Exception e) { session.rollback(); //提交失敗則回滾 } finally { SessionUtil.closeSession(session); } System.out.println(isAdd); return isAdd> 0 ; } public boolean delete( int id)刪除一個(gè)用戶 |
xml代碼
1
2
3
4
|
<!--刪除一個(gè)用戶--> < delete id = "delete" parameterType = "int" > DELETE FROM user WHERE id=#{id} </ delete > |
java代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/** *根據(jù)id刪除用戶 * @param id 要?jiǎng)h除用戶的id * @return true成功 */ public boolean delete( int id){ int isDelete = 0 ; SqlSession session = SessionUtil.getSession(); try { isDelete = session.delete(User. class .getName()+ ".delete" ,id); session.commit(); } catch (Exception e) { session.rollback(); //失敗返回 System.out.println( "刪除用戶失敗" ); e.printStackTrace(); } finally { SessionUtil.closeSession(session); } return isDelete> 0 ; } public boolean update(User user)更新用戶 |
xml代碼
1
2
3
4
|
<!--修改一個(gè)用戶--> < update id = "update" parameterType = "User" > UPDATE user SET username=#{username},password=#{password},nickname=#{nickname},type=#{type} where id=#{id} </ update > |
java代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/** *更新用戶 * @param user 要更新的用戶 * @return true成功 */ public boolean update(User user){ int isUpdate = 0 ; SqlSession session = SessionUtil.getSession(); try { isUpdate = session.delete(User. class .getName()+ ".update" ,user); session.commit(); } catch (Exception e) { session.rollback(); //失敗返回 System.out.println( "更新用戶失敗" ); e.printStackTrace(); } finally { SessionUtil.closeSession(session); } return isUpdate> 0 ; } public User login(String username, String password)判斷用戶是否存在 |
xml代碼
1
2
3
4
|
<!--用戶登錄判斷--> <select id= "login" parameterType= "String" resultType= "User" > SELECT * FROM user WHERE username=#{username} </select> |
java代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/** * 判斷一個(gè)用戶是否存在 * @param username 用戶名 * @param password 密碼 * @return 存在返回User 不存在返回null */ public User login(String username, String password){ User user = null ; SqlSession session = SessionUtil.getSession(); try { user = session.selectOne(SOAPBinding.Use. class .getName()+ ".login" ,username); //當(dāng)密碼不對(duì)的時(shí)候置user為null if (!user.getPassword().equals(password)){ user = null ; } } finally { SessionUtil.closeSession(session); } return user; } public Pager find(String name,String sort,String order)分頁(yè)處理 |
xml代碼:
這里用到了動(dòng)態(tài)sql,關(guān)于動(dòng)態(tài)sql,就是where,if,chose等標(biāo)簽的使用,可以參考官方文檔
另外在mybatis中,null的概念是不存在,舉個(gè)例子,你傳個(gè)user=null,但是在替換的時(shí)候替換為”null”串.沒有這個(gè)值才為null
1
2
3
4
5
6
7
8
9
10
11
12
|
<!--分頁(yè)代碼--> < select id = "find" parameterType = "Map" resultType = "User" > SELECT * from user < if test = "name!=null" >WHERE (username LIKE #{name} or nickname LIKE #{name})</ if > ORDER BY ${sort} ${order} LIMIT #{pageStart},#{pageSize} </ select > <!--分頁(yè)總記錄數(shù)--> < select id = "findcount" parameterType = "Map" resultType = "int" > SELECT count(*) from user < if test = "name!=null" >WHERE (username LIKE #{name} or nickname LIKE #{name})</ if > </ select > |
java代碼:總體還是按照前面文章設(shè)計(jì)的分頁(yè)
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
|
/** * 根據(jù)指定條件分頁(yè)查詢 * @param name 查詢條件,null代表無(wú)條件 * @param sort 排序條件,null代表按照id排序 * @param order 排序條件,null代表升序 * @return */ public Pager< User > find(String name,String sort,String order){ int pageStart = SystemContext.getPageStart();//分頁(yè)起始 int pageSize = SystemContext.getPageSize();//分頁(yè)大小 Pager< User > pagers = new Pager<>(); Map< String ,Object> maps = new HashMap<>(); if (name!=null && !name.equals("")){ name = "%"+name+"%"; maps.put("name",name); } if (sort==null || sort.equals("")){ sort = "id";//默認(rèn)按照id排序 } if (order==null || order.equals("")){ order = "asc";//默認(rèn)排序 } maps.put("sort",sort); maps.put("order",order); maps.put("pageStart",pageStart); maps.put("pageSize",pageSize); SqlSession session = SessionUtil.getSession(); List< User > datas = null; try { datas = session.selectList(User.class.getName()+".find",maps);//獲取記錄 pagers.setDatas(datas); pagers.setPageSize(pageSize); pagers.setPageStart(pageStart); int totalRecord = session.selectOne(User.class.getName()+".findcount",maps);//獲取記錄總數(shù) pagers.setTotalRecord(totalRecord); pagers.setPageIndex(pageStart/pageSize+1); } finally { SessionUtil.closeSession(session); } return pagers; } |
目前項(xiàng)目結(jié)構(gòu)
下一篇寫一個(gè)通用的BaseDao,以方便代碼書寫.并且繼續(xù)學(xué)習(xí)mybatis其他屬性的使用,感謝大家的閱讀。