blog

牛皮である!MyBatisフレームワークの兄貴分を初めて見たが、とてもわかりやすいので、ぜひ見に来てほしい!

MyBatisは、優れたJavaベースの永続化フレームワークであり、内部的にjdbcをカプセル化するので、開発者は、SQLステートメント自体に焦点を当てる必要があり、ドライバのロードに対処するためにエ...

Oct 18, 2020 · 7 min. read
シェア

フレームワークの概要

MyBatisは優れたJavaベースの永続化フレームワークで、内部的にjdbcをカプセル化するため、開発者はsql文自体に集中すればよく、ドライバのロード、接続の作成、文の作成などの複雑な処理に労力を費やす必要がありません。myBatisは、xmlやアノテーションによって実行する各種ステートメントを設定し、javaオブジェクトの動的パラメータとステートメント内のsqlを対応付けることによって最終的に実行されるsqlステートメントを生成し、最後にmybatisフレームワークによってsqlを実行し、結果をjavaオブジェクトに対応付けして返します。ORMのアイデアを使用して、エンティティとデータベースのマッピングの問題を解決するために、jdbcカプセル化、jdbc apiの底部アクセスの詳細をシールドするので、jdbc apiに対処する必要はありません、あなたは、データベース操作の永続化を完了することができます。

従来のJDBC操作

もちろん、ちょうど前の段落では、利点とMyBatisフレームワークを習得する必要性を見ることができません。まず第一に、jdbc作成プロセスを確認し、コードは次のとおりです:

public static void main(String[] args) {
	Connection connection = null;
	PreparedStatement preparedStatement = null;
	ResultSet resultSet = null;
	
	try {
		//データベースドライバをロードする
		Class.forName("com.mysql.jdbc.Driver");
		//ドライバ管理クラスを通してデータベースリンクを取得する
		connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","ro
ot", "root");
		//SQLステートメントを定義する ?はプレースホルダを表す
		String sql = "select * from user where username = ?";
		//前処理ステートメントを取得する
		preparedStatement = connection.prepareStatement(sql);
		//パラメータを設定し、最初のパラメータは、SQLステートメント内のパラメータのシリアル番号であり、2番目のパラメータは、パラメータセットの値である。
		preparedStatement.setString(1, "ワン・ウー");
		//データベースにSQLクエリを発行し、結果セットをクエリする。
		resultSet = preparedStatement.executeQuery();
		//クエリ結果セットを繰り返し処理する
		while(resultSet.next()){
		 System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
		}
	} catch (Exception e) {
		e.printStackTrace();
	}finally{
		//リソースの解放
		if(resultSet!=null){
			try {
				resultSet.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} 
		}
		if(preparedStatement!=null){
			try {
				preparedStatement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} 
		}
		if(connection!=null){
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
		} 
	} 
}

問題の分析

従来のJDBCの欠点は、上記のケースから見つけることができます:

データベースリンクが作成され、システムリソースの無駄遣いの結果、頻繁にリリースされるため、システムのパフォーマンスに影響を与える場合は、データベースのリンクプールを使用すると、この問題を解決することができます。SQLステートメントは、コードにハードコードされ、保守が容易ではないコードで、その結果、SQLの変更の実際のアプリケーションが大きくなることがあります、SQLの変更は、Javaのコードを変更する必要があります。preparedStatementの使用は、所有権のシンボルにパラメータを渡すためにハードコーディングされ、sqlステートメントのwhere条件が確実ではないため、多かれ少なかれ、SQLを変更する必要がありますも、コードを変更するには、システムを維持することは容易ではありません。結果セットの解析はハードコード化されており、SQLの変更は解析コードの変更につながります。

プロジェクトのビルド

mavenプロジェクトを作成します:

パラメータ選択: Groupid : 企業識別 ArtifactId : プロジェクト名 Packing : jar

座標の追加

