A. mybatis中欄位名與實體屬性名不一樣的情況下插入數據的方法,在xml配置文件里sql語句應該怎麼寫
查詢語句是 MyBatis 中最常用的元素之一,本文涉及mybatis的單表查詢操作,關聯表有關的查詢會後續補充。
巧婦難為無米之炊,要想從資料庫中表中取出數據並轉化為javaBean,所以,我們要先准備javabean以及與其對應的數據表。
javaBean:
public class President {
private int id;
private String name;
@Override
public String toString() {
return "President [id=" + id + ", name=" + name + "]";
}
//get set 方法.....
}
創建兩個對應的資料庫表,並插入兩條數據:
create table president1(
p_id int not null auto_increment primary key,
p_name varchar(50) not null
);
insert into president1(p_name) values('lily'),('Tom');
create table president2(
id int not null auto_increment primary key,
name varchar(50) not null
);
insert into president2(name) values('lily'),('Tom');
創建兩個資料庫是為了測試兩個不同的查詢狀況,
資料庫欄位名與實體類屬性名相同
從sql表可以看出president2的欄位名與javabean:President的屬性名完全相同,這種情況下mybatis的select操作非常簡單:
<!-- 從表 president2中查詢-->
<select id="getPreByIdPresident2" parameterType="int" resultType="President">
select * from president2 where id=#{id}
</select>
此時mybatis運用反射機制會將查詢返回的結果(id,name)封裝成President對象。
如果從表president1中查詢,同樣採用上面的sql語句
<!-- 從表 president1中查詢-->
<select id="getPreByIdPresident1" parameterType="int" resultType="President">
<span style="white-space:pre"> </span>President p1 = session.selectOne(statement+"getPreByIdPresident1", 1);
<span style="white-space:pre"> </span>System.out.println("表president1中查詢"+p1);
</select>
此時如果用getPreByIdPresident1進行查詢,返回的結果會是null,我們將上面的sql語句在mysql中執行下:
有結果返回,但是返回的欄位名為(p_id,p_name)這種結果mybatis在解析時無法與President類對應。多數情況下實體類屬性名與資料庫表的欄位名都會有差異,這種情況如果mybatis不能處理也就太low了。
資料庫欄位名與實體類屬性名不相同
mybatis針對該種情況有兩種解決方法,但是歸根到底都是同一種實現。
Method1:定義一個ResultMap將資料庫欄位名與實體類屬性名做個映射
我們欲從表president1中查詢數據,此時的mapper配置如下:
<resultMap type="President" id="getFromPresident2">
<!-- 主鍵必須用id標簽映射,其他的用非集合用result映射 集合類用collection映射 -->
<!-- column為資料庫欄位名,property為實體類屬性名 -->
<id column="p_id" property="id" />
<result column="p_name" property="name" />
</resultMap>
<select id="getPreByIdPresident1Method1" resultMap="getFromPresident2">
select * from president1 where p_id=#{id}
</select>
首先定義了一個resultMap,將資料庫表的欄位名與實體類屬性名做了一一對應,其中type為實體類(此處運用的類別名),id為了在select標簽中引用映射結果。
在select標簽中並沒有用resultType屬性,而使用了resultMap,即為上面定義的resultMap,mybatis會根據resultMap中的映射關系去構造President
Method1:直接在sql語句中使用別名
<!-- 從表 president1中查詢 -->
<select id="getPreByIdPresident1Method2" resultType="President">
select p_id id,p_name name from president1 where p_id=#{id}
</select>
這種方法會查到實際的數據,這種方法與欄位名和屬性名相同都是基於相同的原理:MyBatis 會在幕後自動創建一個 ResultMap,基於屬性名來映射列到JavaBean 的屬性上。即mybatis底層都是通過創建ResultMap來進行關系的映射,與method1原理相同。。
B. spring整合mybatis怎樣配置註解
mybatis和spring的整合步驟:
1)使用mybatis,必須有個全局配置文件configuration.xml,來配置mybatis的緩存,延遲載入等等一系列屬性,該配置文件示例如下:
Java代碼
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<settings>
<!-- 全局映射器啟用緩存 -->
<setting name="cacheEnabled" value="true" />
<!-- 查詢時,關閉關聯對象即時載入以提高性能 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 設置關聯對象載入的形態,此處為按需載入欄位(載入欄位由SQL指 定),不會載入關聯表的所有欄位,以提高性能 -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 對於未知的SQL查詢,允許返回不同的結果集以達到通用的效果 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 允許使用列標簽代替列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數據表的PK生成策略將被覆蓋 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 給予被嵌套的resultMap以欄位-屬性的映射支持 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 對於批量更新操作緩存SQL以提高性能 -->
<setting name="defaultExecutorType" value="BATCH" />
<!-- 資料庫超過25000秒仍未響應則超時 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
<!-- 全局別名設置,在映射文件中只需寫別名,而不必寫出整個類路徑 -->
<typeAliases>
<typeAlias alias="TestBean"
type="com.wotao.taotao.persist.test.dataobject.TestBean" />
</typeAliases>
<!-- 非註解的sql映射文件配置,如果使用mybatis註解,該mapper無需配置,但是如果mybatis註解中包含@resultMap註解,則mapper必須配置,給resultMap註解使用 -->
<mappers>
<mapper resource="persist/test/orm/test.xml" />
</mappers>
</configuration>
2)該文件放在資源文件的任意classpath目錄下,假設這里就直接放在資源根目錄,等會spring需要引用該文件。
查看ibatis-3-config.dtd發現除了settings和typeAliases還有其他眾多元素,比如properties,objectFactory,environments等等,這些元素基本上都包含著一些環境配置,數據源定義,資料庫事務等等,在單獨使用mybatis的時候非常重要,比如通過以構造參數的形式去實例化一個sqlsessionFactory,就像這樣:
Java代碼
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, properties);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, properties);
而typeHandlers則用來自定義映射規則,如可以自定義將Character映射為varchar,plugins元素則放了一些攔截器介面。
2)在spring配置文件中指定c3p0數據源定義如下:
Java代碼
<!-- c3p0 connection pool configuration -->
<bean id="testDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- 資料庫驅動 -->
<property name="driverClass" value="${db.driver.class}" />
<!-- 連接URL串 -->
<property name="jdbcUrl" value="${db.url}" />
<!-- 連接用戶名 -->
<property name="user" value="${db.username}" />
<!-- 連接密碼 -->
<property name="password" value="${db.password}" />
<!-- 初始化連接池時連接數量為5個 -->
<property name="initialPoolSize" value="5" />
<!-- 允許最小連接數量為5個 -->
<property name="minPoolSize" value="5" />
<!-- 允許最大連接數量為20個 -->
<property name="maxPoolSize" value="20" />
<!-- 允許連接池最大生成100個PreparedStatement對象 -->
<property name="maxStatements" value="100" />
<!-- 連接有效時間,連接超過3600秒未使用,則該連接丟棄 -->
<property name="maxIdleTime" value="3600" />
<!-- 連接用完時,一次產生的新連接步進值為2 -->
<property name="acquireIncrement" value="2" />
<!-- 獲取連接失敗後再嘗試10次,再失敗則返回DAOException異常 -->
<property name="acquireRetryAttempts" value="10" />
<!-- 獲取下一次連接時最短間隔600毫秒,有助於提高性能 -->
<property name="acquireRetryDelay" value="600" />
<!-- 檢查連接的有效性,此處小弟不是很懂什麼意思 -->
<property name="testConnectionOnCheckin" value="true" />
<!-- 每個1200秒檢查連接對象狀態 -->
<property name="idleConnectionTestPeriod" value="1200" />
<!-- 獲取新連接的超時時間為10000毫秒 -->
<property name="checkoutTimeout" value="10000" />
</bean>
配置中的${}都是佔位符,在指定資料庫驅動打war時會自動替換,替換的值在父pom中配置。
3)需要一個sessionFactory來生成session,sessionFactory配置如下:
Java代碼
<bean id="testSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:configuration.xml" />
<property name="dataSource" ref="testDataSource" />
</bean>
4)配置一個映射器介面來對應sqlSessionTemplate,該映射器介面定義了介面方法:
Java代碼
<!-- data OR mapping interface -->
<bean id="testMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="testSqlSessionFactory" />
<property name="mapperInterface" value="com.wotao.taotao.persist.test.mapper.TestMapper" />
</bean>
5)至此,一個完整的myabtis整合spring的配置文件看起來應該如下所示:
Java代碼
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!-- c3p0 connection pool configuration -->
<bean id="testDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${db.driver.class}" />
<property name="jdbcUrl" value="${db.url}" />
<property name="user" value="${db.username}" />
<property name="password" value="${db.password}" />
<property name="initialPoolSize" value="5" />
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="20" />
<property name="maxStatements" value="100" />
<property name="maxIdleTime" value="3600" />
<property name="acquireIncrement" value="2" />
<property name="acquireRetryAttempts" value="10" />
<property name="acquireRetryDelay" value="600" />
<property name="testConnectionOnCheckin" value="true" />
<property name="idleConnectionTestPeriod" value="1200" />
<property name="checkoutTimeout" value="10000" />
</bean>
<bean id="testSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:configuration.xml" />
<property name="dataSource" ref="testDataSource" />
</bean>
<!-- data OR mapping interface -->
<bean id="testMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="testSqlSessionFactory" />
<property name="mapperInterface" value="com.wotao.taotao.persist.test.mapper.TestMapper" />
</bean>
<!-- add your own Mapper here -->
<!-- comment here, using annotation -->
<!-- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> -->
<!-- <constructor-arg index="0" ref="sqlSessionFactory" /> -->
<!-- </bean> -->
<!-- base DAO class, for mole business, extend this class in DAO -->
<!-- <bean id="testBaseDAO" class="com.test..TestBaseDAO"> -->
<!-- <property name="sqlSessionTemplate" ref="sqlSessionTemplate" /> -->
<!-- </bean> -->
<!-- <bean id="testDAO" class="com.test..impl.TestDAOImpl" /> -->
<!-- you can DI Bean if you don't like use annotation -->
</beans>
C. mybatis中寫sql語句用註解好還是xml文檔
您好,在spring中配置
<!-- 通過掃描的模式,掃描目錄在com.mrorder.目錄下,所有的mapper都繼承SqlMapper介面的介面 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mrorder."/>
<property name="markerInterface" value="com.mrorder..SqlMapper"/>
</bean>
自己寫層方法的介面
public interface OrderMapper extends SqlMapper{
@Select("select * from tbl_order where room like #{room} and mydate like #{mydate}")
public List<Order> getbyroom(OrderPara op);
}
這樣整個語句是寫死的,必須有2個參數,在這種模式下,如何能實現根據room和mydate是否為空來動態的拼寫sql語句
比如當mydate=""
Select("select * from tbl_order where room like #{room} ")
public List<Order> getbyroom(OrderPara op);
如果用xml來配置語句的話,可以用<when test="title != null">
and mydate= #{mydate}
</when>
如果是用@Select 這種 改如何做呢?
利用自定義註解,通過反射,拼出SQL語句。
D. 使用mybatis 執行sql刪除數據的存儲過程xml里應該怎麼寫
Java mysql mybatis批量更新資料庫,採用以下寫法即可執行,但是資料庫連接必須配置:&allowMultiQueries=true
例如:jdbc:mysql://192.168.1.236:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
<update id="batchUpdate" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update test
<set>
test=${item.test}+1
</set>
where id = ${item.id}
</foreach>
</update>
MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始映射,將介面和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成資料庫中的記錄.
E. Mybatis 教程之Mybatis註解開發
mybatis最初配置信息是基於 XML ,映射語句(SQL)也是定義在 XML 中的。而到了 MyBatis 3提供了新的基於註解的配置。
這里講述 註解開發方式:
首先我們需要獲取 SqlSession :
參數設置為 true 表示開啟自動提交模式。
session 在註解形式的使用方式如:
所以mybatis 的使用使用三部分:
這里主要講解 Mapper 層的開發規則。
sql 類型主要分成 : select @Select(${sql}) , update @Update(${sql}) , insert @Insert($sql) , delete (${sql}) .
@Results 用來設置table信息與bean相關欄位的映射關系, 每一個欄位的關系使用 @Result 控制。
默認情況下對於每一table欄位,例如 name , 會調用 bean 中的 setName(..) . 如果找不到,對於新版本的 mybatis 會報錯。
例如上面的 cluster_name 會調用 setCluster_name() . 但是java 中使用的 clusterName ,可以通過 Result 註解控制.
@ResultMap 可以通過Id,應用其他的 Results
還有一種更改映射的方式:
mapUnderscoreToCamelCase 設置為true, 之後會自動實現 mysql 中的unix命名方式轉為java的駝峰表示法。
@MapKey 此註解應用將查詢數據轉為 Map<>, 注意的是MapKey()中的id最終調用bean的getId 獲取數據,所以需要映射bean欄位而不是table.
@Param註解用於給方法參數起一個名字。以下是筆者總結的使用原則:
在方法只接受一個參數的情況下,可以不使用@Param。
在方法接受多個參數的情況下,建議一定要使用@Param註解給參數命名。
insert 時獲取自增主鍵的方式:
法一:
法二:
#{} 的作用主要是替換預編譯語句(PrepareStatement)中的佔位符 ? :
對於 : INSERT INTO user (name) VALUES (#{name}); ==> INSERT INTO user (name) VALUES (?);
${} 符號的作用是直接進行字元串替換:
對於 : INSERT INTO user (name) VALUES ('${name}'); ==> INSERT INTO user (name) VALUES ('tiansho');
F. mybatis生成的sql怎麼使用
因為配置文件提供了 mybatis-generator所需要的參數信息:
* 其中classPathEntry 是引用的jdbc的類路徑,這里將jdbc jar和generator的jar包放在一起了;
* commentGenerator 是用來除去時間信息的,這在配合類似subversion的代碼管理工具時使用很有效,因為可以減少沒有必要的注釋遷入;
* jdbcConnection是指定的jdbc的連接信息;
* javaTypeResolver式類型轉換的信息,這里並沒有用到;
* javaModelGenerator是模型的生成信息,這里將指定這些Java model類的生成路徑;
* sqlMapGenerator是mybatis 的sqlMapper XML文件的生成信息,包括生成路徑等;
* javaClientGenerator是應用介面的生成信息;
* table是用戶指定的被生成相關信息的表,它必須在指定的jdbc連接中已經被建立。
G. 如何MyBatis中使用動態SQL查詢與注釋
首先,樓主需了解何為動態sql,何為靜態sql,這是他們的區別:
靜態 SQL:靜態 SQL 語句一般用於嵌入式 SQL 應用中,在程序運行前,SQL 語句必須是確定的,例如 SQL 語句中涉及的列名和表名必須是存在的。靜態 SQL 語句的編譯是在應用程序運行前進行的,編譯的結果會存儲在資料庫內部。而後程序運行時,資料庫將直接執行編譯好的 SQL 語句,降低運行時的開銷。靜態SQL在編譯時已經確定了引用的表和列。 宿主變數不改變表和列信息。 可以使用主變數改變查詢參數值, 但是不能用主變數代替表名或列名。
動態 SQL:動態 SQL 語句是在應用程序運行時被編譯和執行的,不在編譯時確定 SQL 的表和列,而是讓程序在運行時提供,並將SQL 語句文本傳給 DBMS 執行。 靜態 SQL 語句在編譯時已經生成執行計劃。 而動態 SQL 語句,只有在執行時才產生執行計劃。動態 SQL 語句首先執行 PREPARE 語句要求 DBMS 分析、確認和優化語句,並為其生成執行計劃。例如,使用 DB2 的互動式工具 CLP 訪問資料庫時,用戶輸入的 SQL 語句是不確定的,因此 SQL 語句只能被動態地編譯。動態 SQL 的應用較多,常見的 CLI 和 JDBC 應用程序都使用動態 SQL。
下面是一個典型的在MyBatis中使用動態SQL:
<update id="update" parameterType="org.format.dynamicproxy.mybatis.bean.User"> UPDATE users <trim prefix="SET" prefixOverrides=","> <if test="name != null and name != ''"> name = #{name} </if> <if test="age != null and age != ''"> , age = #{age} </if> <if test="birthday != null and birthday != ''"> , birthday = #{birthday} </if> </trim> where id = ${id}</update>
H. mybatis中xml映射和方法註解兩種配置sql語句的方式是否可以同時存在
不能進行同時設置。執行會找不到介面的mapper代理工廠。mybatis會先解析xml文件,將解析後的sql封裝在mapperstament中並放進Configuration的mappedStatements中,將命名空間和方法名(也就是id)作為key,mappedStatements是個自定義map。然後生成介面的代理工程,生產代理工廠後會解析註解,解析完註解,也會生成mapperstament,也會往統一的Configuration大對象裡面放,但是放的時候自定義map會先判斷是否存在,此時已經存在了,存在就會拋出IllegalArgumentException(name + " already contains value for " + key)。但是創建代理工廠的時候把異常吃掉了,所以載入的時候不會報錯,但是不會給介面生成代理工廠。沒有代理工廠,介面就沒有實現類去操作。
I. 用mybatis開發sql怎麼寫
用Spring框架,在applicationContext.xml文件里配置以下內容:
<!-- 讀取db.properties文件的內容 -->
<util:properties id = "jdbc" location = "classpath:db.properties"/>
<!-- 配置DataSource -->
<bean id = "ds" class = "org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value = "#{jdbc.driver}"/>
<property name="url" value = "#{jdbc.url}"/>
<property name="username" value = "#{jdbc.user}"/>
<property name="password" value = "#{jdbc.pwd}"/>
</bean>
<!-- 配置SqlSessionFactoryBean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入DataSource -->
<property name="dataSource" ref="ds"/>
<!-- 注入映射文件的位置信息 -->
<property name="mapperLocations" value="classpath:com/tarena/oss/entity/*.xml"/>
</bean>
<!--
配置MapperSourceConfigurer:
掃描制定包下面所有的類,
創建符合Mapp介面要求的對象,
並且會將創建好的對象放到spring容器裡面
-->
<bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入要掃描的包名 -->
<property name="basePackage" value = "com.tarena.oss."/>
</bean>
其中,要導入的包有:
mybatis-3.2.5.jar
mybatis-spring-1.2.2.jar
寫好實體類之後,在創建一個mapper.xml文件。
註:實體類的屬性名一定要和表的欄位名一致。在mapper.xml映射文件里寫sql語句。格式為:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="的路徑名">
<!--
查詢。
parameterType:如果返回值是一個整數,標准用法是java.lang.Integer,
可以簡寫為"int"。
-->
<select id = "和裡面的方法名一致" parameterType="參數類型"
resultType="com.tarena.oss.entity.Admin">
查詢的sql語句
</select>
<!--
使用resultMap來解決實體類的屬性名,與表的欄位名不一致的情況。
type屬性: 實體類的名字。
property屬性: 實體類的屬性名。
column屬性: 表的欄位名。
注:如果屬性名與欄位名一樣,就不用寫了。
-->
</mapper>
其他語句在<mapper></mapper>里寫,方法和select一樣。
希望可以幫到你!
J. 如何解析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