mybatismysql存儲過程
⑴ mybatis怎麼配置mysql配置文件
1.基於SQL語法,簡單易學。
2.能了解底層組裝過程。
3.SQL語句封裝在配置文件中,便於統一管理與維護,降低了程序的耦合度。
4.程序調試方便。
所有sql語句,全部定義在xml(建議)中。也可以通過註解的方式在介面上實現。這些映射文件稱之為mapper。
⑵ mybatis存儲過程 不確定結果集如何配置XML,
MyBatis學習 之 一、MyBatis簡介與配置MyBatis+Spring+MySql
MyBatis學習 之 二、SQL語句映射文件(1)resultMap
MyBatis學習 之 二、SQL語句映射文件(2)增刪改查、參數、緩存
MyBatis學習 之 三、動態SQL語句
MyBatis學習 之 四、MyBatis配置文件
在定義sqlSessionFactory時需要指定MyBatis主配置文件:
Xml代碼 收藏代碼
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
MyBatis配置文件中大標簽configuration下子標簽包括:
configuration
|--- properties
|--- settings
|--- typeAliases
|--- typeHandlers
|--- objectFactory
|--- plugins
|--- environments
|--- |--- environment
|--- |--- |--- transactionManager
|--- |--- |__ dataSource
|__ mappers
4.1 properties屬性
properties和java的.properties的配置文件有關。配置properties的resource指定.properties的路徑,然後再在properties標簽下配置property的name和value,則可以替換.properties文件中相應屬性值。
Xml代碼 收藏代碼
<!-- 屬性替換 -->
<properties resource="mysql.properties">
<property name="jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/student_manager"/>
<property name="username" value="root"/>
<property name="password" value="limingnihao"/>
</properties>
4.2 settings設置
這是MyBatis 修改操作運行過程細節的重要的步驟。下方這個表格描述了這些設置項、含義和默認值。
設置項
描述
允許值
默認值
cacheEnabled
對在此配置文件下的所有cache 進行全局性開/關設置。
true | false
true
lazyLoadingEnabled
全局性設置懶載入。如果設為『false』,則所有相關聯的都會被初始化載入。
true | false
true
aggressiveLazyLoading
當設置為『true』的時候,懶載入的對象可能被任何懶屬性全部載入。否則,每個屬性都按需載入。
true | false
true
multipleResultSetsEnabled
允許和不允許單條語句返回多個數據集(取決於驅動需求)
true | false
true
useColumnLabel
使用列標簽代替列名稱。不同的驅動器有不同的作法。參考一下驅動器文檔,或者用這兩個不同的選項進行測試一下。
true | false
true
useGeneratedKeys
允許JDBC 生成主鍵。需要驅動器支持。如果設為了true,這個設置將強制使用被生成的主鍵,有一些驅動器不兼容不過仍然可以執行。
true | false
false
autoMappingBehavior
指定MyBatis 是否並且如何來自動映射數據表欄位與對象的屬性。PARTIAL將只自動映射簡單的,沒有嵌套的結果。FULL 將自動映射所有復雜的結果。
NONE,
PARTIAL,
FULL
PARTIAL
defaultExecutorType
配置和設定執行器,SIMPLE 執行器執行其它語句。REUSE 執行器可能重復使用prepared statements 語句,BATCH執行器可以重復執行語句和批量更新。
SIMPLE
REUSE
BATCH
SIMPLE
defaultStatementTimeout
設置一個時限,以決定讓驅動器等待資料庫回應的多長時間為超時
正整數
Not Set
(null)
例如:
Xml代碼 收藏代碼
<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="enhancementEnabled" value="false" />
<setting name="defaultExecutorType" value="SIMPLE" />
</settings>
4.3 typeAliases類型別名
類型別名是Java 類型的簡稱。
它僅僅只是關聯到XML 配置,簡寫冗長的JAVA 類名。例如:
Xml代碼 收藏代碼
<typeAliases>
<typeAlias alias="UserEntity" type="com.manager.data.model.UserEntity" />
<typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity" />
<typeAlias alias="ClassEntity" type="com.manager.data.model.ClassEntity" />
</typeAliases>
使用這個配置,「StudentEntity」就能在任何地方代替「com.manager.data.model.StudentEntity」被使用。
對於普通的Java類型,有許多內建的類型別名。它們都是大小寫不敏感的,由於重載的名字,要注意原生類型的特殊處理。
別名
映射的類型
_byte
byte
_long
long
_short
short
_int
int
_integer
int
_double
double
_float
float
_boolean
boolean
string
String
byte
Byte
long
Long
short
Short
int
Integer
integer
Integer
double
Double
float
Float
boolean
Boolean
date
Date
decimal
BigDecimal
bigdecimal
BigDecimal
object
Object
map
Map
hashmap
HashMap
list
List
arraylist
ArrayList
collection
Collection
iterator
Iterator
4.4 typeHandlers類型句柄
無論是MyBatis在預處理語句中設置一個參數,還是從結果集中取出一個值時,類型處理器被用來將獲取的值以合適的方式轉換成Java類型。下面這個表格描述了默認的類型處理器。
類型處理器
Java類型
JDBC類型
BooleanTypeHandler
Boolean,boolean
任何兼容的布爾值
ByteTypeHandler
Byte,byte
任何兼容的數字或位元組類型
ShortTypeHandler
Short,short
任何兼容的數字或短整型
IntegerTypeHandler
Integer,int
任何兼容的數字和整型
LongTypeHandler
Long,long
任何兼容的數字或長整型
FloatTypeHandler
Float,float
任何兼容的數字或單精度浮點型
DoubleTypeHandler
Double,double
任何兼容的數字或雙精度浮點型
BigDecimalTypeHandler
BigDecimal
任何兼容的數字或十進制小數類型
StringTypeHandler
String
CHAR和VARCHAR類型
ClobTypeHandler
String
CLOB和LONGVARCHAR類型
NStringTypeHandler
String
NVARCHAR和NCHAR類型
NClobTypeHandler
String
NCLOB類型
ByteArrayTypeHandler
byte[]
任何兼容的位元組流類型
BlobTypeHandler
byte[]
BLOB和LONGVARBINARY類型
DateTypeHandler
Date(java.util)
TIMESTAMP類型
DateOnlyTypeHandler
Date(java.util)
DATE類型
TimeOnlyTypeHandler
Date(java.util)
TIME類型
SqlTimestampTypeHandler
Timestamp(java.sql)
TIMESTAMP類型
SqlDateTypeHandler
Date(java.sql)
DATE類型
SqlTimeTypeHandler
Time(java.sql)
TIME類型
ObjectTypeHandler
Any
其他或未指定類型
EnumTypeHandler
Enumeration類型
VARCHAR-任何兼容的字元串類型,作為代碼存儲(而不是索引)。
你可以重寫類型處理器或創建你自己的類型處理器來處理不支持的或非標準的類型。要這樣做的話,簡單實現TypeHandler介面(org.mybatis.type),然後映射新的類型處理器類到Java類型,還有可選的一個JDBC類型。然後再typeHandlers中添加這個類型處理器。
新定義的類型處理器將會覆蓋已經存在的處理Java的String類型屬性和VARCHAR參數及結果的類型處理器。要注意MyBatis不會審視資料庫元信息來決定使用哪種類型,所以你必須在參數和結果映射中指定那是VARCHAR類型的欄位,來綁定到正確的類型處理器上。這是因為MyBatis直到語句被執行都不知道數據類型的這個現實導致的。
Java代碼 收藏代碼
public class LimingStringTypeHandler implements TypeHandler {
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
System.out.println("setParameter - parameter: " + ((String) parameter) + ", jdbcType: " + jdbcType.TYPE_CODE);
ps.setString(i, ((String) parameter));
}
@Override
public Object getResult(ResultSet rs, String columnName) throws SQLException {
System.out.println("getResult - columnName: " + columnName);
return rs.getString(columnName);
}
@Override
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
System.out.println("getResult - columnIndex: " + columnIndex);
return cs.getString(columnIndex);
}
}
在配置文件的typeHandlers中添加typeHandler標簽。
Xml代碼 收藏代碼
<typeHandlers>
<typeHandler javaType="String" jdbcType="VARCHAR" handler="liming.student.manager.type.LimingStringTypeHandler"/>
</typeHandlers>
⑶ 在mybatis中的動態sql在mysql資料庫和orecal資料庫的有什麼區別
首先是大體一致的,只是分頁查詢時oracle用的偽列(rownum),mysql用的是limit,具體的可以網路一下分頁;
另外oracle對sql語句要求更為嚴格,而且oracle里變數較mysql更多點,oracle中有number型,有大數據類型,mysql沒得;
另外舉個例子,oracle不能插入為空列,而mysql是可以的(個人覺得,不知道正確與否)。還有他們兩者函數有不同之處,如轉日期函數oracle是to_date('要轉的字元串','格式') -- select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from al,而mysql是str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09//都是針對字元串轉日期來的。
還有一點,我們常常希望主鍵可以自動增長,避免我們插入數據時的重復問題,但是oracle不能設置列自動增長,而mysql是可以的,oracle可以用序列加觸發器來解決自動增長問題達到與mysql一樣的效果。
總體來說百分之九十的sql語句是沒區別的。總體來說oracle的格式嚴格點,對有些字元型的還必須加單引號才能插入,mysql要求就沒這么多了。還有當向資料庫插入一個日期時,mysql可以直接插入成功,但是oracle需要先轉化為sql裡面的日期類型才行;oracle較mysql而言更安全,但是收費的,一般大公司用的多。oracle還有存儲過程和函數,觸發器這些這是mysql沒有的。大體就是這樣吧。
⑷ 求助大神 mybatis 使用Mysql 的存儲過程 怎麼返回多個結果集
如何通過MyBatis獲取mysql存儲過程返回的不確定個數的多個結果集
如果對select
返回的結果行都需要處理,使用游標。
如果只想取得返回多行中的一行,使用limit。
⑸ Java框架MyBatis工作流程是怎樣的
一、Mybatis介紹
MyBatis是一款一流的支持自定義SQL、存儲過程和高級映射的持久化框架。MyBatis幾乎消除了所有的JDBC代碼,也基本不需要手工去 設置參數和獲取檢索結果。MyBatis能夠使用簡單的XML格式或者註解進行來配置,能夠映射基本數據元素、Map介面和POJOs(普通java對 象)到資料庫中的記錄。
二、MyBatis工作流程
(1)載入配置並初始化
觸發條件:載入配置文件
配置來源於兩個地方,一處是配置文件,一處是Java代碼的註解,將SQL的配置信息載入成為一個個MappedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),存儲在內存中。
(2)接收調用請求
觸發條件:調用Mybatis提供的API
傳入參數:為SQL的ID和傳入參數對象
處理過程:將請求傳遞給下層的請求處理層進行處理。
(3)處理操作請求 觸發條件:API介面層傳遞請求過來
傳入參數:為SQL的ID和傳入參數對象
處理過程:
(A)根據SQL的ID查找對應的MappedStatement對象。
(B)根據傳入參數對象解析MappedStatement對象,得到最終要執行的SQL和執行傳入參數。
(C)獲取資料庫連接,根據得到的最終SQL語句和執行傳入參數到資料庫執行,並得到執行結果。
(D)根據MappedStatement對象中的結果映射配置對得到的執行結果進行轉換處理,並得到最終的處理結果。
(E)釋放連接資源。
(4)返回處理結果將最終的處理結果返回。
orm工具的基本思想
無論是用過的hibernate,mybatis,你都可以法相他們有一個共同點:
從配置文件(通常是XML配置文件中)得到 sessionfactory.
由sessionfactory 產生 session
在session 中完成對數據的增刪改查和事務提交等.
在用完之後關閉session 。
在java 對象和 資料庫之間有做mapping 的配置文件,也通常是xml 文件。
功能架構
⑹ mybatis在mysql調用存儲過程時為什麼會出現以下錯誤
首先定義一個MySQL存儲過程:
DROP PROCEDURE IF EXISTS test ;
CREATE PROCEDURE test (IN p1 VARCHAR(26), OUT pResult VARCHAR(512))
BEGIN
SET pResult := NULL;
SET pResult :=CONCAT ( 'test',p1);
SELECT * FROM tb2 WHERE commet lik Concat('%',p1, '%'); -- this 返回一個結果集
END;
tb2的表結構和數據如下:
DROP TABLE IF EXISTS `tb2`;
CREATE TABLE `tb2` (
`t_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`Name` varchar(255) DEFAULT NULL COMMENT '欄位名',
`type` int(1) DEFAULT NULL COMMENT '類型,0-正常,1-異常,2-傳輸,3-退單',
`commet` varchar(255) DEFAULT NULL COMMENT '備注',
⑺ 使用mybatis查詢mysql資料庫 先調用存儲過程,然後再inner join 存儲過程返回的臨時表出錯 高手幫忙看下!
這個錯誤報文上寫的很明確啊。就是在你那個資料庫中gettreeobjsV4_result 表根本不存在。所以報的jdbc的錯誤啊。
你使用mysql fount 看一下 select * from gettreeobjsV4_result
有沒有問題。
⑻ mybatis 調用mysql 中存儲過程返回結果集
如果是sqlserver。 select 標簽 配置 requltMap
去掉 #{users,mode=OUT,javaType=ResultSet,jdbcType=CURSOR,resultMap=UserMap}
調用selectList也行!
⑼ 使用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對象)映射成資料庫中的記錄.
⑽ 於mysql不能返回遊標,那麼使用mybatis框架在取
mysql存儲過程是這樣的
create procere sp_get_user_count
(
out v_count int
)
begin
select count(1) into v_count from t_user;
select * from t_dept;
select * from t_class;
end;
由於mysql不能返回遊標,那麼使用mybatis框架在取的時候應該怎麼取呢?怎樣確定取出來的是t_dept的還是t_class?
<!--這段應改怎麼寫啊?-->
<select id="selectAll" >
call sp_get_user_count()
</select>