JavaのMyBatisフレームワークにおけるMapperマッピング構成の使用と原理解析
14804 ワード
Mapperの組み込みメソッドmodelレイヤは、データベースのテーブルに対応するエンティティクラスです.Controllerレイヤはサーブレットであり,主にビジネスモジュールプロセスの制御を担当し,サービスインタフェースを呼び出す方法でありstruts 2でActionである.サービス層は主に論理判断を行い、Dao層はデータアクセス層であり、データベースとドッキングする.Mapperはmybtisフレームワークのマッピングで使用され、mapperマッピングファイルはdaoレイヤで使用されます.
次は、Mapperの組み込み方法について説明します.
1、countByExample===>条件によるクエリー数
相当:select count(*)from user where username='joe' 2、deleteByExample===>条件により複数削除
3、deleteByPrimaryKey==>条件に従って単一の項目を削除する
次のようになります.
4、insert===>データの挿入
次のようになります.
5、insertSelective===>データの挿入
6、selectByExample===>条件に基づいてデータを照会する
7、selectByPrimaryKey==>プライマリ・キーによるデータの問合せ
8、updateByExampleSelective==>条件によって値がnullでないフィールドを更新する
9、updateByExampleSelective==>条件による更新
10、updateByPrimaryKeySelective==>>条件で更新
次のようになります.
相当:update user set password='joe'where id=101
11、updateByPrimaryKey==>プライマリ・キーで更新
次のようになります.
次のようになります.
mapperのxmlプロファイルを解析mybatisがmapperのxmlプロファイルをどのように読み取り、sql文を解析するかを見てみましょう.
このようにsqlSessionFactoryを構成したことを覚えています.
ここでは、パッケージcom.xxx.mybaits.mapperの下にあるすべてのxmlフォーマットファイルをこの式に基づいて読み込むmapperLocationsプロパティが構成されています.では、具体的には、このプロパティに基づいてプロファイルを読み込むにはどうすればいいのでしょうか.
答えは、SqlSessionFactoryBeanクラスのbuildSqlSessionFactoryメソッドにあります.
mybatisはXML MapperBuilderクラスのインスタンスを使用してmapperプロファイルを解析します.
次に、xmlMapperBuilderのparseメソッドを呼び出してmapperを解析します.
mybatisがmapperのxmlファイルを解析する過程は明らかです.次に、mapperをどのように解析するかを見てみましょう.
configurationElement関数は、mapperノードの下のすべてのサブノードをほぼ解析し、mybaitsはmapperのすべてのノードを解析し、コンフィギュレーションオブジェクトに追加してsqlSessionFactoryオブジェクトにいつでも使用できます.ここでmybaitsがXM LStatementBuilderクラスのオブジェクトのparseStatementNode関数を使用する方法について補足します.MapperBuilderAssistantクラスオブジェクトbuilderAssistantのaddMappedStatementを使用してMappedStatementを解析し、コンフィギュレーションクラスオブジェクトに関連付けます.
以上のコードからmybaitsがXPathを使用してmapperのプロファイルを解析した後、resultMap、parameterMap、cache、statementなどのノードを使用して関連するbuilderを使用して作成し、得られたオブジェクトをconfigurationオブジェクトに関連付けることがわかりますが、このconfigurationオブジェクトはsqlSessionから取得することができます.これは、sqlSessionを使用してデータベースを操作するときにmybaitsがmapperを取得し、sql文を実行する方法について説明します.
次は、Mapperの組み込み方法について説明します.
1、countByExample===>条件によるクエリー数
int countByExample(UserExample example);
//
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("joe");
int count = userDAO.countByExample(example);
相当:select count(*)from user where username='joe' 2、deleteByExample===>条件により複数削除
int deleteByExample(AccountExample example);
//
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("joe");
userDAO.deleteByExample(example);
:delete from user where username='joe'
3、deleteByPrimaryKey==>条件に従って単一の項目を削除する
int deleteByPrimaryKey(Integer id);
userDAO.deleteByPrimaryKey(101);
次のようになります.
delete from user where id=101
4、insert===>データの挿入
int insert(Account record);
//
User user = new User();
//user.setId(101);
user.setUsername("test");
user.setPassword("123456")
user.setEmail("[email protected]");
userDAO.insert(user);
次のようになります.
insert into user(ID,username,password,email) values(101,'test','123456','[email protected]');
5、insertSelective===>データの挿入
int insertSelective(Account record);
6、selectByExample===>条件に基づいてデータを照会する
List selectByExample(AccountExample example);
//
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("joe");
criteria.andUsernameIsNull();
example.setOrderByClause("username asc,email desc");
List>list = userDAO.selectByExample(example);
:select * from user where username = 'joe' and username is null order by username asc,email desc
// : iBator UserExample.java static Criteria , Criteria , SQL where 。
7、selectByPrimaryKey==>プライマリ・キーによるデータの問合せ
Account selectByPrimaryKey(Integer id);// select * from user where id = id
8、updateByExampleSelective==>条件によって値がnullでないフィールドを更新する
int updateByExampleSelective(@Param("record") Account record, @Param("example") AccountExample example);
//
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("joe");
User user = new User();
user.setPassword("123");
userDAO.updateByPrimaryKeySelective(user,example);
:update user set password='123' where username='joe'
9、updateByExampleSelective==>条件による更新
int updateByExample(@Param("record") Account record, @Param("example") AccountExample example);
10、updateByPrimaryKeySelective==>>条件で更新
int updateByPrimaryKeySelective(Account record);
//
User user = new User();
user.setId(101);
user.setPassword("joe");
userDAO.updateByPrimaryKeySelective(user);
次のようになります.
update user set password='joe' where id=101
int updateByPrimaryKeySelective(Account record);
//
User user = new User();
user.setId(101);
user.setPassword("joe");
userDAO.updateByPrimaryKeySelective(user);
相当:update user set password='joe'where id=101
11、updateByPrimaryKey==>プライマリ・キーで更新
int updateByPrimaryKey(Account record);
//
User user =new User();
user.setId(101);
user.setUsername("joe");
user.setPassword("joe");
user.setEmail("[email protected]");
userDAO.updateByPrimaryKey(user);
次のようになります.
update user set username='joe',password='joe',email='[email protected]' where id=101
int updateByPrimaryKey(Account record);
//
User user =new User();
user.setId(101);
user.setUsername("joe");
user.setPassword("joe");
user.setEmail("[email protected]");
userDAO.updateByPrimaryKey(user);
次のようになります.
update user set username='joe',password='joe',email='[email protected]' where id=101
mapperのxmlプロファイルを解析mybatisがmapperのxmlプロファイルをどのように読み取り、sql文を解析するかを見てみましょう.
このようにsqlSessionFactoryを構成したことを覚えています.
ここでは、パッケージcom.xxx.mybaits.mapperの下にあるすべてのxmlフォーマットファイルをこの式に基づいて読み込むmapperLocationsプロパティが構成されています.では、具体的には、このプロパティに基づいてプロファイルを読み込むにはどうすればいいのでしょうか.
答えは、SqlSessionFactoryBeanクラスのbuildSqlSessionFactoryメソッドにあります.
if (!isEmpty(this.mapperLocations)) {
for (Resource mapperLocation : this.mapperLocations) {
if (mapperLocation == null) {
continue;
}
try {
XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(mapperLocation.getInputStream(),
configuration, mapperLocation.toString(), configuration.getSqlFragments());
xmlMapperBuilder.parse();
} catch (Exception e) {
throw new NestedIOException("Failed to parse mapping resource: '" + mapperLocation + "'", e);
} finally {
ErrorContext.instance().reset();
}
if (logger.isDebugEnabled()) {
logger.debug("Parsed mapper file: '" + mapperLocation + "'");
}
}
}
mybatisはXML MapperBuilderクラスのインスタンスを使用してmapperプロファイルを解析します.
public XMLMapperBuilder(Reader reader, Configuration configuration, String resource, Map sqlFragments) {
this(new XPathParser(reader, true, configuration.getVariables(), new XMLMapperEntityResolver()),
configuration, resource, sqlFragments);
}
private XMLMapperBuilder(XPathParser parser, Configuration configuration, String resource, Map sqlFragments) {
super(configuration);
this.builderAssistant = new MapperBuilderAssistant(configuration, resource);
this.parser = parser;
this.sqlFragments = sqlFragments;
this.resource = resource;
}
次に、xmlMapperBuilderのparseメソッドを呼び出してmapperを解析します.
public void parse() {
// configuration xml ( , mapper ,
// cache、sql、select、resultMap、parameterMap ),
// mapper , resource
if (!configuration.isResourceLoaded(resource)) {
configurationElement(parser.evalNode("/mapper"));
configuration.addLoadedResource(resource);
bindMapperForNamespace();
}
// configurationElement resultMap extends
parsePendingResultMaps();
// configurationElement cache-ref ( cache-ref cache )
parsePendingChacheRefs();
// , cache statement
parsePendingStatements();
}
mybatisがmapperのxmlファイルを解析する過程は明らかです.次に、mapperをどのように解析するかを見てみましょう.
private void configurationElement(XNode context) {
try {
// mapper namespace
String namespace = context.getStringAttribute("namespace");
if (namespace.equals("")) {
throw new BuilderException("Mapper's namespace cannot be empty");
}
// namespace
builderAssistant.setCurrentNamespace(namespace);
// mapper
cacheRefElement(context.evalNode("cache-ref"));
// mapper
cacheElement(context.evalNode("cache"));
// mapper
parameterMapElement(context.evalNodes("/mapper/parameterMap"));
// mapper
resultMapElements(context.evalNodes("/mapper/resultMap"));
// mapper
sqlElement(context.evalNodes("/mapper/sql"));
// XMLStatementBuilder mapper
configurationElement関数は、mapperノードの下のすべてのサブノードをほぼ解析し、mybaitsはmapperのすべてのノードを解析し、コンフィギュレーションオブジェクトに追加してsqlSessionFactoryオブジェクトにいつでも使用できます.ここでmybaitsがXM LStatementBuilderクラスのオブジェクトのparseStatementNode関数を使用する方法について補足します.MapperBuilderAssistantクラスオブジェクトbuilderAssistantのaddMappedStatementを使用してMappedStatementを解析し、コンフィギュレーションクラスオブジェクトに関連付けます.
public void parseStatementNode() {
//ID
String id = context.getStringAttribute("id");
//databaseId
String databaseId = context.getStringAttribute("databaseId");
if (!databaseIdMatchesCurrent(id, databaseId, this.requiredDatabaseId)) {
return;
}
//fetchSize
Integer fetchSize = context.getIntAttribute("fetchSize");
//timeout
Integer timeout = context.getIntAttribute("timeout");
//parameterMap
String parameterMap = context.getStringAttribute("parameterMap");
//parameterType
String parameterType = context.getStringAttribute("parameterType");
Class> parameterTypeClass = resolveClass(parameterType);
//resultMap
String resultMap = context.getStringAttribute("resultMap");
//resultType
String resultType = context.getStringAttribute("resultType");
//lang
String lang = context.getStringAttribute("lang");
LanguageDriver langDriver = getLanguageDriver(lang);
Class> resultTypeClass = resolveClass(resultType);
//resultSetType
String resultSetType = context.getStringAttribute("resultSetType");
StatementType statementType = StatementType.valueOf(context.getStringAttribute("statementType", StatementType.PREPARED.toString()));
ResultSetType resultSetTypeEnum = resolveResultSetType(resultSetType);
String nodeName = context.getNode().getNodeName();
SqlCommandType sqlCommandType = SqlCommandType.valueOf(nodeName.toUpperCase(Locale.ENGLISH));
//
以上のコードからmybaitsがXPathを使用してmapperのプロファイルを解析した後、resultMap、parameterMap、cache、statementなどのノードを使用して関連するbuilderを使用して作成し、得られたオブジェクトをconfigurationオブジェクトに関連付けることがわかりますが、このconfigurationオブジェクトはsqlSessionから取得することができます.これは、sqlSessionを使用してデータベースを操作するときにmybaitsがmapperを取得し、sql文を実行する方法について説明します.