MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
能看到這篇文章的人,相信大家對(Java DataBase Connect jdbc)已經熟練掌握了,SpringJdbc也應該熟悉。spring整合了java的JDBC東西,封裝成了一個組件,就是我們常說的持久層dao組件。大大的減少了開發人員的工作量,而MyBatis框架和SpringJDBC差不多,也是一個和數據庫交互的持久層組件(這裏說組件其實不合適,MyBatis不是某個東西的一部分,應該說是一種技術,一種框架)但實現原理不是封裝JDBC,到底怎麼實現,筆者現在也不知道,我們先來學會它,會使用它,再想它的實現原理。
接下來我們先搭建一個MyBatis項目,項目名稱是:mybatis_demo1。
我們先來看看搭建一個MyBatis的主要步驟:
1.新建一個web項目
在eclipsp中新建一個web項目,mybatis_demo1,如下圖:
2.編寫主配置文件
在src目錄下先編寫主配置文件SqlMapConfig.xml,如下圖:
代碼如下:
注意:在xml文件中&符號用“&"表示
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/jsd15077db?useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 加載sql定義文件 -->
<mappers>
<mapper/>
</mappers>
</configuration>
3.引入相關jar包
這裏我們要引入的jar包有:
mybatis包:mybatis-3.2.5.jar
數據庫連接包:mysql-connector-java-5.1.39-bin.jar ,這裏我們用的是mysql數據庫
在WEB-INF/lib目錄下引入jar包,如下圖:
4.編寫對應的實體類
這裏我們要操作時的是用戶表user,先來看看該表的結構:
在src目錄下新建com.cdd.entity包,在該包下新建實體類:User,代碼如下:
package com.cdd.entity;
import java.io.Serializable;
public class User implements Serializable {
private Integer id; //用戶id
private String username; //登錄名稱
private String pwd; //密碼
private String name; //暱稱
private String gender; //性別,1-男;0-女
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String toString() {
return "User [id=" + id + ", username=" + username + ", pwd=" + pwd + ", name=" + name + ", gender=" + gender
+ "]";
}
}
5.編寫對應實體類的sql操作文件
在com.cdd包下新建一個包sql,在com.cdd.sql包下新建對應User的sql操作文件UserMapper.xml,先寫一個查詢所有用戶信息的sql,代碼如下:
注:
當只需要傳一個參數的時,通常拼在sql語句裏的參數可以隨便寫,不必與字段名相同,例如:#{ name},這裏面的參數不必 是id(表字段名稱相同)。
當傳過來多個參數的時候,通常情況下用一個實體類對象或Map集合來接收,拼在sql 的參數要和對應的字段名稱相同。
拼接sql語句時,parameterType、reslutType對應的類型可以是Java中數據類型也可以是myBatis帶數據類型,通常情況下 myBatis帶的數據類型是java數據類型的小寫。例如: java.Lang.String 對應 string。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="User">
<!-- 查詢所有用戶信息 -->
<select id="findAll"
resultType="com.cdd.entity.User">
select * from user
</select>
</mapper>
要加載該sql操作文件,還得在主配置文件中,把這個文件配置進去,配置好的主配置文件SqlMapConfig.xml代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/jsd15077db?useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 加載sql定義文件 -->
<mappers>
<mapper resource="com/cdd/sql/UserMapper.xml"/>
</mappers>
</configuration>
這個主配置文件裏,增加的是這部分內容,如下圖:
6.獲取SqlSession
在com.cdd包下新建test包,在com.cdd.util包下創建一個類MyBatisUtil,代碼如下:
package com.cdd.util;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
public static SqlSession getSqlSession() throws IOException{
//實例化一個SqlSession工廠構建器
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//主配置文件路徑
String conf = "SqlMapConfig.xml";
//獲取主配置文件的流
//方式1:用字節流
//InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(conf);
//方式2:用字符流
Reader reader = Resources.getResourceAsReader(conf);
//獲取SqlSessionFactory實例
SqlSessionFactory ssf = ssfb.build(reader);
//獲取SqlSession
SqlSession session = ssf.openSession();
return session;
}
}
7.測試
在com.cdd包新建包test包,在com.cdd.test包下新建Test1類,代碼如下:
注:
SqlSession用完要記得關閉。
當執行DML語句時, myBatis默認把數據庫提交關閉了,要顯式調用commit()方法。
package com.cdd.test;
import java.io.IOException;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.cdd.entity.User;
import com.cdd.util.MyBatisUtil;
public class Test1 {
public static void main(String[] args) throws IOException{
//獲取SqlSession
SqlSession session = MyBatisUtil.getSqlSession();
//調用findAll方法
List<User> userList = session.selectList("findAll");
//循環輸出
for(User user : userList){
System.out.println(user);
}
session.close(); //關閉session
}
}
運行後,查看控制檯,如下圖:
注意:我剛纔在實體類User類中重寫了toString()方法,所有才會打印出每個用戶的全部信息。
到這裏一個MyBatis項目就搭建好了,接下來補充一些東西
返回數據類型:
1.類對象
(1).屬性名與字段一致,使用resultType來設置放回數據類型
(2).屬性名和與字段不一致
a.給字段使用別名,使它與屬性名一致
b.使用resultMap替代resultType定義如何裝載數據
這裏通過sql查到的cost_id與實體類CostBean1的id屬性相對應。
注:
resultType默認按名稱匹配裝載數據;
resultMap按指定一定匹配規則裝載數據;
在用實體類對象去裝載查詢回來的數據時,當實體類對象的屬性和表字段不一致時,則裝載到數據後,實體類對象的這個屬性 值爲null,接不到數據
2.Map集合
3.基本類型
參考資料: