記事のディレクトリ
1.MyBatisコアコンポーネント
MyBatisのコアコンポーネントは4つの部分に分かれています。
-
SqlSessionFactoryBuilder:構成またはコードに基づいてSqlsessionFactoryを生成し、分散ビルドビルダーモード(ビルダーモード)を使用します。
-
SqlSessionFactory:ファクトリモードを使用してSqlSessionを生成するためにそれに依存するファクトリインターフェイス。
-
SqlSession:セッション、SQLステートメントを送信できます。また、マッパーマッピングファイルのインターフェイスを取得することもできます。
-
SQLマッパー:マッパーは、マッパーxmlファイルと対応するJavaインターフェイスで構成されます。対応するSQLとマッピングルールを指定する必要があります。SQLの送信と実行、および結果の返送を担当します。
2、SqlSessionFactory
SqlSessionFactoryの構築は、SqlSessionFactoryBuilderを使用して段階的にガイドする必要があります。最も一般的に使用される方法は、SqlSessionFactoryBuilderによって構成ファイルXMLを読み取ってSqlSessionFactoryを生成することですが、MybatisはJavaコード構成方法も提供します(推奨されません。コードが長くなります)。 )。
構成ファイルが提供されると、MybatisはConfigurationクラスオブジェクトを介してMybatisコンテキスト全体を構築します。(SqlSessionFactoryはインターフェースであり、SqlSessionManager(マルチスレッド環境で使用される)とDefaultSqlSessionFactory(一般的に使用される)があります)。各Mybatisアプリケーションは、中心としてSqlSessionFactoryのインスタンスに基づいており、その唯一の役割は、コアインターフェイスオブジェクトSqlSessionを生成することです。したがって、シングルトンモードで処理する必要があります。
3、SqlSession
Mybatisでは、SqlSessionがコアインターフェイスであり、その機能は、データベースリンクリソースの開始を表すJDBCのConnectionオブジェクトに似ています。その主な機能には、マッパーインターフェイスを取得、データベースにSQLを送信し、トランザクション制御。しかし、SqlSessionはプロキシオブジェクトのようなものであり、Executorが実際に作業を担当します。SqlSessionはデータベース接続リソースを表すことに注意してください。時間内に閉じる必要があります。そうしないと、データベース接続リソースが使い果たされたときにシステムが麻痺します。
4、マッパー
これはmybatisで最も複雑で重要なコンポーネントであり、インターフェイスと対応するxmlファイル(または注釈)で構成されています。その主な機能は次のとおりです。
- マッピングルールを説明する
- SQLステートメント、構成パラメータータイプ、戻り値タイプなどを提供します。
- キャッシュを構成する
- 動的SQL関数を提供する
5.ライフサイクルの概要
- SqlSessionFactoryBuilder:その役割はSqlSessionFactoryを作成することであるため、SqlSessionFactoryを作成するメソッドにのみ存在でき、長期間存在させないでください。
- SqlSessionFactory:データベースのリンクリソースを占有するデータベース接続プールと見なすことができます。mybatisの本質はデータベースを操作することであるため、mybatisアプリケーション全体に存在する必要があります。
- SqlSession:データベース接続と見なされ、ビジネスリクエストのみが存続します。リクエストが終了したら、リソースをSqlSessionFactoryに返す必要があります。
- マッパー:SqlSessionによって作成されたインターフェースで、リクエスト内のビジネス処理ロジックを表すため、ライフサイクルはSqlSessionと一致している必要があります。
6.簡単な入力
主なディレクトリは次のとおりです。
6.1、pomファイル
依存関係の追加:主にmybatisとmysqlの依存関係パッケージ(必須)、単体テストとログ(オプション)
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
6.2、POJO类
package domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
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 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 + '\'' +
'}';
}
}
6.3、IUserDao
package dao;
import domain.User;
import java.util.List;
public interface IUserDao {
/**
* 查询所有操作
* @return
*/
List<User> findAll();
}
6.4、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="dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultType="domain.User">
select * from user
</select>
</mapper>
6.5、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"></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=""/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="dao/IUserDao.xml"/>
</mappers>
</configuration>
6.6、ログファイル
ログを追加する必要がある場合は、構成ファイルが必要です
# 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
6.7、テストクラス
package service;
import dao.IUserDao;
import 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.Test;
import java.io.InputStream;
import java.util.List;
/**
* @author RuiMing Lin
* @date 2020-04-09 14:49
*/
public class UserService {
private IUserDao userDao;
@Test
//测试方法
public void Test1() 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();
}
}