【Mybatis學習筆記】01—Mybatis入門
什麼是Mybatis:
Mybatis是一款持久層框架。用於程式與資料庫的之間的互動。
Mybatis和大名鼎鼎的全自動持久層框架Hibernate最大不同的地方在於,Mybatis是半自動的,由開發人員來定製sql語句。
並且相比較Hibernate而言Mybatis更簡單,易學。
依賴的jar包:
mybatis-3.4.6.jar (Mybatis核心jar包)
mysql-connector-java-5.1.40-bin.jar (Mysql資料庫連線驅動)
建立使用者表:
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `gender` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `hobby` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
建立對應實體類:
package com.zzzj.helloworld.entity;
import lombok.Data;
@Data
public class User {
private Integer id;
private Integer age;
private String name;
private String hobby;
private String gender;
}
搭建配置檔案:mybatis-config.xml
<?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> <settings> <!-- 開啟在控制檯列印sql語句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> <!-- 資料庫環境搭建 當前使用的是Mysql環境 --> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis01" /> <property name="username" value="root" /> <property name="password" value="1234" /> </dataSource> </environment> </environments> <!-- 引入sql對映檔案 --> <mappers> <mapper resource="com/zzzj/helloworld/entity/UserMapper.xml"/> </mappers> </configuration>
搭建sql對映檔案:UserMapper.xml
<?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">
<!-- namespace:當前對映檔案唯一標識-->
<mapper namespace="helloworld01">
<!--
select 子元素 : 用於進行資料庫查詢相關操作
id屬性 : 唯一標識
resultType : 查詢後返回的結果封裝的物件型別
-->
<select id="getById" resultType="com.zzzj.helloworld.entity.User">
select * from USER where id = #{id}
<!-- #{}表示式:暫時理解為從引數中獲取id值 -->
</select>
</mapper>
現在所有的環境都已經搭建完成了,可以開始使用Mabatis與我們的資料庫開始互動了
①:通過Mybatis中IO包的Resources類靜態方法從當前class路徑獲取核心配置檔案的輸入流
InputStream input = Resources.getResourceAsStream("com/zzzj/helloworld/mybatis-context.xml")
②:每個基於 MyBatis 的應用都是以 SqlSessionFactory 的例項為中心的
SqlSessionFactory的例項可以通過 SqlSessionFactoryBuilder 物件的builder(InputStream inputstream)獲取
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input )
③:通過sqlSessionFactory工廠類獲取Mybatis核心物件Sqlsession
SqlSession session = factory.openSession()
SqlSession和JDBC中的Connection,Hibernate的Session一樣,代表與資料庫的一次會話,並且他們都是非執行緒安全的
④:使用sqlsession物件進行查詢並獲得單個物件:
public <T> T selectOne(String statement , Object parameter)
statement : select標籤的唯一標識 最好為 namespace +'.'+ id
parameter : 該sql所需要的引數
⑤:從user表中查詢一條記錄並封裝為User物件
User user = session.selectOne("helloworld01.getById",1)
sql語句 : select * from USER where id = ?
引數 : 1 (Integer)
這樣雖然讓sql語句沒有寫死在程式中,但是呼叫也未免太麻煩了
這是以前Mybatis中所使用的辦法,而現在Mybatis提供了一種更簡便,更安全的辦法
基於介面:
MyBatis的sql對映檔案不但能讀取指定sql,還可以與介面進行繫結
sql對映檔案的namespace屬性值為介面的全類名
select標籤id屬性值為介面中的方法名
定義介面
package com.zzzj.helloworld.dao;
import com.zzzj.helloworld.entity.User;
public interface UserDao {
User getById(Integer id);
}
配置sql對映檔案
<?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">
<!-- namespace:當前對映檔案唯一標識-->
<mapper namespace="com.zzzj.helloworld.dao.UserDao">
<!--
namespace : 介面的全類名
id : 介面中對應的方法名
-->
<select id="getById" resultType="com.zzzj.helloworld.entity.User">
select * from USER where id = #{id}
</select>
</mapper>
UserDao dao = session.getMapper(UserDao.class);
User u = dao.getById(1);
當呼叫sqlsession物件的getMapper(UserDao.class)時
mybatis會通過JDK動態代理建立該類的實現類
當呼叫介面中的方法時就會匹配sql對映檔案中標籤的id標識,獲取sql,完成查詢操作
通過這種使用介面與sql對映檔案繫結的形式
既簡化了操作,又能保證正確性。