mybatis
- 使用資料庫連接池初始化連接資源
- 將sql陳述句抽取到xml組態檔中
- 使用反射、內省等底層技術,自動將物體與表進行屬性與欄位的自動映射
介紹
mybatis 是一個優秀的基于java的持久層框架,它內部封裝了jdbc,使開發者只需要關注sql陳述句本身,而不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的程序,mybatis通過xml或注解的方式將要執行的各種 statement配置起來,并通過java物件和statement中sql的動態引數進行映射生成最終執行的sql陳述句最后mybatis框架執行sql并將結果映射為java物件并回傳,采用ORM思想解決了物體和資料庫映射的問題,對jdbc 進行了封裝,屏蔽了jdbc api 底層訪問細節,使我們不用與jdbc api打交道,就可以完成對資料庫的持久化操作,
步驟
-
添加坐標
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency>
-
創建user資料表
CREATE TABLE USER( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, userName VARCHAR(32) not null, passWord VARCHAR(32) not null )
- 撰寫user物體類
package com.spring.demo;
/**
* @author Enki
* @Version 1.0
*/
public class User {
private int id ;
private String userName;
private String passWord;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", passWord='" + passWord + '\'' +
'}';
}
}
-
撰寫映射檔案UserMapper.xml
在resource下新建檔案夾
<?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 namespace="userMapper">
<!-- 結果集封裝的物件時resultType-->
<select id="findAll" resultType="com.spring.demo.User">
select * from user
</select>
</mapper>
找到userMapper檔案下的findAll方法并執行結果封住為User型別
-
核心組態檔
<?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> <!-- 資料源環境部--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="https://www.cnblogs.com/EnkiZhangBlog/archive/2023/03/14/com.mysql.jdbc.Driver"/> <property name="url" value="https://www.cnblogs.com/EnkiZhangBlog/archive/2023/03/14/jdbc:mysql://localhost:3306/test"/> <property name="username" value="https://www.cnblogs.com/EnkiZhangBlog/archive/2023/03/14/root"/> <property name="password" value="https://www.cnblogs.com/EnkiZhangBlog/archive/2023/03/14/enki"/> </dataSource> </environment> </environments> <!-- 加載映射檔案--> <mappers> <mapper resource="com\spring\mybatis\demo\mapper\UserMapper.xml"/> </mappers> </configuration>
-
撰寫測驗
查詢:
@Test public void test() throws IOException { //獲得核心組態檔 InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml"); //獲得sqlSession工廠物件 SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); //獲得sqlSession物件 SqlSession sqlSession = build.openSession(); //執行操作 引數 List<User> objects = sqlSession.selectList("userMapper.findAll"); //測驗 System.out.println(objects); sqlSession.close(); }
添加
<!-- 添加 values值對應于User的屬性-->
<insert id="insertUser" parameterType="com.spring.demo.User">
insert into user values(#{id},#{userName},#{passWord})
</insert>
@Test
public void test02() throws IOException ?,
//獲得核心組態檔
InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
//獲得sqlSession工廠物件
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//獲得sqlSession物件
SqlSession sqlSession = build.openSession();
//執行操作 引數
int insert = sqlSession.insert("userMapper.insertUser",new User("zhangsan","2121"));
//mybatis 默認不提交事務 主動提交
sqlSession.commit();
//測驗
System.out.println(insert);
sqlSession.close();
}
修改
<!-- 修改-->
<update id="updateUser" parameterType="com.spring.demo.User">
update user set passWord=#{passWord} where userName=#{userName}
</update>
@Test
public void test03() throws IOException {
//獲得核心組態檔
InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
//獲得sqlSession工廠物件
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//獲得sqlSession物件
SqlSession sqlSession = build.openSession();
//執行操作 引數
int update = sqlSession.update("userMapper.updateUser", new User("zhangsan", "1111"));
//mybatis 默認不提交事務
sqlSession.commit();
//測驗
System.out.println(update);
sqlSession.close();
}
洗掉
<!-- 洗掉-->
<delete id="deleteUser" parameterType="com.spring.demo.User">
delete from user where userName=#{userName}
</delete>
@Test
public void test04() throws IOException {
//獲得核心組態檔+
InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
//獲得sqlSession工廠物件
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//獲得sqlSession物件
SqlSession sqlSession = build.openSession();
//執行操作 引數
int delete = sqlSession.delete("userMapper.deleteUser", new User("zhangsan", "1111"));
//mybatis 默認不提交事務
sqlSession.commit();
//測驗
System.out.println(delete);
sqlSession.close();
}
或者直接用id洗掉
<!-- 洗掉-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where userName=#{id}
</delete>
所以可以根據sql陳述句的所需要的引數型別進行對paramterType的型別進行對應,不一定必須寫資料庫的封裝型別
映射部分屬性
常用配置決議
資料庫環境的配置 支持多環境配置
其中,事務管理器(transactionManager)型別有兩種:
? JDBC:這個配置就是直接使用了JDBC 的提交和回滾設定,它依賴于從資料源得到的連接來管理事務作用域,
? MANAGED:這個配置幾乎沒做什么,它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如JEE
應用服務器的背景關系), 默認情況下它會關閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設定
為 false 來阻止它默認的關閉行為,
其中,資料源(dataSource)型別有三種:
? UNPOOLED:這個資料源的實作只是每次被請求時打開和關閉連接,
? POOLED:這種資料源的實作利用“池”的概念將 JDBC 連接物件組織起來,(JDBC使用POOLED)
? JNDI:這個資料源的實作是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置資料源,然后放置
一個 JNDI 背景關系的參考
mapper標簽
用于加載映射,加載方式如下:
-
使用相對于類路徑的資源參考
-
使用完全限定資源定位符(URL)
-
使用映射器介面實作類的完全限定類名
-
將包內映射器介面實作全部注冊為映射器
properties標簽
單獨抽取出來,明確分工
typeAliases標簽
用于設定別名
<typeAliases>
<typeAlias type="com.spring.demo.User" alias="user"/>
</typeAliases>
常用apl SqlSessionFactory build(InputStream inputStream)
//獲得核心組態檔
InputStream resourceAsStream = Resources.getResourceAsStream("sqMapperConfig.xml");
//獲得sqlSession工廠物件
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//獲得sqlSession物件
SqlSession sqlSession = build.openSession();
方法 | 決議 |
---|---|
openSession() | 會默認開啟一個事務,但事務不會自動提交,也就意味著需要手動提交 |
openSession(boolean autoCommit) | 引數為是否自動提交,如果設定為true,那么不需要手動提交事務 |
SqlSession實體物件
可以查詢單個物件
mybatis的代理開發
mapper介面開發方法需要撰寫Mapper介面由mybatis框架根據介面定義創建介面的動態代理物件;
需要遵循以下規范:
- Mapper.xml檔案中的namespace與mapper介面的全限定名相同
- Mapper介面方法名和Mapper.xml中定義的每個statement的id相同
-
Mapper介面方法的輸入引數型別和mapper.xml中定義的每個sql的parameterType的型別相同
-
Mapper介面方法的輸出引數型別和mapper.xml中定義的每個sql的resultType的型別相同
測驗
public static void main(String[] args) throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession session = build.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.findAll();
System.out.println(users);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546799.html
標籤:其他