為什么要學習mybatis
首先要弄清楚什么是mybatis?我們為什么要學mybatis
學習MyBatis可以幫助開發人員更高效地進行數據庫操作,提高開發效率,并且可以使得應用程序更具可維護性和性能優勢。
我們知道Java
程序操作數據庫是通過jdbc
與數據庫進行交互,那么說明mybatis有傳統jdbc
所沒有的優勢。
傳統jdbc
方式
// 1. 加載配置文件
Properties pro=new Properties();
pro.load(new FileReader("resource/jdbc.properties"));
// 2. 獲取配置文件中連接數據庫的信息
String url=pro.getProperty("url");
String user=pro.getProperty("user");
String password=pro.getProperty("password");
String driver=pro.getProperty("driver");
// 3. 加載數據庫的驅動
Class.forName(driver);
// 4. 創建數據庫的連接
Connection conn = DriverManager.getConnection(url, user, password);// 5. sql 語句
String sql = "select * from s_admin where username=? and password=?";
// 3. 創建執行sql的對象
ps = conn.prepareStatement(sql);
// 4. 給 ?賦值
ps.setString(1, username);
ps.setString(2, password);
// 5. 執行sql
ResultSet rs = ps.executeQuery();
// 6. 如果查詢出數據,則返回該條數據
if (rs.next()) {Admin admin = new Admin();admin.setUsername(rs.getString("username"));admin.setPassword(rs.getString("password"));return admin;
// 7. 否則返回空
} else {return null;
}
我們可以看出來通過傳統jdbc
方式連接數據庫比較繁瑣,需要加載配置文件、獲取配置文件信息、加載數據庫驅動、創建數據庫連接等一系列操作,還可能導致SQL查詢代碼混合在JAVA代碼中導致代碼冗長,開發的效率降低,同時也帶來了維護上的一些問題。在實際的項目中SQL語句的變化可能很大,一旦發生變化就要修改JAVA代碼,系統需要重新編譯,不方便維護。如果映射為Java對象會比較方便。
這也是我們為什么要學習Mybatis的原因
Mybatis簡介
Mybatis的開發文檔地址:https://mybatis.net.cn/
首先我們要知道什么是Mybatis?Mybatis原是Apache的一個開源項目ibatis,2010年遷移到Google code改名為Mybatis,2013年遷移到GitHub上。
MyBatis 是一款優秀的持久層框架,支持定制化 SQL、存儲過程以及高級映射。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
Mybatis解決的問題
- 解決數據庫驅動的問題
- 創建JDBC中必須使用的Connection,Statement,Result對象
- 從xml中獲取SQL,并執行SQL語句,把ResultSet結果轉化為Java對象
- 關閉資源
如何使用Mybatis
下載Mybatis:https://github.com/mybatis/mybatis-3/releases
準備階段:
數據庫環境搭建
我這里使用的是Navicat管理工具,下載地址:https://www.navicat.com.cn/download/direct-download
創建數據庫和表
CREATE TABLE `user` (`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',`sex` varchar(1) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性別',`age` int DEFAULT NULL COMMENT '年齡',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
創建Java項目
注意這里的GroupID填寫你的域名,作為組的唯一標識。
等待Maven依賴文件下載完成。在設置中可以看到Maven的版本,我這里是3.9.5
可以在這個網站上搜索Maven所支持mybatis的版本https://mvnrepository.com/
添加所需依賴
復制依賴文件到pom.xml文件中
<dependencies><!-- junit 測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!-- mysql驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><!-- mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency>
</dependencies>
如果出現了像我這樣的報錯,重構Maven,換到安全版本即可。
配置核心文件
創建mybatis-config.xml文件,存放位置在src/main/resources目錄下
核心文件內容,在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><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>
復制內容到mybatis-config.xml中
我們需要修改的是紅色圈里面的內容
下面我簡單解釋一下
- <?xml version="1.0" encoding="UTF-8" ?>:指定了XML的版本和編碼
- ](http://mybatis.org/dtd/mybatis-3-config.dtd">):指定了XML的結構,引用了 MyBatis 的配置文件的 DTD 文件
- :指定了事務管理器的類型為 JDBC,表示使用 JDBC 進行事務管理。
- :指定了數據源的類型為 POOLED,表示使用連接池來管理數據庫連接。
- :設置數據庫驅動的名稱,${driver} 是一個占位符,通常在實際應用中會被具體的數據庫驅動名稱替換。
- :設置數據庫的 URL 地址,${url} 是一個占位符,通常在實際應用中會被具體的數據庫 URL 地址替換。
- :設置連接數據庫的用戶名,${username} 是一個占位符,通常在實際應用中會被具體的用戶名替換。
- :設置連接數據庫的密碼,${password} 是一個占位符,通常在實際應用中會被具體的密碼替換。
- :指定了映射器的資源,這里是一個 XML 文件的路徑,表示 MyBatis 將加載該路徑下的 BlogMapper.xml 文件作為映射器。
在這里我先不填寫映射文件的位置
創建實體User類
創建一個User類
完成創建
注意:我們的字段名要和我們的屬性名要保持一致。
添加對應的有參構造函數、無參構造函數、獲取器、設置器、toSring()
創建Mapper接口
首先,什么是Mapper接口?
在 MyBatis 中,Mapper 接口是用于定義數據庫操作的接口。Mapper 接口中的方法定義了對數據庫的增刪改查操作,而具體的 SQL 語句則是通過注解或者 XML 文件來進行配置和映射。
通常情況下,一個 Mapper 接口對應一個數據模型(如一個數據庫表),它包含了針對該數據模型的各種操作方法。這些方法的名稱和參數類型通常與具體的 SQL 語句相對應,使得調用者能夠直觀地理解該方法所執行的操作。
MyBatis 提供了多種方式來配置 Mapper 接口和 SQL 語句的映射關系,包括注解方式和 XML 文件方式。通過這些配置,MyBatis 能夠將接口方法與對應的 SQL 語句關聯起來,從而實現數據庫操作的執行。
MyBatis相當于原來的DAO,區別是Mapper僅僅是接口,不需要提供實現類
在Java文件夾下創建cn.niutr.mybatis.mapper.UserMapper接口
我們為什么要創建這個接口?
Mybatis中有面向接口編程的功能,當我們調用接口中的方法時會自動匹配一個SQL語句并執行。
創建Mybatis的映射文件
我們知道Mybatis是一個ORM(Object Relational Mapping,對象 - 關系映射)框架。
- Object:Java實體類對象
- Relational:關系型數據庫
- Mapping:二者之間的對應關系
Java概念 | 數據庫概念 |
---|---|
類 | 表 |
屬性 | 字段/列 |
對象 | 記錄/行 |
1、映射文件的命名規則: 表所對應的實體類的類名+Mapper.xml
例如:表user,映射的實體類為User,所對應的映射文件為UserMapper.xml
因此一個映射文件對應一個實體類,對應一張表的操作 MyBatis映射文件用于編寫SQL,訪問以及操作表中的數據 MyBatis映射文件存放的位置是src/main/resources/mappers目錄下
我們在resources文件夾下創建一個mappers文件夾用來存儲我們的映射文件,同時創建一個映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" resultType="Blog">select * from Blog where id = #{id}</select>
</mapper>
映射文件在官方文檔中也可以找到
復制映射文件到UserMapper.xml下
同時我們還要修改上面的內容,這里我簡單解釋一下:
- :定義了一個 Mapper(映射器)元素,指定了命名空間為 “org.mybatis.example.BlogMapper”,這個命名空間通常與 Java 中的 Mapper 接口對應。
我們需要改的地方:
假如我們要執行一個插入操作,我們需要再UserMapper接口中添加對應的方法
同時我們還需要在XML中創建映射關系
2、MyBatis中可以面向接口操作數據,要保證兩個一致:
① mapper接口的全類名和映射文件的命名空間(namespace)保持一致
② mapper接口中方法的方法名和映射文件中編寫SQL的標簽的id屬性保持一致
表–實體類–mapper接口–映射文件
注意還要修改映射器資源位置
經過一些列操作之后,我們的Mybatis就已經配置完成了
通過Junit測試功能
首先我們要在test文件夾下的java目錄創建一個MybatisTest類用于測試
接下來我們要創建一個測試方法
//讀取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//創建SqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new
SqlSessionFactoryBuilder();
//通過核心配置文件所對應的字節輸入流創建工廠類SqlSessionFactory,生產SqlSession對象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//創建SqlSession對象,此時通過SqlSession對象所操作的sql都必須手動提交或回滾事務
//SqlSession sqlSession = sqlSessionFactory.openSession();
//創建SqlSession對象,此時通過SqlSession對象所操作的sql都會自動提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//通過代理模式創建UserMapper接口的代理實現類對象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//調用UserMapper接口中的方法,就可以根據UserMapper的全類名匹配元素文件,通過調用的方法名匹配
映射文件中的SQL標簽,并執行標簽中的SQL語句
int result = userMapper.insertUser();
sqlSession.commit();
System.out.println("結果:"+result);
創建結果如下:
插入成功!
加入log4j日志功能
添加所需依賴
添加依賴到pom.xml中,開發文檔
<!--log4j-->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.23.0</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.23.0</version>
</dependency>
加入所需配置文件
log4j2的配置文件名為log4j2.properties,存放的位置是src/main/resources目錄下
# log4j2.properties# Set to debug or trace if log4j initialization is failing
status = warn# Name of the configuration
name = ConsoleLogConfigDemo# Console appender configuration
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n# Root logger level
rootLogger.level = debug# Root logger referring to console appender
rootLogger.appenderRef.stdout.ref = consoleLogger
結果如下
MyBatis的增刪改查
添加
<!--int insertUser();-->
<insert id="insertUser">
insert into t_user values(null,'admin','男',23)
</insert>
刪除
<!--int deleteUser();-->
<delete id="deleteUser">
delete from user where id = 18
</delete>
修改
<!--int updateUser();-->
<update id="updateUser">
update user set name='yxc' where id = 18
</update>
查詢一個實體類對象
<!--User getUserById();-->
<select id="getUserById" resultType="cn.niutr.mybatis.pojo.User">
select * from user where id = 22
</select>
查詢所有用戶信息
<select id="getAllUser" resultType="cn.niutr.mybatis.pojo.User">select * from user
</select>
如下測試文件
@Test
public void testCRUD() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession(true);UserMapper mapper = sqlSession.getMapper(UserMapper.class);//int result = mapper.UpdateUser();//int result = mapper.deleteUser();// User user = mapper.getUserById();// System.out.println(user);List<User> allUser = mapper.getAllUser();for (User user : allUser) {System.out.println(user);}
}