MyBatis(1):實現MyBatis程式
一,MyBatis介紹
MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO(Plain Old Java Objects,普通的Java物件)對映成資料庫中的記錄
二,MyBatis優點
不用再去寫複雜的JDBC程式碼
- 簡單易學,不依賴第三方的程式或者框架。
- 官網文件強大,開源,我們可以隨時分析原始碼’;
- 實現解耦,低耦合,高內聚
- ORM;物件關係對映
- 提供XML標籤;
三, Mybatis程式
1,搭建實驗環境,建立一個數據庫
1-1,MySQL程式碼
CREATE DATABASE `mybatis` ;
USE mybatis
;
DROP TABLE IF EXISTS user
;
CREATE TABLE user
(
id
INT(20) NOT NULL,
name
VARCHAR(30) DEFAULT NULL,
pwd
VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO user
(id
,name
,pwd
)
VALUES (1,'閃電俠','123'),(2,'蜘蛛俠','abc'
),(3,'鋼鐵俠','520');
1-2,執行結果
2,建立一個普通的Maven專案
2-1,建立Maven
2-2,編寫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>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>com.Shandx<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>ssm-mybatis-study<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>1.0-SNAPSHOT<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependencies</span>></span>
<span class="hljs-comment"><!--單元測試--></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>junit<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>junit<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>4.11<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-comment"><!--mybatis的包--></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.mybatis<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>mybatis<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>3.5.1<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-comment"><!--連線資料庫的驅動包--></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>mysql<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>mysql-connector-java<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>5.1.47<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependencies</span>></span>
<span class="hljs-tag"><<span class="hljs-name">build</span>></span>
<span class="hljs-comment"><!--希望maven在匯出專案的時候,能夠將我們的配置及資源匯出--></span>
<span class="hljs-tag"><<span class="hljs-name">resources</span>></span>
<span class="hljs-tag"><<span class="hljs-name">resource</span>></span>
<span class="hljs-tag"><<span class="hljs-name">directory</span>></span>src/main/java<span class="hljs-tag"></<span class="hljs-name">directory</span>></span>
<span class="hljs-tag"><<span class="hljs-name">includes</span>></span>
<span class="hljs-tag"><<span class="hljs-name">include</span>></span>**/*.properties<span class="hljs-tag"></<span class="hljs-name">include</span>></span>
<span class="hljs-tag"><<span class="hljs-name">include</span>></span>**/*.xml<span class="hljs-tag"></<span class="hljs-name">include</span>></span>
<span class="hljs-tag"></<span class="hljs-name">includes</span>></span>
<span class="hljs-tag"><<span class="hljs-name">filtering</span>></span>false<span class="hljs-tag"></<span class="hljs-name">filtering</span>></span>
<span class="hljs-tag"></<span class="hljs-name">resource</span>></span>
<span class="hljs-tag"><<span class="hljs-name">resource</span>></span>
<span class="hljs-tag"><<span class="hljs-name">directory</span>></span>src/main/resources<span class="hljs-tag"></<span class="hljs-name">directory</span>></span>
<span class="hljs-tag"><<span class="hljs-name">includes</span>></span>
<span class="hljs-tag"><<span class="hljs-name">include</span>></span>**/*.properties<span class="hljs-tag"></<span class="hljs-name">include</span>></span>
<span class="hljs-tag"><<span class="hljs-name">include</span>></span>**/*.xml<span class="hljs-tag"></<span class="hljs-name">include</span>></span>
<span class="hljs-tag"></<span class="hljs-name">includes</span>></span>
<span class="hljs-tag"><<span class="hljs-name">filtering</span>></span>false<span class="hljs-tag"></<span class="hljs-name">filtering</span>></span>
<span class="hljs-tag"></<span class="hljs-name">resource</span>></span>
<span class="hljs-tag"></<span class="hljs-name">resources</span>></span>
<span class="hljs-tag"></<span class="hljs-name">build</span>></span>
</project>
3,編寫程式碼
3-1,建立pojo實體類
public class User {
<span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> id;
<span class="hljs-keyword">private</span> String name;
<span class="hljs-keyword">private</span> String pwd;
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">User</span><span class="hljs-params">()</span> </span>{
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">User</span><span class="hljs-params">(<span class="hljs-keyword">int</span> id, String name, String pwd)</span> </span>{
<span class="hljs-keyword">this</span>.id = id;
<span class="hljs-keyword">this</span>.name = name;
<span class="hljs-keyword">this</span>.pwd = pwd;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getId</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> id;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setId</span><span class="hljs-params">(<span class="hljs-keyword">int</span> id)</span> </span>{
<span class="hljs-keyword">this</span>.id = id;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> name;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span><span class="hljs-params">(String name)</span> </span>{
<span class="hljs-keyword">this</span>.name = name;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getPwd</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> pwd;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setPwd</span><span class="hljs-params">(String password)</span> </span>{
<span class="hljs-keyword">this</span>.pwd = password;
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">toString</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">"User{"</span> +
<span class="hljs-string">"id="</span> + id +
<span class="hljs-string">", name='"</span> + name + <span class="hljs-string">'\''</span> +
<span class="hljs-string">", pwd='"</span> +pwd + <span class="hljs-string">'\''</span> +
<span class="hljs-string">'}'</span>;
}
}
3-2,在resources下建一個mybatis-config.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代表預設的是那一套-->
<environments default="development">
<!--配置一套環境 id .環境的名字-->
<environment id="development">
<!--transactionManager:事務管理,type:jdbc-->
<transactionManager type="JDBC"/>
<!--dataSource 資料來源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--xml中不允許&符號直接出現,我們需要使用 & 代替-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&charsetEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
3-3,建立工具類
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
//mybatis的工具類,重複的程式碼的提純
public class MyBatisUtils {
<span class="hljs-comment">//類變數不需要設定預設值;</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-type">SqlSessionFactory</span> sqlSessionFactory;
<span class="hljs-keyword">static</span> {
<span class="hljs-comment">//在maven中,所有的資原始檔一般都放在resources目錄下,我們可以直接拿到。</span>
<span class="hljs-keyword">try</span> {
<span class="hljs-type">String</span> resource = <span class="hljs-string">"mybatis-config.xml"</span>;
<span class="hljs-type">InputStream</span> inputStream = <span class="hljs-type">Resources</span>.getResourceAsStream(resource);
sqlSessionFactory = new <span class="hljs-type">SqlSessionFactoryBuilder</span>().build(inputStream);
} <span class="hljs-keyword">catch</span> (<span class="hljs-type">IOException</span> e) {
e.printStackTrace();
}
}
<span class="hljs-comment">//設定SqlSessionFactory公共的方法</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-type">SqlSessionFactory</span> getSqlSessionFactory(){
<span class="hljs-keyword">return</span> sqlSessionFactory;
}
}
3-4,對映檔案的介面
import com.shandx.pojo.User;
import java.util.List;
public interface UserMapper {
<span class="hljs-comment">//獲取全部的使用者</span>
<span class="hljs-function">List<User> <span class="hljs-title">selectUser</span><span class="hljs-params">()</span></span>;
}
3-5,編寫對應的mapper對映檔案
<?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對應Mapper介面的類-->
<mapper namespace="com.Shandx.dao.UserMapper">
<!--select標籤的id對應對映介面的方法名字 resultType:返回結果的型別 中間就編寫sql語句-->
<select id="selectUser" resultType="com.Shandx.pojo.User">
select * from user
</select>
</mapper>
3-6,在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代表預設的是那一套-->
<environments default="development">
<!--配置一套環境 id .環境的名字-->
<environment id="development">
<!--transactionManager:事務管理,type:jdbc-->
<transactionManager type="JDBC"/>
<!--dataSource 資料來源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--xml中不允許&符號直接出現,我們需要使用 & 代替-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&charsetEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<span class="hljs-comment"><!--關聯對映檔案--></span>
<span class="hljs-tag"><<span class="hljs-name">mappers</span>></span>
<span class="hljs-tag"><<span class="hljs-name">mapper</span> <span class="hljs-attr">resource</span>=<span class="hljs-string">"com/kuang/dao/userMapper.xml"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">mappers</span>></span>
</configuration>
4,測試一下
在maven的test資料夾下編寫對應的測試類
import com.Shandx.dao.UserMapper;
import com.Shandx.pojo.User;
import com.Shandx.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
@Test
public void selectUser(){
<span class="hljs-comment">//1.拿到sqlSessionFactory物件</span>
<span class="hljs-type">SqlSessionFactory</span> sqlSessionFactory = <span class="hljs-type">MyBatisUtils</span>.getSqlSessionFactory();
<span class="hljs-comment">//2.通過sqlSessionFactory物件openSession()建立一個sqlSession。</span>
<span class="hljs-type">SqlSession</span> sqlSession = sqlSessionFactory.openSession();
<span class="hljs-comment">//3.通過sqlSession獲得mapper物件 , 引數為對映檔案對應的介面類的class物件</span>
<span class="hljs-type">UserMapper</span> mapper = sqlSession.getMapper(<span class="hljs-type">UserMapper</span>.<span class="hljs-keyword">class</span>);
<span class="hljs-comment">//4.通過mapper物件來執行操作;</span>
<span class="hljs-type">List</span><<span class="hljs-type">User</span>> users = mapper.selectUser();
<span class="hljs-comment">//獲得結果集</span>
<span class="hljs-keyword">for</span> (<span class="hljs-type">User</span> user : users) {
<span class="hljs-type">System</span>.out.<span class="hljs-built_in">println</span>(user);
}
}
}