MyBatis入門
MyBatis環境搭建
使用IDEA搭建MyBatis環境
1.創建Maven工程並添加依賴
pom.xml中添加依賴:(log4j可以在控制檯輸出執行的sql語句,便於觀察)
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13-beta-3</version>
<scope>test</scope>
</dependency>
</dependencies>
2.創建實體類和dao的接口
注意包名,在src/main/java下創建包com.cjx.entity和com.cjx.dao
package com.cjx.entity;
import java.io.Serializable;
import java.util.Date;
/**
* @author :
* @date :Created in 2019/11/7 17:03
* @description : user
*/
public class User implements Serializable {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
package com.cjx.dao;
import com.cjx.entity.User;
import java.util.List;
/**
* @author :
* @date :Created in 2019/11/7 17:07
* @description : dao
*/
public interface IUserDao {
/**
* @author :
* @description :查詢所有
* @date :Created in 2019/11/7
*/
List<User> findAll();
}
3.創建MyBatis主配置文件:SqlMapConfig.xml
這裏要提前準備好一個數據庫,這裏取名爲eesy_mybatis,表名爲user,設計如下圖:
隨便往裏面添加一些數據。
在resources中創建文件SqlMapConfig.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>
<!-- 配置環境 -->
<environments default="mysql">
<!-- 配置MySQL環境 -->
<environment id="mysql">
<!-- 配置事務類型 -->
<transactionManager type="JDBC"/>
<!-- 配置數據源/連接池 -->
<dataSource type="POOLED">
<!-- 配置連接數據庫的4個基本信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="1999"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置 -->
<mappers>
<mapper resource="com/cjx/dao/IUserDao.xml"/>
</mappers>
</configuration>
4.創建映射配置文件
在resources中創建目錄com.cjx.dao,然後創建文件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.cjx.dao.IUserDao">
<!-- 配置查詢所有 -->
<select id="findAll" resultType="com.cjx.entity.User">
select * from user
</select>
</mapper>
5.創建log4j的配置文件
與SqlMapConfig同級創建log4j.properties文件
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.R.File=../logs/service.log
#log4j.appender.R.layout=org.apache.log4j.PatternLayout
#log4j.appender.R.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.logger.com.ibatis = debug
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = debug
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner = debug
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = debug
#log4j.logger.java.sql.Connection = debug
log4j.logger.java.sql.Statement = debug
log4j.logger.java.sql.PreparedStatement = debug
log4j.logger.java.sql.ResultSet =debug
搭建環境的注意事項
- 創建IUserDao.xml和IUserDao.java時名稱是爲了和以前的知識保持一致。在MyBatis中把持久層的操作接口名稱和映射文件也叫做Mapper。所以在其他項目中可能叫IUserMapper,到時候也要能看懂。
- 在idea中創建目錄時和包是不一樣的。包在創建是com.cjx.dao,這是一個三級的結構,而目錄com.cjx.dao,這是一個1級的目錄,目錄的名字就叫“com.cjx.dao”,創建目錄必須用斜槓,即com/cjx/dao,纔會創建三級目錄,在IDEA2019中會默認把目錄也摺疊成com.cjx.dao的形式,如果要創建一個service目錄,那麼就還在resources目錄下創建一個com/cjx/service,就可以正常創建。
(此圖展示com/cjx/dao的情況下IDEA2019中會默認把目錄也摺疊成com.cjx.dao的形式)
- MyBatis的映射配置文件位置必須和dao接口的包結構相同,包在com.cjx.dao,那麼xml也必須在resources中的com/cjx/dao。
- 映射配置文件的mapper標籤的namespace屬性的取值必須是dao接口的全限定類名。
- 映射配置文件的操作配置(如select),id屬性的取值必須是dao接口的方法名,因爲查詢操作有返回值,所以必須指定一個返回的結果類型,屬性爲resultType,取值是返回值的類,這裏就是user。
當我們遵從了3、4、5點後,我們在開發中就無需再寫dao的實現類,剩下的功能會由MyBatis來實現。
MyBatis入門案例
創建測試函數實現數據庫查詢
在test/java中創建包com.cjx.test,創建類MybatisTest,在類中創建Main函數,主要有以下幾步:
- 讀取配置文件
- 創建SqlSessionFactory工廠
- 使用工廠生產一個SqlSession對象
- 使用SqlSession創建dao接口的代理對象
- 使用代理對象執行方法
- 釋放資源
代碼如下:
package com.cjx.test;
import com.cjx.dao.IUserDao;
import com.cjx.entity.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 java.io.InputStream;
import java.util.List;
/**
* @author :
* @date :Created in 2019/11/8 10:12
* @description : 入門案例
*/
public class MybatisTest {
/**
* @author :
* @description :入門案例
* @param : [args]
* @return : void
* @date :Created in 2019/11/8
*/
public static void main(String[] args) throws Exception {
//1.讀取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.創建SqlSessionFactory工廠
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工廠生產一個SqlSession對象
SqlSession session = factory.openSession();
//4.使用SqlSession創建dao接口的代理對象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理對象執行方法
List<User> users = userDao.findAll();
for (User user :
users) {
System.out.println(user);
}
//6.釋放資源
session.close();
in.close();
}
}
點擊運行後可能出現的一些問題
不支持發行版本 5
這是因爲Maven默認的Java版本是1.5,而大部分人裝的都是新的版本。解決方法如下:
- 在File->Settings->Build,Excution,Deployment->Compiler->Java Compiler中設置target bytecode version爲13(我的是13,其他人可能是1.8)
- 在pom.xml中與<dependencies>同級的配置中加入
<properties>
<java.version>13</java.version>
<maven.compiler.source>13</maven.compiler.source>
<maven.compiler.target>13</maven.compiler.target>
</properties>
- 在File->Project Structure->Project Settings->Project中修改兩處Project SDK
- 在Modules中也修改一處Language Level
訪問數據庫時可能出現的時區問題
解決方法:在數據庫鏈接後面加上時區參數"?serverTimezone=UTC",即修改SqlMapConfig.xml文件中的這一句
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"/>
使用註解方式重新運行此項目
使用註解方式就可以刪除掉映射配置文件,使用註解來代替,使項目更加簡潔。
1.在dao接口中添加註解指定sql語句
在創建dao接口時,在findAll方法上加註解@Select(“select * from user”)即可取代映射配置文件。代碼如下:
package com.cjx.dao;
import com.cjx.entity.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author :
* @date :Created in 2019/11/7 17:07
* @description : dao
*/
public interface IUserDao {
/**
* @author :
* @description :查詢所有
* @date :Created in 2019/11/7
*/
@Select("select * from user")
List<User> findAll();
}
2.在主配置文件中配置mapper
在SqlMapConfig.xml中,配置mapper時使用class屬性指定dao接口的全限定類名,代碼如下:(主要是最後幾行發生了變化),配置完成後就可以把resources下的com.cjx.dao.IUserDao.xml文件刪掉,因爲註解可以完全取代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>
<!-- 配置環境 -->
<environments default="mysql">
<!-- 配置MySQL環境 -->
<environment id="mysql">
<!-- 配置事務類型 -->
<transactionManager type="JDBC"/>
<!-- 配置數據源/連接池 -->
<dataSource type="POOLED">
<!-- 配置連接數據庫的4個基本信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1999"/>
</dataSource>
</environment>
</environments>
<!-- 使用xml方式配置時這裏指定映射配置文件的位置,但是本次使用註解配置,應該使用class屬性指定被註解的dao全限定類名 -->
<mappers>
<mapper class="com.cjx.dao.IUserDao"/>
</mappers>
</configuration>
刪除IUserDao.xml後再次點擊運行,仍然可以成功運行。