⑴ mybatis 怎麼創建資料庫
1,首先在包下創建Configuration.xml文件,該文件的格式如下:
< xml version="1.0" encoding="UTF-8" > <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" ""> <configuration> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"$amp;>amp;$lt;/transactionManager> <dataSource type="POOLED"> <property name="driver" value="喚侍塌oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@192.168.1.20:1521:oa" /> <property name="username" value="zhangsan" /> <property name="password" value="123" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/cissst/oa/data/UserMapper.xml" /> <mapper resource="com/談宴cissst/oa/data/DepartmentMapper.xml" /> </mappers> </configuration>
2,使用myBatis提供的工具類中的方法,從類路徑或Configuration.xml文檔所在位置載入資源文件。
sqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = null;
// 獲取SqlSessionFactory對象
try {
Reader reader = Resources
.getResourceAsReader("com/cissst/oa/data/Configuration.xml");
factory = builder.build(reader);
} catch (Exception e) {
e.printStackTrace();
}
3,使用工廠對象獲取SqlSession 對象
SqlSession session=factory .openSession(false);
參數如果為true,表示該會話具有自動和圓提交事務的功能,否則需程序員手動提交事務。
4,使用進行資料庫訪問
SqlSession session = super.getSqlSession();
// 構造返回值集合
List<UserEntity> result = new ArrayList<UserEntity>();
try {
// 獲取映射介面
UserMapper userMapper = session.getMapper(UserMapper.class);
// 調用介面中的方法
List<UserEntity> list = userMapper.getUserList(userEntity);
// 提交事務
session.commit();
} catch (Exception e) {
// 回滾事務
session.rollback();
} finally {
// 關閉會話
session.close();
}
⑵ mybatis各階段的詳解
比如我們在引入了jdbc的配置文件使用了properties標簽,引入jdbc有什麼好處?,可以在配置文件中統一管理
內容而不是在很多個文件改來改去,而且在核心配置文件中把資料庫連接相關的寫死,顯然是硬編碼的所以我們用配置文件代替 nice!!!
你可能注意到了上面的寫法 用前綴jdbc. 可以很好地將他們與其他的變數區分開,(可以從名字很容易看出是jdbc相關的數據,不至於和同名變數搞混因為username這種可能
不止會出洞虧現在資料庫的連接)
上面的代碼中引入配置文件的部分為
可以從上面看到寫法:
下面這段就是用來設置類的別名:
那麼問題來了,為什麼要有類的別名這種操作??
因為在映射文件中每次都要寫全類名顯然有點麻煩比如下面這樣:納謹神
一個項目是會有很多個映射文件的為了方便,所以類別名就出現了。可以在核心配置文件寫介面類和對應的別名
這樣就可以在映射文件的命名空間里可以直接寫User(對大小沒有要求也可以是user; 其實可以比這更加簡單,也是我們在實際開發中常用的寫法
就是將整個包寫成別名的形式,如果不寫alias屬性默認為類名(不區分大小寫),這樣就容易多了,我們只需一行代碼,便可以在所有的映射文件命名空間
中直接寫對應的類名
引入核心的配置文件
首先需晌兄要思考的這里是映射文件的引入,我們正常的一個項目的資料庫是有很多個表組成的那麼每一張表對應一個mapper介面,每個介面對應一個映射文件,那麼就需要導入大量的映射文件,還容易漏掉-->
上面這種以包的形式的導入非常方便,不用每次新建一個介面就要導入它的映射文件,但是上面這種寫法需要 注意 一些問題:
如果你在映射文件中編寫查詢語句的sql,但是粗心的你忘記了設置返回類型會在控制台拋異常且會看到這樣的說明:
It's likely that neither a Result Type nor a Result Map was specified.
下面只是指定返回類型的一種方式:resultType,還有 resultMap
它們的區別:
查詢的標簽必須指定resultType或resultMap
com.kobe.mybatis 獲取參數的兩種方式:${} 和 #{}
上面是使用了 #{}寫法相當於原生jdbc的佔位符,這個前面已經提到過了所以不多贅述, 需要注意的是#{}裡面的變數名可以是任意的username規范顯然很好,但是aaaa也沒錯因為只是用來佔位的;
還有就是在使用${}時注意''單引號問題,因為${}是字元拼接的方式,所以需要注意!!
傳輸參數時有多個參數時
在測試代碼里通過傳入兩個參數分別為 username和password 但是在上面代碼的(映射文件里的部分代碼)執行失敗,(sql語句未能解析)
報錯:
Cause: org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]
可以從錯誤提示的信息不難發現我們的參數在映射文件里未能真正地接受到,可以用[arg1, arg0, param1, param2] 的方式獲取,mybatis將參數放到map容器可以通過建arg0,agr1..的方式
獲取參數(也可以是param1,param2..)
將上面的代碼改動:
需要注意的是:使用${}時需要手動添加''才能正常訪問,因為他的處理方式是字元串的拼接
做了改動之後結果很感人!!
User{id=6, userName='旺財', age=20, password='cwlz'}
可以直接通過鍵訪問相對應的值(通過自己的方式訪問到數據,上面的形式是mybatis默認提供的map和mybatis默認的提取指的方式 arg0,arg2...)
當需要傳多個參數時將他們放到一個map容器,然後將map傳給對應的方法(模擬mybatis的做法,就可以在sql語句中直接通過鍵訪問到值)代碼如下:
映射文件中的部分代碼 :
通過鍵直接獲取值,注意:使用${}時不要忘了單引號!!!!
當參數以實體對象的形式傳參時如何解決?
只需要通過#{}以屬性名的方式訪問!
所以代碼的編寫一定要規范,才能減少這種錯誤!!!
一定要和註解中的參數名一一對應!!!
如果查詢的結果只有一個,也可以通過Map集合接收,欄位名為鍵欄位的值為值:{password=0000, id=3, userName=圖區, age=20}
java.lang.Ingeger --> int ,Integer
int --> _int,_Integer
Map --> map
String --> string
注意:
所以在批量刪除的案例:需要注意的是不能使用#{} 因為它是會自動添加'' 所以在批量刪除的語句中我們要使用${}
若欄位和屬性名不一致 ,則可以通過resultMap設置自定義映射
在mybatis的核心配置文件用下面的代碼將 資料庫中命名的規范 (user_name) 轉換為 java中的命名規范 (userName)
就是手動設置屬性與欄位的映射關系:
如果設置了手動的設置屬性和欄位的映射關系,注意主鍵使用 id 標簽,普通欄位使用 result標簽,就算屬性和欄位名一一對應,只要
用了這種方式就 必須要寫全 !!!
一對多的查詢:
通過分步查詢實現:
多條件的查詢
if 根據標簽中test的屬性所對應的表達式決定標簽中的內容是否拼接到sql語句中
上面的where後面的 1=1 是細節,因為當where後面的條件都為空時就成了 select * from t_user where
顯然這種sql語句是有問題的,還有一種情況就是當userName為null時語句就成了 select * from t_user where and age=#{age}
這也是錯的,所以在where後加一個恆成立的條件不僅不會影響查詢結果,而且沒有會在特定情況時sql語句是會報錯的所以很有必要
where 當where標簽中有內容時,會自動生成where關鍵字,並且將內容前多餘的and 或者or去掉
當where中沒有內容時,此時where標簽沒有任何效果 就是不會生成關鍵字 注意:在寫條件時不能在後面加and or 這個在下一條語句無效時mybatis不會幫你去掉!
相當於 if else
一個案例 -->就是當我們需要批量刪除一些東西時(參數以數組的形式傳入)
sql 片段: 在我們的查詢語句不能在實際開發中也一直寫 *;因為我們要按需查找,不必將不需要的也查詢出來,我們可以將我們平常查詢次數較多的欄位
放在sql片段內,可以在需要查詢時直接進行引用!
緩存,這個術語我們聽過很多次,在web階段時訪問網頁時有緩存機制!
現在sql的查詢時也有緩存機制,有一級緩存,一級緩存是默認開啟的,一級緩存的范圍時sqlSession,將我們查詢到的數據先進行緩存,若下次有相同的查詢時不用重新
訪問資料庫,可以直接從緩存中取出!!!!
手動清空緩存 sqlSession.clearCache();
在mapper配置文件中添加cache標簽可以設置一些屬性:
逆向工程就是不難理解,我們之前都是由實體類到資料庫,而逆向類就是通過資料庫表生成實體類,
⑶ mybatis 批量增刪改查操作的幾種操作以及創建資料庫索引
1、批量插入操作
mapper.java層定義:
int batchInsert(List stockList);
mapper.xml層的sql語句:
insert into t_stock (status, asset_classify_id,asset_id,asset_item_id, name,num, batch_num, tag_id,rfid, epc, barcode,qr_code, erp, unit,pic_url, specification, model,material, color,length,width, height, weight,density, volume, price01,price02,warehouse_id, storage_zone_id,storage_location_id,storage_location_tag_id,remark, attr01, attr02,attr03, create_date,last_update,creater, client_id)values (#{item.status,jdbcType=VARCHAR},#{item.assetClassifyId,jdbcType=BIGINT},#{item.assetId,jdbcType=BIGINT}, #{item.assetItemId,jdbcType=BIGINT},#{item.name,jdbcType=VARCHAR},#{item.num,jdbcType=VARCHAR},#{item.batchNum,jdbcType=VARCHAR}, #{item.tagId,jdbcType=VARCHAR},#{item.rfid,jdbcType=VARCHAR}, #{item.epc,jdbcType=VARCHAR},#{item.barcode,jdbcType=VARCHAR},#{item.qrCode,jdbcType=VARCHAR},#{item.erp,jdbcType=VARCHAR}, #{item.unit,jdbcType=VARCHAR},#{item.picUrl,jdbcType=VARCHAR},#{item.specification,jdbcType=VARCHAR},#{item.model,jdbcType=VARCHAR},#{item.material,jdbcType=VARCHAR},#{item.color,jdbcType=VARCHAR}, #{item.length,jdbcType=DECIMAL},#{item.width,jdbcType=DECIMAL}, #{item.height,jdbcType=DECIMAL},#{item.weight,jdbcType=DECIMAL},#{item.density,jdbcType=DECIMAL},#{item.volume,jdbcType=DECIMAL}, #{item.price01,jdbcType=DECIMAL},#{item.price02,jdbcType=DECIMAL},#{item.warehouseId,jdbcType=BIGINT},#{item.storageZoneId,jdbcType=BIGINT},#{item.storageLocationId,jdbcType=BIGINT},#{item.storageLocationTagId,jdbcType=BIGINT},#{item.remark,jdbcType=VARCHAR}, #{item.attr01,jdbcType=VARCHAR},#{item.attr02,jdbcType=VARCHAR},#{item.attr03,jdbcType=VARCHAR},#{item.createDate,jdbcType=TIMESTAMP},#{item.lastUpdate,jdbcType=TIMESTAMP},#{item.creater,jdbcType=BIGINT}, #{item.clientId,jdbcType=BIGINT})
⑷ tk.mybatis 逆向工程,生成帶資料庫注釋的實體類
1,每次需要生成哪帆檔個表,就把液皮配置文件的 table 的標簽的屬性進行修改
2,如果想要一次性生成所有表,可以把 tableName 配置為 *,態埋亂一般不推薦這么干,開發項目的時候最好是要用到哪些表,才去生成
注意命令最後的 -e 不能少,要不然生成文件 不是 utf-8 格式,中文會亂碼
⑸ mybatis根據oracle資料庫生成的代碼怎麼加註釋
1、首先在電腦上打開sql資料庫軟體。然後右鍵點擊新建查詢。
⑹ springxml文件怎麼生成資料庫
首先spring整合檔州寬行亮mybatis在(一)中說過,那麼下面說一下如何自動生成、pojo、mapperxml文件
第一步、在pom.xml中增加一個插件,意義在於手動執行maven的操作:
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<!-- 自動生成文件配置文件的地址 -->
<configurationFile>src/main/resources/mybatis-generator/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>跡櫻mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</plugin>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
第二步,將自動生成及mapper文件的配置文件放在上述配置的目錄下:
<?xml version="1.0" encoding="UTF-8"?>
<!--資料庫連接驅動類,URL,用戶名、密碼 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://ipXXX:3306/databaseXXX?characterEncoding=utf-8"
userId="root" password="rootXXX">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成(實體)模型的包名和位置-->
<javaModelGenerator targetPackage="com.zhy.pojo" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成XML映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO介面的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.zhy." targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是資料庫中的表名或視圖名 domainObjectName是實體類名-->
<table tableName="t_user" domainObjectName="UserInfo" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
</context>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
這里有個小點需要注意,在maven工程基於「約定大於配置」的特點,java文件在src/main/java下,所以你需要將targetProject的值設為src/main/java,直接放在你的工程目錄下,這樣生成後不需要修改文件的引入地址。–~
第三步,就可以maven菜單裏手動執行mybatis-generator生成層文件了。
⑺ Mybatis是什麼以及Mybatis和JDBC的關系
Mybatis是什麼
mybatis是一個持久層ORM框架。它內部封裝了jdbc,使得開發更簡潔,更高效。
MyBatis可以通過xml或註解完成ORM映射關系配置。
Mybatis和JDBC的關系
JDBC是Java提供的一個操作資料庫的API; MyBatis是一個持久層ORM框架,底層是對JDBC的封裝。
MyBatis對JDBC操作資料庫做了一系列的優化:
(1) mybatis使用已有的連接池管理,避免浪費資源,提高程序可靠性。
(2) mybatis提供插件自動生成DAO層代碼,提高編碼效率和准確性。
(3)mybatis 提供了一級和二級緩存,提高了程序性能。
(4) mybatis使用動態SQL語句,提高了SQL維護。(此優勢是基於XML配置)
(5) mybatis對資料庫操作結果進行自動映射
MyBatis的優點和缺點
優點:
簡單:易於學習,易於使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。
實用:提供了數據映射功能,提供了對底層數據訪問的封裝(例如ado.net),提供了DAO框架,可以使我們更容易的開發和配置我們的DAL層。
靈活:通過sql基本上可以實現我們不使用數據訪問框架可以實現的所有功能,或許更多。
功能完整:提供了連接管理,緩存支持,線程支持,(分布式)事物管理,通過配置作關系對象映射等數據訪問層需要解決的問題。提供了DAO支持,並在DAO框架中封裝了ADO.NET,NHibernate和DataMapper。
增強系統的可維護性:通過提供DAO層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。
缺點:
sql工作量很大,尤其是欄位多、關聯表多時,更是如此。
sql依賴於資料庫,導致資料庫移植性差。
由於xml里標簽id必須唯一,導致DAO中方法不支持方法重載。
欄位映射標簽和對象關系映射標簽僅僅是對映射關系的描述,具體實現仍然依賴於sql。(比如配置了一對多Collection標簽,如果sql里沒有join子表或查詢子表的話,查詢後返回的對象是不具備對象關系的,即Collection的對象為null)。
DAO層過於簡單,對象組裝的工作量較大。
不支持級聯更新、級聯刪除。
編寫動態sql時,不方便調試,尤其邏輯復雜時。
提供的寫動態sql的xml標簽功能簡單(連struts都比不上),編寫動態sql仍然受限,且可讀性低。使用不當,容易導致N+1的sql性能問題。
⑻ 實際開發mybatis都是使用自動生成的sql么
以前沒怎麼用過mybatis,只知道與hibernate一樣是個orm資料庫框架。隨著使用熟練度的增加,發現它與hibernate區別是非常大的,結合至今為止的經驗,總結出以下幾點:
1. hibernate是全自動,而mybatis是半自動。
hibernate完全可以通過對象關系模型實現對資料庫的操作,擁有完整的JavaBean對象與資料庫的映射結構來自動生成sql。而mybatis僅有基本的欄位映射,對象數據以及對象實際關系仍然需要通過手寫sql來實現和管理。
2. hibernate資料庫移植性遠大於mybatis。
hibernate通過它強大的映射結構和hql語言,大大降低了對象與資料庫(oracle、MySQL等)的耦合性,而mybatis由於需要手寫sql,因此與資料庫的耦合性直接取決於程序員寫sql的方法,如果sql不具通用性而用了很多某資料庫特性的sql語句的話,移植性也會隨之降低很多,成本很高。
3. hibernate擁有完整的日誌系統,mybatis則欠缺一些。
hibernate日誌系統非常健全,涉及廣泛,包括:sql記錄、關系異常、優化警告、緩存提示、臟數據警告等;而mybatis則除了基本記錄功能外,功能薄弱很多。
4. mybatis相比hibernate需要關心很多細節
hibernate配置要比mybatis復雜的多,學習成本也比mybatis高。但也正因為mybatis使用簡單,才導致它要比hibernate關心很多技術細節。mybatis由於不用考慮很多細節,開發模式上與傳統jdbc區別很小,因此很容易上手並開發項目,但忽略細節會導致項目前期bug較多,因而開發出相對穩定的軟體很慢,而開發出軟體卻很快。hibernate則正好與之相反。但是如果使用hibernate很熟練的話,實際上開發效率絲毫不差於甚至超越mybatis。