『壹』 MyBatis sql映射文件疑問
其實沒有什麼區別,只不過是取值的方式不一樣罷了,
<resultMap id="wpResult" class="wp">
</resultMap>
配了一次就可以反復用,
Alias 需要在查詢語句里一個一個的as,你不覺得麻煩也可以用。
Alias最大的作用是聯表查詢的時候返回多個相同ID的時候可以改下名。不致於沖突報錯
『貳』 如何解析Mybatis xml文件中配置的sql
首先抽象一個SQL語句類:
[java] view plain
public abstract class AbstractSQLStatementNode implements ISQLStatement {
protected List<ISQLStatement> sqlStatements = new ArrayList<>();
@Override
public void appendSQL(ISQLStatement sql) {
sqlStatements.add(sql);
}
@Override
public String getSQL(Object object) {
StringBuilder sb = new StringBuilder();
for (ISQLStatement stmt : sqlStatements) {
sb.append(stmt.getSQL(object));
}
return sb.toString().trim();
}
}
然後是文本SQL:
[java] view plain
public class PlainSQLNode extends AbstractSQLStatementNode {
private final String sql;
public PlainSQLNode(String sql) {
this.sql = sql;
}
@Override
public String getSQL(Object object) {
return sql;
}
@Override
public String toString() {
return sql;
}
}
以Mybatis xml中<if test="...">...</if>為例
[java] view plain
public class IfSQLNode extends AbstractSQLStatementNode {
private final String test;
public IfSQLNode(String test) {
this.test = test;
}
public String getTest() {
return test;
}
@Override
public String getSQL(Object object) {
try {
Boolean b = (Boolean) Ognl.getValue(test, object, Boolean.TYPE);
return b ? super.getSQL(object) : "";
}
catch (OgnlException e) {
throw new SQLSyntaxException(e);
}
}
}
再增加一個Include標簽例
[java] view plain
public class IncludeSQLNode extends AbstractSQLStatementNode {
private final TableNode node;
private final String refid;
public IncludeSQLNode(TableNode node, String refid) {
this.node = node;
this.refid = refid;
}
@Override
public String getSQL(Object object) {
SQLNode sqlnode = node.getSQLNode(refid);
return sqlnode.getSQL(object);
}
}
其它的xml標簽類似,完成最終的sql
調用AbstractSQLStatementNode.getSQL方法,參數為客戶端傳入參數
XML例子如下:
[html] view plain
<select id="findPage" parameterType="java.util.Map" resultMap="ORG">
SELECT * FROM XT_ORG WHERE BDELETE<>1 <if test="name != null"> AND NAME=#{name}</if> LIMIT #{OFFSET}, #{ROWS}
</select>
根據是否傳入了name,即可成功執行出最終的sql
SELECT * FROM XT_ORG WHERE BDELETE<>1 AND NAME=#{name} LIMIT #{OFFSET}, #{ROWS}
再解析SQL得到,並提出參數
SELECT * FROM XT_ORG WHERE BDELETE<>1 AND NAME=? LIMIT ?,?
即可生成最終的PrepareStatement
『叄』 mybatis sql映射文件和hibernate映射文件有什麼不同
1.1 Hibernate 簡介
Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/R Mapping實現了POJO 和資料庫表之間的映射,以及SQL 的自動生成和執行。程序員往往只需定義好了POJO 到資料庫表的映射關系,即可通過Hibernate 提供的方法完成持久層操作。程序員甚至不需要對SQL 的熟練掌握, Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的SQL 並調用JDBC介面加以執行。
1.2 MyBatis簡介
iBATIS 的著力點,則在於POJO 與SQL之間的映射關系。然後通過映射配置文件,將SQL所需的參數,以及返回的結果欄位映射到指定POJO。相對Hibernate「O/R」而言,iBATIS 是一種「Sql Mapping」的ORM實現。
第二章開發對比
開發速度
Hibernate的真正掌握要比Mybatis來得難些。Mybatis框架相對簡單很容易上手,但也相對簡陋些。個人覺得要用好Mybatis還是首先要先理解好Hibernate。
開發社區
Hibernate 與Mybatis都是流行的持久層開發框架,但Hibernate開發社區相對多熱鬧些,支持的工具也多,更新也快,當前最高版本4.1.8。而Mybatis相對平靜,工具較少,當前最高版本3.2。
開發工作量
Hibernate和MyBatis都有相應的代碼生成工具。可以生成簡單基本的DAO層方法。
針對高級查詢,Mybatis需要手動編寫SQL語句,以及ResultMap。而Hibernate有良好的映射機制,開發者無需關心SQL的生成與結果映射,可以更專注於業務流程。
『肆』 mybatis基本配置詳解
中間步驟自行設置
MySQL驅動版本根據自己安裝的MySQL選擇
我把AppTest改成了MybatisTest,不該也無妨;
其中Student類暫時只設置四個欄位:
mapper介面暫時為空
在resources目錄下新建File命名為db.peoperties,配置如下內容:
提示:以上配置適用於MySQL8.X版本,5.X版本按照如下配置:
1、transactionManager:事務管理器;
type 事務管理類型:
JDBC(JdbcTransactionFactory);
MANAGED(ManagedTransactionFactory)
自定義事務管理器:實現TransactionFactory介面.type指定為全類名
2、dataSource:數據源;
type :數據源類型;
UNPOOLED(UnpooledDataSourceFactory); POOLED(PooledDataSourceFactory);
JNDI(JndiDataSourceFactory)
自定義數據源:實現DataSourceFactory介面,type是全類名
<mapper>:注冊一個sql映射文件
1、注冊映射文件
resource:引用類路徑下的sql映射文件
mybatis/StudentMapperpper.xml
url:引用網路路徑或者磁碟路徑下的sql映射文件
file:///var/mappers/AuthorMapper.xml
2、注冊介面
class:引用(注冊)介面,
① 有sql映射文件,映射文件名必須和介面同名,並且放在與介面同一目錄下;
② 沒有sql映射文件,所有的sql都是利用註解寫在介面上;
推薦:
比較重要的,復雜的Dao介面我們來寫sql映射文件
不重要,簡單的Dao介面為了開發快速可以使用註解;
批量注冊
需要在資源路徑下(resources)建立和一樣的文件目錄來存放想xml映射文件,如:com.example.StudentMapperpper.xml
StudentMapper
在resources的mybatis目錄下新建文件夾mapper,新建xml文件StudentMapper.xml
namespace :名稱空間;指定為介面的全類名
id :唯一標識
resultType :返回值類型
#{id} :從傳遞過來的參數中取出id值
resources目錄(MajorMapper.xml暫時不用創建)如下: