javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(二)
上一篇《javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(一)》已經(jīng)把實(shí)體類,分頁工具創(chuàng)建好了,這一篇利用mybatis創(chuàng)建DAO層.
另外mybatis的api文檔可以參考
一.mybatis的使用
1. 引入架包
這里引入mybatis和mysql的架包到lib中

2. 編寫Config.xml配置數(shù)據(jù)庫環(huán)境
先貼代碼,然后逐個(gè)解釋
<?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提供的模版
<!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ù)庫驅(qū)動(dòng),url,用戶名,密碼等,參考下面,這樣的話mybatis就會(huì)自動(dòng)讀取下面的參數(shù),你可以在xml中用${}來引用.
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ù)庫環(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ù)庫類型,JDBC連接java
dataSource配置數(shù)據(jù)源模式,pooled就是連接池模式,具體其他模式可以去官方文檔看下,根據(jù)需要選擇
property這個(gè)就是配置數(shù)據(jù)庫連接了,name不用動(dòng),修改value=”driver",這里是用{}是讀取最上方properties 這個(gè)文件里面的配置,這里注意匹配名稱才能讀取進(jìn)來的哈
3.編寫mapper映射sql語句
這里編寫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ì)添加其他東西
<?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)簽,說明當(dāng)前是一個(gè)select語句
id屬性,相當(dāng)于是函數(shù)名,通過id引用
parameterType屬性,代表傳入?yún)?shù)類型,可以指定基本類型,也可以是自定義類型,是自定義類型的話,會(huì)自動(dòng)調(diào)用其get方法,獲取其屬性
resultType屬性,返回值類型,可以直接自定義類型,會(huì)自動(dòng)調(diào)用set方法把查詢出來的參數(shù)設(shè)置進(jìn)去
更多屬性在后續(xù)文章中使用到再說.
4.調(diào)用mapper映射
調(diào)用之前需要先在Config.xml中配置映射,注意這里配置的xml是文件路徑哈
<mappers> <mapper resource="com/model/User.xml"/> </mappers>
然后寫測(cè)試類
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層的使用
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代碼
<!--增加一個(gè)用戶-->
<insert id="add" parameterType="User">
INSERT INTO user VALUES
(null,#{username},#{password},#{nickname},#{type})
</insert>
JAVA代碼
/**
/**
* 添加一個(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代碼
<!--刪除一個(gè)用戶-->
<delete id="delete" parameterType="int">
DELETE FROM user WHERE id=#{id}
</delete>
java代碼
/**
*根據(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代碼
<!--修改一個(gè)用戶-->
<update id="update" parameterType="User" >
UPDATE user SET username=#{username},password=#{password},nickname=#{nickname},type=#{type} where id=#{id}
</update>
java代碼
/**
*更新用戶
* @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代碼
<!--用戶登錄判斷-->
<select id="login" parameterType="String" resultType="User">
SELECT * FROM user WHERE username=#{username}
</select>
java代碼
/**
* 判斷一個(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)分頁處理
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
<!--分頁代碼-->
<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>
<!--分頁總記錄數(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ì)的分頁
/**
* 根據(jù)指定條件分頁查詢
* @param name 查詢條件,null代表無條件
* @param sort 排序條件,null代表按照id排序
* @param order 排序條件,null代表升序
* @return
*/
public Pager<User> find(String name,String sort,String order){
int pageStart = SystemContext.getPageStart();//分頁起始
int pageSize = SystemContext.getPageSize();//分頁大小
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其他屬性的使用,感謝大家的閱讀。
相關(guān)文章
Java 將List中的實(shí)體類按照某個(gè)字段進(jìn)行分組并存放至Map中操作
這篇文章主要介紹了Java 將List中的實(shí)體類按照某個(gè)字段進(jìn)行分組并存放至Map中操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Java調(diào)用HTTPS接口實(shí)現(xiàn)繞過SSL認(rèn)證
SSL認(rèn)證是確保通信安全的重要手段,有的時(shí)候?yàn)榱朔奖阏{(diào)用,我們會(huì)繞過SSL認(rèn)證,這篇文章主要介紹了Java如何調(diào)用HTTPS接口實(shí)現(xiàn)繞過SSL認(rèn)證,需要的可以參考下2023-11-11
Java設(shè)計(jì)模式中的單一責(zé)任原則詳解
這篇文章主要介紹了Java設(shè)計(jì)模式中的單一責(zé)任原則詳解,應(yīng)該有且僅有一個(gè)原因引起類的變更,即單一指責(zé)原則要求一個(gè)借口或類只有一個(gè)原因引起變化,也就是一個(gè)接口或類只有一個(gè)職責(zé),它就負(fù)責(zé)一件事情,需要的朋友可以參考下2023-11-11
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之平行志愿管理系統(tǒng)的實(shí)現(xiàn)
這是一個(gè)使用了java+Springboot+Maven+mybatis+Vue+Mysql開發(fā)的圖片平行志愿管理系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有志愿管理該有的所有功能,感興趣的朋友快來看看吧2022-02-02
java的main方法中調(diào)用spring的service方式
這篇文章主要介紹了在java的main方法中調(diào)用spring的service方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
json如何解析混合數(shù)組對(duì)象到實(shí)體類的list集合里去
這篇文章主要介紹了json解析混合數(shù)組對(duì)象到實(shí)體類的list集合里去的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java前端Layer.open.btn驗(yàn)證無效解決方法
在本篇文章里我們給大家整理了一篇關(guān)于Java前端Layer.open.btn驗(yàn)證無效解決方法以及實(shí)例代碼,需要的朋友們可以參考學(xué)習(xí)下。2019-09-09

