當前位置:首頁 » 編程語言 » mybatisxml中的sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

mybatisxml中的sql

發布時間: 2023-07-26 19:40:56

㈠ mybatis里的xml中的寫添加的sql語句,怎麼使用oracle資料庫的序列

--OracleSEQUENCE序列語法:
CREATESEQUENCE序列名
[INCREMENTBYn]
[STARTWITHn]
[{MAXVALUE/MINVALUEn|NOMAXVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHEn|NOCACHE}];
示例:
CREATESEQUENCEsq_test--序列名
INCREMENTBY1--每次加幾個
STARTWITH1--從1開始計數
MAXVALUE9999999--最大值9999999叢擾老
NOCYCLE--一直累加,不循環
NOCACHE;

SELECT李信sq_test.NEXTVALFROMDUAL;

可以使用sequence的地方:

--不滲升包含子查詢、snapshot、VIEW的SELECT語句
--INSERT語句的子查詢中
--NSERT語句的VALUES中
--UPDATE的SET中

可以看如下例子:

INSERTINTOtable_nameVALUES(sq_test.nextval,'CLERK',1200,SYSDATE);

㈡ 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原理相同。。

㈢ mybatis怎麼列印mapper.xml中執行的sql

你的這個多個sql語句是什麼意思??是指一個<select>....</select>中的多個嗎?這樣的話直接調用這個方法就可以,要是你指的是<select></select>和<insert></insert>貌似mybatis不能這樣使用,因為他一般是一個方法對應一個sql語句,你想是想一個方法調用兩個sql語句,要麼就是在一個方法里調用那兩個方法,這樣間接實現一個方法調用兩個sql語句(本質上還是一個方法一個語句),另一種解決方法是使用數據中的存儲過程或是觸發器,在存儲過程或是觸發器中寫另一條sql語句,由你選擇

㈣ mybatis怎麼列印mapper.xml中執行的sql

mybatis配置可以在任何時候列印SQL ,應該把所有的配置都改為DEBUG模式。

#
log4j.rootCategory=DEBUG,stdout,logfile
log4j.logger.java.sql.PreparedStatement=debug,stdout
log4j.logger.java.sql.ResultSet=debug

#stdoutconfigure
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d%p[%c]-<%m>%n

#logfileconfigure
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=../logs/jb.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d%p[%c]-<%m>%n

#
#
log4j.logger.org.springframework=debug
#
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug




㈤ mybatis xml怎麼列印sql

想要列印工程項目中所有sql並判斷是否帶有where條件就比較明晰了,直接上代碼:
@Resource
private SqlSessionFactory sqlSessionFactory;
@Test
public void test_check() {
Configuration configuration = sqlSessionFactory.getConfiguration();
System.out.println("#sql.size#" + configuration.getMappedStatements().size());
Set<String> errors = Sets.newHashSet();
int i = 1;
for (Object obj : configuration.getMappedStatements()) {
if (obj instanceof MappedStatement) {
MappedStatement mappedStatement = (MappedStatement) obj;
String sql = mappedStatement.getSqlSource().getBoundSql(new SqlParamMap()).getSql();
sql = sql.replaceAll("\n", "");
sql = sql.replaceAll("\\s+", " ");
System.out.println(String.format("#sql,#%02d #%s #%s", i++, mappedStatement.getSqlCommandType(), sql));
if (!sql.toLowerCase().startsWith("insert") && !sql.toLowerCase().startsWith("select")
&& !sql.toLowerCase().startsWith("replace")) {
if (!sql.toLowerCase().contains("where")) {
errors.add(sql);
}
}
}
}
System.err.println("#error#" + errors.size());
for (String errorSql : errors) {
System.err.println(errorSql);
}
}

// 這里為了方便生成sql時,解析入參對象的
public static class SqlParamMap extends AbstractMap<String, Object> implements Map<String, Object> {
@Override
public Set<Entry<String, Object>> entrySet() {
return Collections.emptySet();
}
@Override
public Object get(Object key) {
return new Object[] {1, 2};
}
}

㈥ mybatis中xml映射和方法註解兩種配置sql語句的方式是否可以同時存在

不能進行同時設置。執行會找不到介面的mapper代理工廠。mybatis會先解析xml文件,將解析後的sql封裝在mapperstament中並放進Configuration的mappedStatements中,將命名空間和方法名(也就是id)作為key,mappedStatements是個自定義map。然後生成介面的代理工程,生產代理工廠後會解析註解,解析完註解,也會生成mapperstament,也會往統一的Configuration大對象裡面放,但是放的時候自定義map會先判斷是否存在,此時已經存在了,存在就會拋出IllegalArgumentException(name + " already contains value for " + key)。但是創建代理工廠的時候把異常吃掉了,所以載入的時候不會報錯,但是不會給介面生成代理工廠。沒有代理工廠,介面就沒有實現類去操作。