pom.xmlファイルに様々な座標を追加します:

 <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>
		 <scope>test</scope>
	 </dependency>
	 <dependency>
		 <groupId>mysql</groupId>
		 <artifactId>mysql-connector-java</artifactId>
		 <version>5.1.6</version>
		 <scope>runtime</scope>
	 </dependency>
	 <dependency>
		 <groupId>log4j</groupId>
		 <artifactId>log4j</artifactId>
		 <version>1.2.12</version>
	 </dependency>
 </dependencies>

pojoクラスを書きます:

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 + "]"; 
	} 
}

永続層インタフェースを記述します:

public interface IUserDao {
	/**
	* すべてのユーザーに照会る
	* @return
	*/
	List<User> findAll();
}

永続層インタフェースのマッピング・ファイルを記述します:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper 
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
 "http://.org/dtd/mybatis-3-.dtd"> 
<mapper namespace="com.itheima.dao.IUserDao">
	<!-- すべての操作に対してクエリを構成する> 
	<select id="findAll" resultType="com.itheima.domain.User">
	select * from user
	</select>
</mapper>

注目すべき点は2つ:

マッピングファイルはインターフェイスと同じパッケージでなければなりません。 IDEAを開発に使用している場合、インターフェイスはjavaファイル、マッピングファイルはresourceフォルダ、その他のパッケージ名は同じでなければなりません。マッピングファイルの名前はインターフェースの名前にxmlの接尾辞をつけたものにしてください。

mybatis-configを書く.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration 
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
 "http://.org/dtd/mybatis-3-.dtd"> 
 <configuration>
	<!-- マイバティス環境を設定する> 
	<environments default="mysql">
		<!-- mysql環境を設定する> 
		<environment id="mysql">
			<!-- トランザクションのタイプを設定する> 
			<transactionManager type="JDBC"></transactionManager>
			<!-- データベースに接続するための情報を設定する。> 
			<dataSource type="POOLED"> 
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/ee50"/>
				<property name="username" value="root"/>
				<property name="password" value="1234"/>
			</dataSource>
		</environment>
	</environments>
	<!-- MyBatisマッピング設定がどこにあるかを示す。> 
	<mappers> 
		<mapper resource="com/itheima/dao/IUserDao.xml"/>
	</mappers>
</configuration>

テストクラスを書く

public class MybatisTest {
	public static void main(String[] args)throws Exception {
		//1.設定ファイルを読む
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//2.SqlSessionFactoryビルダーオブジェクトを作成する。
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		//3.ビルダーを使ってファクトリーオブジェクトSqlSessionFactoryを作成する
		SqlSessionFactory factory = builder.build(in);
		//4.SqlSessionFactoryでSqlSessionオブジェクトを生成する
		SqlSession session = factory.openSession();
		//5.SqlSessionを使用してdaoインターフェースのプロキシを作成する
		IUserDao userDao = session.getMapper(IUserDao.class);
		//6.プロキシオブジェクトを使用して、すべてのメソッドに対してクエリを実行する
		List<User> users = userDao.findAll();
		for(User user : users) {
		System.out.println(user);
		}
		//7.リソースの解放
		session.close();
		in.close();
	} 
}

注釈ベースのMyBatisプロジェクト:

前のセクションの一部を修正します:

永続層インターフェースへのアノテーションの追加

public interface IUserDao {
	/**
	* すべてのユーザーに照会る
	* @return
	*/
	@Select("select * from user")
	List<User> findAll();
}

mybatis-config.xmlファイルを修正します:

タグの中で、recourceはclassに変更され、マッピングファイルへのパスは変更されません。

<!-- MyBatisマッピング設定がどこにあるかを示す。> 
<mappers> 
	<mapper class="com.itheima.dao.IUserDao"/>
</mappers>

注意事項

アノテーションを使用する場合、xmlファイルを設定する必要はありません。

3.3 MyBatisフレームワークの流れの分析

Read next

ランタイム(VI)。 superClassの本質

これをcpp.呼び出しに変換すると、最初の引数が構造体、構造体の最初のメンバがレシーバ、2番目のメンバが親クラスのオブジェクトになります。 つまり、[スーパークラス]はMJStudentを表示します。

Oct 18, 2020 · 7 min read