mybatis 入門#
學習目標#
- 【應用】Mybatis 的快速入門
- 【應用】MyBatis 的增刪改查操作
- 【掌握】MyBatis 核心配置文件概述
1、Mybatis 簡介#
1.1 原始 jdbc 操作(查詢數據)#
1.2 原始 jdbc 操作(插入數據)#
1.3 原始 jdbc 操作的分析#
原始 jdbc 開發存在的問題如下:
①數據庫連接創建、釋放頻繁造成系統資源浪費從而影響系統性能
②sql 語句在代碼中硬編碼,造成代碼不易維護,實際應用 sql 變化的可能較大,sql 變動需要改變 java 代碼。
③查詢操作時,需要手動將結果集中的數據手動封裝到實體中。插入操作時,需要手動將實體的數據設置到 sql 語句的佔位符位置
應對上述問題給出的解決方案:
①使用數據庫連接池初始化連接資源
②將 sql 語句抽取到 xml 配置文件中
③使用反射、內省等底層技術,自動將實體與表進行屬性與字段的自動映射
1.4 什麼是 Mybatis#
mybatis 是一個優秀的基於 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 語句本身,而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。
mybatis 通過 xml 或註解的方式將要執行的各種 statement 配置起來,並通過 java 對象和 statement 中 sql 的動態參數進行映射生成最終執行的 sql 語句。
最後 mybatis 框架執行 sql 並將結果映射為 java 對象並返回。採用 ORM 思想解決了實體和數據庫映射的問題,對 jdbc 進行了封裝,屏蔽了 jdbc api 底層訪問細節,使我們不用與 jdbc api 打交道,就可以完成對數據庫的持久化操作。
1.5 Mybatis 架構#
2、Mybatis 的快速入門#
2.1 MyBatis 開發步驟#
MyBatis 官網地址:http://www.mybatis.org/mybatis-3/
MyBatis 開發步驟:
①添加 MyBatis 的坐標
②創建 user 數據表
③編寫 User 實體類
④編寫映射文件 UserMapper.xml
⑤編寫核心文件 SqlMapConfig.xml
⑥編寫測試類
2.2 環境搭建#
1. 導入 MyBatis 的坐標和其他相關坐標
<!‐‐mybatis坐標‐‐>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!‐‐ mysql驅動 ‐‐>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql‐connector‐java</artifactId>
<version>5.1.39</version>
</dependency>
<!‐‐單元測試坐標‐‐>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!‐‐日誌坐標‐‐>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
2. 創建 user 數據表
drop table if EXISTS user;
##用戶
CREATE TABLE `user` (
`uid` INT AUTO_INCREMENT ,
`username` VARCHAR(20) DEFAULT NULL,
`password` VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (`uid`)
);
INSERT INTO `user` VALUES (NULL,'wc001','888888'),
(NULL,'xq001','888888'),
(NULL,'xb001','888888');
3. 編寫 User 實體
public class User {
private int id;
private String username;
private String password;
//省略get個set方法
}
4. 編寫 UserMapper 映射文件
<
?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">
<select id="findAll" resultType="com.summer.domain.User">
select * from User
</select>
</mapper>
5. 編寫 MyBatis 核心文件
<!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"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!‐‐加載映射文件‐‐>
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
2.3 編寫測試代碼#
@Test
public void test1() throws IOException {
//加載 mybatis主 配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//獲取session工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//創建session
SqlSession session = sqlSessionFactory.openSession();
//執行操作
List<User> users = session.selectList("userMapper.findAll");
//釋放資源
session.close();
System.out.println(users);
}
為了查看 sql 語句的執行信息 配置在 resources 下添加 日誌文件 log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.com.summer.test=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] ‐ %m%n
2.4 知識小結#
MyBatis 開發步驟:
①添加 MyBatis 的坐標
②創建 user 數據表
③編寫 User 實體類
④編寫映射文件 UserMapper.xml
⑤編寫核心文件 SqlMapConfig.xml
⑥編寫測試類
3、MyBatis 的映射文件概述#
4.MyBatis 的增刪改查操作#
4.1 MyBatis 的插入數據操作#
1. 編寫 UserMapper 映射文件
<insert id="save" parameterType="com.summer.domain.User" >
insert into user values (null,#{username},#{password});
</insert>
2. 編寫插入實體 User 的代碼
//添加
@Test
public void test2() throws IOException {
User user = new User();
user.setUsername("如花");
user.setPassword("888");
//加載 mybatis主 配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//獲取session工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//創建session
SqlSession session = sqlSessionFactory.openSession();
//執行操作
int i = session.insert("userMapper.save",user);
//釋放資源
session.commit();
session.close();
System.out.println(i);
}
3. 插入操作注意問題
・插入語句使用 insert 標籤
・在映射文件中使用 parameterType 屬性指定要插入的數據類型
・Sql 語句中使用 #{實體屬性名} 方式引用實體中的屬性值
・插入操作使用的 API 是 sqlSession.insert (“命名空間.id”, 實體對象);
・插入操作涉及數據庫數據變化,所以要使用 sqlSession 對象顯示的提交事務,即 sqlSession.commit ()
4.2 MyBatis 的修改數據操作#
1. 編寫 UserMapper 映射文件
<update id="update" parameterType="com.summer.domain.User" >
update user set username = #{username} , password = #{password} where uid =#{uid}
</update>
2. 編寫修改實體 User 的代碼
//修改
@Test
public void test3() throws IOException {
User user = new User();
user.setUid(1);
user.setUsername("如花2222");
user.setPassword("888");
//加載 mybatis主 配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//獲取session工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//創建session
SqlSession session = sqlSessionFactory.openSession();
//執行操作
int i = session.update("userMapper.update",user);
//提交事務
session.commit();
//釋放資源
session.close();
System.out.println(i);
}
3. 修改操作注意問題
・修改語句使用 update 標籤
・修改操作使用的 API 是 sqlSession.update (“命名空間.id”, 實體對象);
4.3 MyBatis 的刪除數據操作#
1. 編寫 UserMapper 映射文件
<delete id="delete" parameterType="java.lang.Integer" >
delete from user where uid = #{uid}
</delete>
2. 編寫刪除數據的代碼
//刪除
@Test
public void test4() throws IOException {
//加載 mybatis主 配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//獲取session工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//創建session
SqlSession session = sqlSessionFactory.openSession();
//執行操作
int i = session.delete("userMapper.delete",1);
//提交事務
session.commit();
//釋放資源
session.close();
System.out.println(i);
}
3. 刪除操作注意問題
・刪除語句使用 delete 標籤
・Sql 語句中使用 #{任意字符串} 方式引用傳遞的單個參數
・刪除操作使用的 API 是 sqlSession.delete (“命名空間.id”,Object);
5. MyBatis 核心配置文件概述#
5.1 MyBatis 核心配置文件層級關係#
5.2 MyBatis 常用配置解析#
1.environments 標籤
數據庫環境的配置,支持多環境配置
2.mapper 標籤
該標籤的作用是加載映射的,加載方式有如下幾種:
・使用相對於類路徑的資源引用,例如:
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
・使用完全限定資源定位符(URL),例如:
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
・使用 mapper 接口的全限定類名 註解 mapper 接口,例如:
<mapper class="org.mybatis.builder.AuthorMapper"/>
・註冊指定包下的所有 mapper 接口,例如:
<package name="org.mybatis.builder"/>
3.Properties 標籤
4.typeAliases 標籤
類型別名是為 java 類型設置的一個短的名字。原來的配置如下
<select id="findAll" resultType="com.summer.pojo.User">
select * from user
</select>
配置 typeAliases, 為 com.summer.pojo.User 定義別名為 User
<typeAliases>
<typeAlias type="com.summer.pojo.User" alias="user"></typeAlias>
</typeAliases>
後面的 mapper.xml 就可以使用別名
<select id="findAll" resultType="User">
select * from user
</select>
上面我們是自定義的別名,mybatis 框架已經為我們設置好的一些常用的類型的別名
5.3 知識小結#
核心配置文件常用配置:
properties 標籤:該標籤可以加載外部的 properties 文件
<properties resource="jdbc.properties"></properties>
typeAliases 標籤:設置類型別名
<typeAlias type="com.summer.domain.User" alias="user"></typeAlias>
mappers 標籤:加載映射配置
<mapper resource="com/summer/mapper/UserMapping.xml"></mapper>