mybatis入門總結
概論: MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO(Plain Old Java Objects,普通的Java物件)對映成資料庫中的記錄。
作用:
Mybatis將sql語句配置到xml配置檔案中,然後將輸入引數進行對映,由mybatis框架將對映後的sql片段拼接到配置到xml中的sql語句。然後由mybatis框架來執行對映後的sql語句。執行之後的結果將由mybatis框架對映成java物件
執行特點::動態sql語句,快取技術,(hibernate框架)
優點:
1、簡單易學
mybatis本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar檔案+配置幾個sql對映檔案易於學習,易於使用,通過文件和原始碼,可以比較完全的掌握它的設計思路和實現。
2、靈活
mybatis不會對應用程式或者資料庫的現有設計強加任何影響。 sql寫在xml裡,便於統一管理和優化。通過sql基本上可以實現我們不使用資料訪問框架可以實現的所有功能,或許更多。
3、解除sql與程式程式碼的耦合
通過提供DAL層,將業務邏輯和資料訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和程式碼的分離,提高了可維護性。
4、提供對映標籤,支援物件與資料庫的orm欄位關係對映
5、提供物件關係對映標籤,支援物件關係組建維護
6、提供xml標籤,支援編寫動態sql。
缺點:
1、編寫SQL語句時工作量很大,尤其是欄位多、關聯表多時,更是如此。
2、SQL語句依賴於資料庫,導致資料庫移植性差,不能更換資料庫。
3、框架還是比較簡陋,功能尚有缺失,雖然簡化了資料繫結程式碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。
4、二級快取機制不佳
mybatis的優點同樣是mybatis的缺點,正因為mybatis使用簡單,資料的可靠性、完整性的瓶頸便更多依賴於程式設計師對sql的使用水平上了。sql寫在xml裡,雖然方便了修改、優化和統一瀏覽,但可讀性很低,除錯也非常困難,也非常受限。
5、 mybatis沒有hibernate那麼強大,但是mybatis最大的優點就是簡單小巧易於上手,方便瀏覽修改sql語句
核心原理:
1.載入核心xml檔案
2.通過載入這個核心xml檔案,就能得到一個sqlSessionFactory。
3.得到這個工廠來產生sqlSession,但這個物件本身不能操作我們的資料庫
4.sqlSession產生一個解析器Executor,可以產生一個MappedStatements,可以執行sql語句
(MappedStatements是Statement的子類)
5.最後給我們返回資料(map, int, list);
MyBatis核心配置檔案的基本結構:
configuration —— 根元素
properties —— 定義配置外在化
settings —— 一些全域性性的配置
typeAliases —— 為一些類定義別名
typeHandlers —— 定義型別處理,也就是定義java型別與資料庫中的資料型別之間的轉換關係
objectFactory
plugins —— Mybatis的外掛,外掛可以修改Mybatis內部的執行規則
environments —— 配置Mybatis的環境
environment
transactionManager —— 事務管理器
dataSource —— 資料來源
databaseIdProvider
mappers —— 指定對映檔案或對映類
前提匯入相關種jar包:
一:第一種配置方式(最原始,容易理解) 測試類test
String path="mybatis-config.xml";
//得到一個輸入流物件
InputStream is= Resources.getResourceAsStream(path);
//得到sqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//通過SqlSessionFactory得到SqlSession
SqlSession sqlSession = ssf.openSession();
//返回一列的就用SelectOne
int num = sqlSession.selectOne("com.offcn.dao.UserMapper.selectAllUser");
List<User> list = sqlSession.selectList("com.offcn.dao.UserMapper.selectAllUser");
System.out.println(num);
,mybatis.xml核心檔案配置:
<?xml version="1.0" encoding="UTF-8" ?><!--配置環境,連線資料庫environments的s表示可以配置多個環境,可以包括你學過的mysql,oracle-->
<environments default="development">
<environment id="development">
<!--配置JDBC事務,由mybatis管理-->
<transactionManager type="JDBC"></transactionManager>
<!--配置資料來源(jndi)是一個由tomcat容器給你分配的資料來源,pooled(這是一種mybatis自帶的資料來源)-->
<dataSource type="POOLED">
<property name="url" value="jdbc:mysql://localhost:3306/smbms?useUnicode=true&&characterEncoding=utf-8"></property>
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="username" value="root"></property>
<property name="password" value="root}"></property>
</dataSource>
</environment>
</environments>
<!--這裡的點要換成/-->
<mappers>
<mapper resource="com/offcn/dao/UserMapper.xml"></mapper>
</mappers>
UserMapper介面:
package com.offcn.dao;
import com.offcn.entity.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
//全查
//List<User> selectAllUser();
//根據查詢總記錄數--selectCount與xml的id對應一樣
//int selectCount();
//增加的方法
//int insertUser(User user);
//模糊查詢
//List<User> selectLikeUser(String name);
}
所需要的User例項類
package com.offcn.entity;
import java.util.Date;
public class User {
private Integer id; //id
private String userCode; //使用者編碼
private String userName; //使用者名稱稱
private String userPassword; //使用者密碼
private Integer gender; //性別
private Date birthday; //出生日期
private String phone; //電話
private String address; //地址
private Integer userRole; //使用者角色
private Integer createdBy; //建立者
private Date creationDate; //建立時間
private Integer modifyBy; //更新者
private Date modifyDate; //更新時間
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getUserRole() {
return userRole;
}
public void setUserRole(Integer userRole) {
this.userRole = userRole;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
sql的對映檔案UserMapper.xml的配置:
<!–模糊查詢–>
<!– parameterType代表引數型別 #{userName}代表一個?號佔位符 模糊查詢一定要加上concat–>
select * from smbms_user where userName like concat(’%’,#{userName},’%’)
</select>
<select id="selectLikeUserId" resultType="com.offcn.entity.User" parameterType="int">
select * from smbms_user where id =#{id}
</select>
<!–修改根據id修改名字,密碼返回值型別int **-userName對應你mysql的列–>
<select id="updateById" parameterType="com.offcn.entity.User" resultType="int">
update smbms_user set userName=#{userName},userPassword=#{userPassword} where id=#{id}
</select>
<!–根據id刪除–>
<select id="deleteById" parameterType="int" >
delete from smbms_user where id=#{id}
</select>
<!– 增加一個 –>
<select id="insertUser" parameterType="com.offcn.entity.User" resultType="int">
insert into smbms_user(userName,userPassword) values(#{userName},#{userPassword})
</select>
二:第二種配置方式:
建立單例模式工具類:
package com.offcn.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.InputStream;
/*
-
得到SqlSession的工具類
-
*/
public class SqlSessionUtils {
private static SqlSessionUtils sqlSessionUtils;
public SqlSession sqlSession;
//這個構造要讀取核心配置檔案
private SqlSessionUtils() {
try {String path = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is); sqlSession = ssf.openSession(true); }catch (Exception e){ e.printStackTrace(); }
}
//得到一個對外的方法得到這個物件
/第一個同步鎖,鎖方法(可能會出現死鎖),保證只有一個執行緒能進入這個方法/
public static synchronized SqlSessionUtils getSqlSessionUtils() {
if (sqlSessionUtils == null) {
/*在Java jvm 例項化物件有4個步驟,
為了避免這種情況(當走到第一個步驟時,而另外的執行緒又開始例項化物件)產生,
* 保證了永遠只有一個這樣的類/
synchronized (SqlSessionUtils.class){
if (sqlSessionUtils == null) {
sqlSessionUtils = new SqlSessionUtils();
}
}
}
return sqlSessionUtils;
}
}
**,mybatis.xml核心檔案配置:**如下
<?xml version="1.0" encoding="UTF-8" ?><typeAliases>
<!--給你當前包下面的所有類取別名 別名的名字就是你的類名-->
<!--<package name="com.offcn.entity"></package>-->
<!--給具體的類加上別名-->
<!--type 就是要加的別名的包下面的類的全路徑名-->
<!--alias 就是你要取得別名-->
<typeAlias type="com.offcn.entity.Address" alias="Addss"></typeAlias>
</typeAliases>
<!--配置環境,連線資料庫environments的s表示可以配置多個環境,可以包括你學過的mysql,oracle-->
<environments default="development">
<environment id="development">
<!--配置JDBC事務,由mybatis管理-->
<transactionManager type="JDBC"></transactionManager>
<!--配置資料來源(jndi)是一個由tomcat容器給你分配的資料來源,pooled(這是一種mybatis自帶的資料來源)-->
<dataSource type="POOLED">
<property name="url" value="${url}"></property>
<property name="driver" value="${driver}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</dataSource>
</environment>
</environments>
<!--與UserMapper.xml進行關聯***** resource可以配置多個xml對映檔案路徑-->
<!--這裡的點要換成/-->
<mappers>
<!--<mapper resource="com/offcn/dao/UserMapper.xml"></mapper>-->
</mappers>
**測試類如下:**--呼叫工具類進行例項的建立與對映 SqlSession sqlSession= SqlSessionUtils.getSqlSessionUtils().sqlSession;
List<User> list = sqlSession.selectList("com.offcn.dao.UserMapper.selectLikeUser", "李");
for (User user:list){
System.out.println(user.getUserName()+"/t"+user.getUserRole());
}
其他的類,介面不變.
三:就是用註解配置進行sql語句的對映,就不用建立UserMapper.xml的對映檔案:
要加入的jar包:
package com.offcn.dao;
import com.offcn.entity.User;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
//全查–註解配置sql語句—呼叫selectAllUser時就執行該sql語句
@Select(“select * from smbms_user”)
List selectAllUser();
//根據查詢總記錄數--selectCount與xml的id對應一樣
//int selectCount();
//增加的方法
//int insertUser(User user);
//模糊查詢
//List<User> selectLikeUser(String name);
/*------最總版-------*/
List<User> selectAllLIst();
}
測試類:
/-----註解配置的對映------/
/查詢mysql表中所有Address的方法/
SqlSession sqlSession= SqlSessionUtils.getSqlSessionUtils().sqlSession;
AddressMapper mapper = sqlSession.getMapper(AddressMapper.class);
List
for (Address aa:list) {
System.out.println(aa.getContact()+"###");
}