MyBatisのフレームワーク
アウトライン
MyBatisのは、開発者のみがこのような複雑なプロセスとして文を作成し、接続を作成、読み込みドライブを処理するためにエネルギーを費やす必要がなく、SQL文自体を集中する必要があるので、内部JDBCをカプセル化する優れたJavaベースの永続化フレームワークであり、
顔の質問:エンティティクラスせて、マッピング関係テーブル、操作エンティティタイプテーブルへの操作と同等の生成:ORMは、オブジェクト関係マッピング- MyBatisの永続化フレームワークは、半ORM思想に基づいています
開発段階
- Mavenのリポジトリプロジェクトを作成し、依存関係を追加
- 書き込みエンティティクラス
- マッピング構成ファイル(同じ名前で同じパッケージを)書きます
- コア設定ファイルを書きます
- テストクラスを書きます
- 負荷プロファイル
- 作成sqlSessionFactory
- 作成SQLSESSION
- SQLSESSION呼び出し方法
リリースリソース
ラベルの設定コアの設定ファイル
すべてのラベル、タグおよびコンフィギュレーションの確立された順序に従って配置された
プロパティ?、設定?、typeAliases?、typeHandlers?、 ObjectFactoryの?、objectWrapperFactory?、reflectorFactory?、プラグイン?、環境?、databaseIdProvider?、マッパー?
1.プロパティタグ:外部の設定ファイルのリソースプロパティを読み込みます
二つの性質:
- リソース属性:、必要なプロファイルプロパティの場所を指定するために使用されるプロファイルは、クラスパスになければならない資源=「jdbcConfig.properties」
URL属性:ユニフォームリソースロケータ
http://localhost:8080/mystroe/CategoryServlet
2. typeAliasesタグ:カスタムエイリアス
二つの定義:- シングル別名定義
<typeAlias alias="user" type="com.itheima.domain.User"/>
バッチ別名定義、カテゴリの下にパッケージ全体をスキャンし、クラス名のエイリアス(最初の文字が大文字または小文字缶)
<package name="com.itheima.domain"/>
3.環境タグ:コンフィギュレーション・データベース環境とマルチ環境設定をサポートしています
<!--.数据源环境-->
<environments default="development">
<environment id="development">
<!--事物类型 jdbc -->
<transactionManager type="JDBC"></transactionManager>
<!--使用mybatis提供的连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<environments default="development">
デフォルトの環境名を指定して
<environments id="development">
、現在の環境の名前を指定する
<transactionManager type="JDBC">
トランザクション・タイプを指定することは、JDBCがある
<dataSource type="POOLED">
現在の接続プール・データ・ソースのタイプがある特定
<proprety name= value=>
の基本的なデータソースの設定パラメータ
物事マネージャ(トランザクションマネージャー)2を入力
- JDBCは、この構成では、JDBCを直接使用することは、コミットされ、ロールバックの設定は、それは物事の範囲を管理するために、データソースから取得された接続に依存しています
- マネージド:この設定は、ほとんど何もしませんでした。それはコミットしないか、接続をロールバックが、(そのような文脈JEEアプリケーションサーバなど)トランザクションのライフサイクル全体を管理するためのコンテナを聞かせてください。デフォルトでは、それは接続を閉じます、しかし、いくつかのコンテナを使用すると、そのデフォルトの動作が閉じられている防ぐために、プロパティをfalseにcloseConnectionする必要があるので、これを望んでいません。
データソース(データソース)は、3つのタイプ - unpooled:開口部とこれを達成するための接続を閉じますが、各データ・ソースが要求されます。
- POOLED:整理するJDBC接続オブジェクトの「プール」の概念を使用して達成します。
JNDI:そのようなEJBサーバーアプリケーションまたはそのような容器の使用を達成するために、コンテナは、JNDIコンテキスト基準に配置され、その後、集中型または構成の外部ソースのデータとすることができます。
4.マッパータグ:マッパー機能:ロードマップ
- 方法1:基準経路に対してリソースを使用
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
- 第二の方法:完全修飾リソースロケータ(URL)
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
- 三つの方法:クラスインターフェイスマッパーの完全修飾クラス名を使用して
<mapper class="org.mybatis.builder.AuthorMapper"/>
4つの方法:唯一の開発における全体レジスタマッパーマッパープロキシとしてパッケージ内のマッピング・インターフェース、パッケージを掃引に相当するパッケージすべての指定された実装クラス 常法
<package name="org.mybatis.builder"/>
MyBatisの対応するAPIの紹介SQLSESSION
1.sqlSession植物ビルダー(ビルダーモード)SqlSessionFactory build(InputSream inputStream)
入力ストリームファイルロードコアMyBatisの経由SqlSessionFactoryオブジェクトの構築
//String resource = "org/mybatis/builder/mybatis-congfig.xml";
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//构建者设计模式
SqlSessionFactory factory = builder.build(inputStream);
2.sqlSessionファクトリオブジェクト(ファクトリーモード)
工場の役割はSQLSESSIONセッションオブジェクトを構築することです。工場出荷時のパターンが分離することであり、
すべてのSqlSessionFactory SQLSESSIONインスタンスメソッドを作成する方法。一般的に使用される以下の2つです:
|メソッド|通訳|
|:------:|:------------ |
|のOpenSession |取引ではデフォルトで有効になっていますが、トランザクションは自動的ません|手動トランザクションを提出する必要があることを意味しており、提出され、更新データがデータベースに永続化されます
|のOpenSession(ブール値はautoCommit)| |引数は、自動的に(自動コミット)真、提出するかどうかであります
3.sqlSessionセッションオブジェクト(重要)
SQLSESSIONインスタンスがでMyBatisの中で最も強力なクラスです。ここでは、すべてのステートメントがコミットまたはロールバックの取引をし、マッパーインスタンスメソッドを取得実行され表示されます。
SQLSESSION SQLSESSION = sqlSessionFactory.openSession(TRUE)。
- SQL文の実行方法:
//查询
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
//增 删 改
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
- トランザクションを操作する方法:
void commit()
void rollback()
マッパープロキシモード
2つの方法でダオ層の実装の1.Mybatis:
1-传统开发方式: 手动对Dao层进行实现,在Dao层编写接口,接口实现类,实现方法
2-代理开发方式: 编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
2.mapperエージェントの開発要件(仕様):
マッパーインタフェースの開発規範に従う必要があります | 例 |
---|---|
1 - 同じ名前で同じパッケージのインタフェースとマッピングファイル | java.cn.ppvir.dao.UserMapper.javaとリソース/ CN / ppvir / DAO / UserMapper.xml |
2-永続マッピング構成名前空間属性値マッパータグは、インターフェース永続性層の完全修飾クラス名である必要があります | public interface Usermapper{} ---<mapper namespace='cn.ppvir.dao.UserMapper'> |
3-SQLステートメントのラベル設定の<select><insert><delete><update> id属性は、耐久性層インターフェースと同じ名前のメソッドでなければなりません |
User findById(Int id) ---<select id="findById"> |
パラメータおよびインターフェースの同じタイプを渡す4のParameterType | User findById(int id) ---<select parameterType="int"> |
5-resultTypeと同じタイプのインターフェースに結果の値を返します | User findById(int id) ---<select resultType="user"> |
3.コードを示す(マッパープロキシ開発を用いて)
#のあいまいクエリ$ {}と{}を区別する
#{}表示一个占位符
#{}可以实现prepareStatment向占位符中设置值,自动进行JDBC和java类型转换,防止sql注入
#{}可以接收简单类型值或pojo属性值,如果parameterType传输基本数据类型,值随便写
${}表示拼接sql串
${}是将传入的参数原样拼接在sql中,不进行jdbc类型转换
${}可以接收简单类型值或pojo属性值,如果parameterType传输基本数据类型,${}括号中只能是value
- ポンポン
- コアコンフィギュレーション・ファイル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">
<configuration>
<!--1.引入配置文件-->
<properties resource="jdbc.properties"/>
<!--2.别名typeAliases-->
<typeAliases>
<!--单个别名定义-->
<typeAlias type="it.ppvir.domain.User" alias="user"></typeAlias>
<!--批量别名定义-->
<package name="it.ppvir.domain"/>
</typeAliases>
<!--3.数据源环境-->
<environments default="develop">
<environment id="develop">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--4.加载映射文件-->
<mappers>
<!--方式一: 使用相对于类路径的资源引用-->
<mapper resource="it/ppvir/dao/UserMapper.xml"/>
<!--方式四:将包内的映射器接口实现全部注册为映射器-->
<!--<package name="it.ppvir.dao"/>-->
</mappers>
</configuration>
- エンティティクラスはのtoStringを設定します
public class User {
private int id;
private String username;
private String password;
- マッピング設定ファイルUserMapper.xmlリソース/それ/ ppvir / DAO / Usermapper.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="it.ppvir.dao.UserMapper">
<!--查询所有 List<User> findAll();-->
<select id="findAll" resultType="user">
select * from users;
</select>
<!--通过id 查询用户User findUserById(int id);-->
<select id="findUserById" parameterType="int" resultType="user">
select * from users where id=#{id}
</select>
<!--添加user void addUser(User user);-->
<insert id="addUser" parameterType="user">
<!--keyProperty:将添加成功后的id值查询出来封装到那个实体属性上
resultType:主键类型
order:SELECT LAST_INSERT_ID()执行时机是在insert后面-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
insert into users VALUES (#{id},#{username},#{password})
</insert>
<!--删除用户 void delUserById(int id);-->
<delete id="delUserById" parameterType="int">
DELETE FROM users where id=#{id}
</delete>
<!--修改用户信息 void modUserById(int id);-->
<update id="modUserById" parameterType="user">
UPDATE users SET username=#{username} where id=#{id}
</update>
<!--模糊查询 List<User> findUserByLikeUsername(String username);-->
<select id="findUserByLikeUsername" resultType="user" parameterType="String">
select * from users where username like '${value}'
</select>
</mapper>
- 同じ名前とメソッド名マッピングIDとのインタフェースパッケージインタフェースと同一の値と値のresultTypeと同じパラメータと同一のParameterTypeを返します
public interface UserMapper {
//插入数据 addUser
void addUser(User user);
//查询所有用户 findAll
List<User> findAll() throws IOException;
//查询用户通过id findUserById
User findUserById(int id);
//通过Id删除用户 delUserById
void delUserById(int id);
//通过id修改用户信息 modUserById
void modUserById(User user);
//模糊查询
List<User> findUserByLikeUsername(String username);
}
- テストカテゴリ
public class UserMapperTest {
/**
* 接口实现类测试 传统方法
* @throws IOException
*/
@Test
public void test01() throws IOException {
UserMapper userMapper = new UserMapperImpl();
List<User> users = userMapper.findAll();
System.out.println(users);
}
/**
* mapper代理方式 实现findAll方法
*/
@Test
public void test02() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = factory.openSession();
//使用mapper代理方式
UserMapper mapper = sqlSession.getMapper(UserMapper.class);//通过接口获取mapper代理对象
List<User> users = mapper.findAll();//使用代理对象调用接口的方法
System.out.println(users);
}
@Test
/**
* mapper代理方式 实现 User findUserById(int id)
*/
public void test03() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//mapper代理
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(19);
System.out.println(user);
}
@Test
/**
* mapper代理方式 添加用户void addUser(User user); 并且获取到添加后user 的id
*/
public void test04() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//封装实体类
User user = new User();
user.setUsername("euuruqwo");
user.setPassword("123123");
System.out.println("添加前"+user);
//mapper代理
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(user);
sqlSession.commit();
System.out.println("添加后"+user);
}
@Test
/**
* mapper代理方式 删除用户
*/
public void test05() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//mapper代理
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.delUserById(25);
}
@Test
/**
* mapper代理方式 修改用户
*/
public void test06() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//封装实体类
User user = new User();
user.setId(2);
user.setUsername("2222222");
//mapper代理
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.modUserById(user);
}
//模糊查询测试
@Test
public void queryLike() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = build.openSession();
//mapper代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.findUserByLikeUsername("%张%");
for (User user : users) {
System.out.println(user);
}
}
}