3、mybatis的使用
【目的】
我不是爲了瞭解其中實現的細節而去學這個ssm框架的,雖然現在企業用的很多都是ssm框架,但是我暫時不需要找工作,我的目的很明確,爲了搭建一個web框架,供我臨時使用。
1、準備工作
1.1 編譯環境:IDEA+mysql-server+Navicat Premium
其中Navicat Premium是mysql的一個可視化界面,我電腦上沒有按照mysql的全套exe執行文件去自動安裝的,我只是安裝了一個數據庫,單純的數據庫,沒有可視化界面等等一系列東西。
具體安裝的方法可以參考博客
https://www.cnblogs.com/reyinever/p/8551977.html
http://www.runoob.com/mysql/mysql-install.html
我不建議安裝整套的,因爲太大了,而且mysql自帶的workbench不是很好用,這個我之前一直用的是這個。
後來發現mysql-server+Navicat Premium就很好用了
1.2 數據表的準備
插入數據sql語句
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用戶名稱',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性別',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龍'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龍'),(45,'傳智播客','2018-03-04 12:04:06','男','北京金燕龍'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小馬寶莉','2018-03-08 11:44:00','女','北京修正');
2、使用mybatis
忽略我左邊的項目,直接右邊點擊create new project
填寫項目名稱
不選擇模板
next
啓用自動導包
2.1 添加pom.xml座標
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
2.2 創建User.java實體類
將User.java中的屬性,對應User表中的屬性
生成getter 和setter方法
2.3 創建IUserDao.java接口
這個文件和User.java放在同一級別的目錄下,但是不同的包中。
2.4 在IUserDao中編寫接口方法
2.5 編寫SqlConfigMap.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">
<configuration>
<!--配置環境-->
<environments default="mysql">
<environment id="mysql">
<!--配置事務的類型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置數據源,(連接池)-->
<dataSource type="POOLED">
<!--配置連接數據庫的4個基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
2.6 創建IUserDao.xml文件
這裏的IUserDao.xml文件放在com.huiyu.dao文件夾下面,但是在resources這個文件下不能直接創建三級目錄,這裏要分三次,每次創建一個文件夾,如先創建com.再創建huiyu.再創建dao文件夾,最後創建IUserDao.xml文件。不然這裏會出問題。
在這個IUserDao.xml文件中編寫查詢語句
<?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="com.huiyu.dao.IUserDao">
<!-- 配置查詢所有操作 -->
<select id="findAll" resultType="com.huiyu.domain.User"> select * from user </select>
</mapper>
這個就對應在IUserDao.java中接口中編寫的接口的實現。
我們寫完這個就不需要再編寫實現類了,相當於findAll接口的實現類已經寫完了。
需要注意的是:這裏的select中的id就是我們接口中的接口方法,兩者需要同名。
而這裏相當於調用這個查詢語句,每次我們系統調用IUserDao.java中的接口時,系統會先在這裏找到相應的xml實現,爲了能夠找到這個,我們需要在 的namespace寫出我們的接口所在的包,這樣系統就知道我們這個xml是和接口方法相對應的,select對應接口方法,用這條語句查詢到的數據將映射到我們的結果集中。
所以這個resultType需要定義返回對象需要封裝在什麼類中。也就是我們之前編寫的User.java類,這就是爲什麼這個類中的所有屬性都需要和數據庫中的屬性名對應的原因了。因爲這個select語句查詢到的數據是數據庫中的數據,需要封裝在對應的java類中才能在java語言中遍歷打印(這樣解釋應該能理解了)
這樣我們就相當於全部寫完了方法,然後爲了能夠讓mybaitis能夠找到這個實現方法,我們需要在SqlConfigMap.xml中添加mapper
所有方法就差不多實現了,其實大部分是mybatis自動實現,我們開始編寫測試類。
2.7 編寫測試類
測試類的代碼大部分細節是不需要知道的。只需要將代碼貼上:
package com.huiyu.test;
import com.huiyu.dao.IUserDao;
import com.huiyu.domain.User;
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.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @Auther: huiyu
* @Date: 2019/4/19
* @Description: com.huiyu.test
*/
public class UserTest {
private InputStream in;
private SqlSession session;
private IUserDao userDao;
@Before
public void init() throws IOException {
//1.讀取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2.創建 SqlSessionFactory 的構建者對象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3.使用構建者創建工廠對象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生產 SqlSession 對象
session = factory.openSession();
//5.使用 SqlSession 創建 dao 接口的代理對象
userDao = session.getMapper(IUserDao.class);
}
@After
public void destory() throws IOException {
session.commit();
//7.釋放資源
session.close();
in.close();
}
/**
* 查找所有入門案例
* @param
*/
@Test
public void findAllTest(){
//6.使用代理對象執行查詢所有方法
List<User> users = userDao.findAll();
for(User user : users)
{
System.out.println(user);
}
}
}
在finAllTest()方法上右鍵,選擇運行。便可以查詢到我們需要的結果。
再最後看一下項目的結構:
這裏的log4j只需要複製進去即可:
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
3、總結一下
按順序我們做的工作是:
- 創建數據表
- 創建表對應的實體類,生成getter和setter方法,生成toString方法
- 創建對應的IUserDao.java接口類,編寫查詢接口方法
- 創建SqlConfigMap.xml,將配置信息複製進去
- 創建IUserDao.xml文件,編寫select查詢語句,將結果集映射到java實體中
- 在SqlConfigMap.xml添加這裏映射到我們新編寫的IUserDao.xml文件
- 編寫測試類,運行
說明:只要熟悉這個過程之後,其他的增刪改查等一系列操作都是按照這個流程來的,至於其中的很多代碼,比如測試類中:
個人學習框架的方法
我們不需要知道這些代碼的實際含義,只需要在我們的測試方法中調用dao中的接口即可。
等到熟悉了所有的流程後,我們便可以再回頭去學習這些代碼的具體含義,比如我們在IUserDao.xml中,可以添加where標籤,可以添加別名,可以建立多表查詢,但是這些複雜的查詢,都是在這個簡單的基礎上進行擴展的,而我們學習的時候,要把最基本的框架熟練掌握。
然後在此框架上進行衍生一些其他複雜的操作,而複雜的操作也不過就是在這框架上多加了一點東西,這個時候多加這些東西,我們便可以查找相關的文檔,比如IUserDao.xml文件中,我們可以查找文檔,學到還有很多標籤等。
所以學習需要有方法,抓總體,再回頭細看局部。