引言
mybatis框架是一個基於Java的持久層框架,支持自定義框架,本篇文章主要是瞭解mybatis框架,對mybatis框架做一個簡單的入門,瞭解mybatis框架是如何實現java持久層的操作的,比對於傳統的jdbc操作mybatis框架的優勢在哪裏
知識是用來共享的,但是希望轉載的時候能註明原地址,本文作者雷雨
文章目錄
什麼是框架?
軟件的半成品,解決了軟件過程當中的普適性問題,從而簡化了開發步驟,提供了開發的效率
什麼是ORM框架?
- ORM(Object Relational Mapping)對象關係映射,將程序中一個對象和表中中的一行數據一一對應
- ORM框架提供了持久化類與表的映射關係,在運行時參照文件的信息,把隊象持久化到數據庫中
使用JDBC完成ORM操作的缺點?
- 存在大量的冗餘代碼(加載驅動,獲取連接,釋放連接)
- 手工創建Connection.Statement等
- 手工將結果集封裝成實體隊象
- 查詢效率低,沒有對數據庫訪問進行過優化(Not Cache)
MyBatis框架
概念
- MyBatis本是Apache軟件基金會的一個開源項目iBatis,2010年這個項目由apache asoftware foundation 遷移到了Goole Code,並且改名爲MyBatis,2013年11月遷移到GitHub
- Mybatis是一個優秀的基於Java的持久層框架,支持自定義SQL,存儲過程和高級映射
- Mybatis對原有JDBC操作進行了封裝,幾乎消除了所有JDBC代碼,使開發者只需關注SQL本身
- MyBatis可以使用簡單的XML或Annotation來配置執行SQL,並且自動完成ORM操作,將執行結果返回
mybatis的開發步驟
核心配置
構建好maven項目後再pom.xml的配置信息中
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>per.leiyu</groupId>
<artifactId>Mybatis1</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<!--Mybatis的核心依賴 -->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- 導入mysql的驅動依賴-->
<!-- 因爲我們的mybatis的框架就是對數據庫操作的框架,因此需要導入我們所要操作的數據庫的驅動依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!--配置jdk -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
除了在pom.xml中寫相關配置,還需要在配置文件中提供一個mybatis的配置文件(寫詳細的關於數據庫和mybatis的配置信息)一般爲了見名知意—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">
<!-- 上面是mybatis的配置文件的頭-->
<configuration>
<!--下面這些是對mybatis的核心配置
層級和標籤的名稱是固定的,如果有需要就按照這個模板寫就可以
-->
<environments default="leiyu_mybaits">
<!-- 配置和數據庫相關的信息-->
<environment id="leiyu_mybaits"><!--相當於我們對我們在environment配置中起一個名字,然後我們可以再通過在上面的default中來默認使用我們配置好的信息 -->
<!-- 事務控制類型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置數據庫連接信息 -->
<!-- 這裏通過配置type的類型,實現的連接池的引入,比之前方便很多-->
<dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory">
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- 轉義字符& 方法在下面標籤中有具體演示-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 註冊我們的mapper文件 -->
<mappers>
<mapper resource="UserDaoMapper.xml"/>
</mappers>
</configuration>
創建數據庫,創建表
create datebase mybatis default charset = uff8;
use mybatis;
create table t_user(
id int parmary key auto_increment,
username varchar(50),
passward varchar(50),
gender tinyint,
regist_time datetime
)defaault charset=utf8;
在數據庫可視化工具或者IDea中集成的mysql來創建數據庫和表 |
---|
創建實體類
- 創建實體類User對應着數據庫中的t_user表
package per.leiyu;
import java.util.Date;
/**
* @author 雷雨
* @date 2020/6/11 10:03
*/
public class User {
private Integer id;
private String username;
private String passward;
private Boolean gender;
private Date registTime;
public User() {
super();
}
public User(Integer id, String username, String passward, Boolean gender, Date registTime) {
this.id = id;
this.username = username;
this.passward = passward;
this.gender = gender;
this.registTime = registTime;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", passward='" + passward + '\'' +
", gender=" + gender +
", registTime=" + registTime +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassward() {
return passward;
}
public void setPassward(String passward) {
this.passward = passward;
}
public Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Date getRegistTime() {
return registTime;
}
public void setRegistTime(Date registTime) {
this.registTime = registTime;
}
}
定義Dao接口
- 也就是我們要執行的sql語句的接口
package per.Dao;
import per.leiyu.User;
/**
* @author 雷雨
* @date 2020/6/11 10:06
*/
public interface UserDao {
User queryUserById(Integer id);
}
創建UserDaoMapper.xml
-
告訴mybatis中的UserDao接口中方法執行的sql語句是什麼,返回值是什麼,需要的參數怎麼提供給mybatis
-
mybatis框架中我們不再需要爲dao層的抽象的接口創建實體類,而是使用xml文件來管理jdbc的操作
-
mybatis框架爲我們把原本的註冊驅動,獲取連接,釋放資源等等的方法進行了封裝,簡化我們的開發,我們只需要通過配置和調用封裝好的方法就可以實現對jdbc的操作(內含了對數據庫操作的優化)
<?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">
<!-- 指明該xml文件時用來描述那個dao接口的-->
<mapper namespace="per.Dao.UserDao">
<!-- 描述方法 -->
<!--
id:描述的是那個接口中的那個方法
resultType:描述的方法的放回結果的類型
#{arg0}:表示的是接口中的第一個參數,那麼接口中的形參的第二個參數就用#{arg1}表示
-->
<select id="queryUserById" resultType="per.leiyu.User">
select * from t_user where id =#{arg0}
</select>
</mapper>
-
仔細觀察這個配置文件,你會發現我們把創建dao實現類,執行sql語句,把結果集封裝爲用戶對象都交給mybatis爲我們解決
-
我們寫好了mapper的配置文件需要在mybatis-config的配置文件中對我們寫好的mapper的配置文件啓用
創建測試類
package per.leiyu.UserDao;
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 per.Dao.UserDao;
import per.leiyu.User;
import java.io.IOException;
import java.io.InputStream;
/**
* @author 雷雨
* @date 2020/6/11 10:21
*/
public class TestUserDao {
public static void main(String[] args) throws IOException {
//1.加載配置文件
InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xml");
//2.構建 SqlSessionFactory的對象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.創建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.通過SqlSession獲取DAO實現類對象
//之前我們講DAO的實現類不是我們親自做的做的,是mybatis通過配置文件動態的早內存中通過反射爲我們做動態的,
//我們看不到這個類,但是需要這個類完成我麼的DAO的功能
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user1 = mapper.queryUserById(1);
User user2 = mapper.queryUserById(1);
System.out.println(user1);
System.out.println(user2);
}
}
獲取到了數據庫中的結果 (說明我們通過mybatis對數據庫操作成功) |
---|
從上面測試類,我們可以看出,我們通過id值獲取到了一個User對象,那麼mybatis是如何將結果集封裝爲User對象的呢?
問題:mybatis是如何將結果集封裝爲對象呢?
- 使用的是同名策略
mybatis是如何將結果集封裝爲對象? |
---|
由於regist_time和registTime的屬性名,列名不相同,導致了沒有將查詢結果集中的相關數據進行賦值.
解決方式可以在查詢時使用別名,別名爲在java類中想要對應的屬性名.
select id,username,passward,gender,regist_time as registTime from t_user where id=#{arg0}
mybatis開發步驟補充
解決mapper.xml存放在resources以外路徑中的讀取問題
在mybatis-config.xml文件中修改mapper文件的路徑
在pom.xml文件最後追加標籤,以便可以將文件複製到classes中,並在程序運行時正常讀取
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>*.xml</inclued>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
解決數據庫相關配置的問題
之前我們把數據庫相關的配置封裝在了mybatis的配置文件中,因爲mybatis的確是要來幫助我們操作數據庫,但是關於數據庫的賬號密碼這些關於數據庫的細節配置是時常會修改的,因此期望能把數據庫的細節配置和mybatis的配置分離開.
在配置文件中添加數據庫的配置:jdbc.properties
#jdbc.properties
jdbc.driver =com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true
jdbc.username=root
jdbc.passward=123456
修改後的mybatis-config.xml的配置
需要引入數據的配置文件jdbc.properties並且把其中的值賦給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">
<!-- 上面是mybatis的配置文件的頭-->
<configuration>
<!--下面這些是對mybatis的核心配置
層級和標籤的名稱是固定的,如果有需要就按照這個模板寫就可以
-->
<!-- 引入資源文件jdbc.properties-->
<properties resource="jdbc.properties" />
<environments default="leiyu_mybaits">
<!-- 配置和數據庫相關的信息-->
<environment id="leiyu_mybaits"><!--相當於我們對我們在environment配置中起一個名字,然後我們可以再通過在上面的default中來默認使用我們配置好的信息 -->
<!-- 事務控制類型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置數據庫連接信息 -->
<!-- 這裏通過配置type的類型,實現的連接池的引入,比之前方便很多-->
<dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory">
<!--使用$佔位符索引到jdbc.properties配置文件中的具體內容-->
<property name="driver" value="${jdbc.driver}" />
<!-- 轉義字符& 方法在下面標籤中有具體演示-->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.passward}" />
</dataSource>
</environment>
</environments>
<!-- 註冊我們的mapper文件 -->
<mappers>
<mapper resource="per/Dao/UserDaoMapper.xml"/>
</mappers>
</configuration>
這樣mybatis-config.xml中相關於數據庫的配置就和數據庫的配置jdbc.proerties相關聯了,jdbc.properties的配置發生改變,在mybatis-config.xml中相關的配置也會發生改變
類型別名(給實體類起一個別名)
我們之前要通過mybatis操作數據庫在結果集的返回類型,我們將其包裝爲我們的一個實體類的類型
沒起別名之前,我們需要寫這個實體類的全路徑 |
---|
每次都寫實體類的全路徑避免不要寫寫很多熱冗餘的代碼,我們期望給實體類起一個別名,那麼就需要在mybatis-config.xml中進行配置
<configuration>
<typeAliases>
<!-- 這裏種定義方式選擇一種 -->
<!-- <typeAlias type="per.leiyu.User" alias="User" />-->
<!-- 自動掃描包名,默認該包中的所有實體類的自己本身的名字作爲原來的全路徑的別名-->
<package name="per.leiyu"/>
</typeAliases>
</configuration>
創建log4j配置文件(創建日誌文件)
在pom.xml中導入依賴
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
給log4j創建一個配置文件:名字必須爲log4j.properties
#Global logging configuration
log4j.rootLogger=DEBUG,stdout
#Mybatis logging configuration
log4j.logger.org.mybatis.example.BlogMapper=TRACE
#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
最後附上項目結構
項目結構 |
---|