# MyBatis--1.快速入門 ## MyBatis簡介 ### 原始jdbc操作的弊端 1. 創建、釋放頻繁導致系統資源浪費 2. sql語句在代碼中硬編碼,不易維護 3. 查詢操作時,需要手動將結果集中的數據封裝到實體中。插入操作同理需要手動 解決方案: 1. 使用資料庫連接池初始化連接資源 ...
MyBatis--1.快速入門
MyBatis簡介
原始jdbc操作的弊端
- 創建、釋放頻繁導致系統資源浪費
- sql語句在代碼中硬編碼,不易維護
- 查詢操作時,需要手動將結果集中的數據封裝到實體中。插入操作同理需要手動
解決方案:
- 使用資料庫連接池初始化連接資源
- 將sql語句抽取到xml配置文件中
- 使用反射、內省等底層技術,自動將實體與表進行屬性和欄位的自動映射
MyBatis簡介
mybatis 是一個優秀的基於java的持久層框架,它內部封裝了 jdbc,使開發者只需要關註sql語句本身,而不需要花費精力 去處理載入驅動、創建連接、創建statement等繁雜的過程。
mybatis通過xml或註解的方式將要執行的各種 statement配 置起來,並通過java對象和statement中sql的動態參數進行 映射生成最終執行的sql語句。
最後mybatis框架執行sql並將結果映射為java對象並返回。採 用ORM思想解決了實體和資料庫映射的問題,對jdbc 進行了 封裝,屏蔽了jdbc api 底層訪問細節,使我們不用與jdbc api 打交道,就可以完成對資料庫的持久化操作 。
MyBatis快速入門
MyBatis開發步驟:
-
添加MyBatis的坐標
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- 測試--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!-- 日誌--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies>
-
創建user數據表
-
編寫user實體類
public class User { private int id; private String username; private String password; @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + 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; } }
-
編寫映射文件UserMapper.xml(寫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="userMapper"> <!-- resultType是得到的結果封裝成的對象--> <select id="findAll" resultType="com.xxx.User"> select * from user </select> </mapper>
-
編寫核心文件SqlMapConfig.xml(mybatis配置文件)
<?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> <!-- 配置數據源的環境 default預設環境的id--> <environments default="development"> <environment id="development"> <!-- 事務管理器--> <transactionManager type="JDBC"></transactionManager> <!-- 數據源類型,本處為池型--> <dataSource type="POOLED"> <!-- 配置--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/jdbcstudy"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 載入映射文件--> <mappers> <mapper resource="com/xxx/mapper/UserMapper.xml"/> </mappers> </configuration>
-
編寫測試類
在test目錄下創建一個測試類
package com.xxx;
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 org.apache.log4j.lf5.util.Resource;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class test {
@Test
public void test1() throws IOException {
// 獲取配置文件Resources是ibatis包下的
InputStream resourceAsFile = Resources.getResourceAsStream("sqlMapConfig.xml");
// 獲得session工廠對象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsFile);
// 獲得session會話對象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 執行操作,userMapper是映射文件中的一個命名空間,findAll是該命名空間下的一個id
List<User> userList = sqlSession.selectList("userMapper.findAll");
// 列印數據
System.out.println(userList);
// 釋放資源
sqlSession.close();
}
}
結果:
映射文件概述
MyBatis增刪改查
insert操作
映射文件中:
<!-- 插入 parameterTyp是傳入參數-->
<insert id="save" parameterType="com.xxx.User">
-- 參數是com.xxx.User的屬性名
insert into user values (#{id},#{username},#{password})
</insert>
測試:
// 模擬user對象
User user = new User();
user.setId(5);
user.setPassword("123456");
user.setUsername("lili");
// 獲取配置文件Resources是ibatis包下的
InputStream resourceAsFile = Resources.getResourceAsStream("sqlMapConfig.xml");
// 獲得session工廠對象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsFile);
// 獲得session會話對象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 執行操作,userMapper是映射文件中的一個命名空間,findAll是該命名空間下的一個id
sqlSession.insert("userMapper.save",user);
// MyBatis更新時需要手動提交事務,在sqlSessionFactory.openSession()設置參數為true會自動提交
sqlSession.commit();
// 釋放資源
sqlSession.close();
相關註意:
update操作
<update id="update" parameterType="com.xxx.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
測試和insert同理,只需要修改
sqlSession.update("userMapper.update",user);
delete操作
<delete id="delete" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
測試和insert同理,只需要修改
sqlSession.delete("userMapper.delete",7);
MyBatis核心配置文件
environments標簽介紹
事務管理器和數據源類型:
mappers標簽
使用mapper載入映射時,載入方式有:
Properties標簽
實際開發中,習慣將數據源的配置信息單獨抽取為一個properties文件,改標簽可以載入額外配置的properties文件