mysql生成uui mybatis_mybatis----基础
基礎(chǔ)知識
安裝
org.mybatis
mybatis
x.x.x
對原生態(tài)jdbc程序中問題總結(jié)
環(huán)境
java環(huán)境:jdk
jdbc程序
使用jdbc查詢mysql數(shù)據(jù)庫中用戶表的記錄
問題總結(jié)
數(shù)據(jù)庫連接、使用時創(chuàng)建、不使用時就立即釋放,對數(shù)據(jù)庫進行頻繁連接開啟和關(guān)閉,造成數(shù)據(jù)庫資源浪費,影響數(shù)據(jù)庫性能(使用連接池管理數(shù)據(jù)庫來連接進行優(yōu)化)
將sql語句硬編碼到Java代碼中,如果sql語句修改,需要重新編譯代碼,不利于系統(tǒng)維護(將sql語句配置在xml配置文件中,即使sql變化,也不需要對java代碼進行重新編譯)
向preparedStatement中設(shè)置參數(shù),對占位符號位置和設(shè)置參數(shù)值,硬編碼在Java代碼中,不利于系統(tǒng)維護(將sql語句及占位符號和參數(shù)全部配置在xml中)
從resultSet中遍歷結(jié)果集數(shù)據(jù)時,存在硬編碼,將獲取表的字段進行硬編碼,不利于系統(tǒng)維護(將查詢的結(jié)果集,自動映射成java對象。)
mybatis是什么
mybatis是一個持久層框架,是apache下的頂級項目。
mybatis是讓程序員將主要精力放在sql上,通過mybatis提供的映射方式,自由靈活的生成(半自動化,大部分需要程序員編寫sql)滿足需要的sql語句
mybatis可以將向preparedStatement中的輸入?yún)?shù)自動進行輸入映射,將查詢結(jié)果集靈活映射成java對象(輸出映射)
mybatis框架
SqlMapConfig.xml 是mybatis的全局配置文件,配置了數(shù)據(jù)源、事務等mybatis運行環(huán)境(第三方軟件進行配置)
mybatis自己還需要配置映射文件(mapper.xml、mapper.xml、mapper.xml……【映射文件】)也就是配置sql語句
SqlSessionFactory(會話工廠),根據(jù)配置文件創(chuàng)建工廠
作用:創(chuàng)建SqlSession
SqlSession(會話),是一個接口,面向用戶(程序員)的接口
作用:操作數(shù)據(jù)庫(發(fā)出增、刪、改、查)
Executor(執(zhí)行器),也是一個接口(基本執(zhí)行器、緩存執(zhí)行器)
作用:操作數(shù)據(jù)庫(發(fā)出增、刪、改、查)
mapped statement(底層封裝對象)
作用:對操作數(shù)據(jù)庫存儲封裝,包括sql語句,輸入?yún)?shù)、輸出結(jié)果類型
入門程序
編寫log4j.properties進行日志輸出
# Global logging configuration
#在開發(fā)環(huán)境下日志級別要設(shè)置成DEBUG,生成環(huán)境設(shè)置成info或ERROR
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
編寫全局配置SqlMapConfig.xml
映射文件
映射文件命名
User.xml(原始mybatis命名),mapper代理開發(fā)映射文件叫xxxMapper.xml,比如:UserMapper.xml
在映射文件中配置sql語句
image.png
image.png
#{}與${}
#{} 表示一個占位符,#{}接受輸入?yún)?shù),類型可以是簡單的類型,pojo、hashmap。
如果接受簡單類型,#{}中可以寫成value或其他名稱
#{}接受pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性。屬性。屬性……的方式獲取對象屬性值
${} 表示一個拼接符號,會引起sql注入,所以不建議使用
${}接受輸入?yún)?shù),類型可以是簡單的類型,pojo、hashmap。
如果接受簡單類型,${}中只可以寫成value
parameterType、resuletType
parameterType : 指定輸入?yún)?shù)的類型
resuletType : 指定輸出參數(shù)的類型
自增主鍵返回
mysql自增主鍵,執(zhí)行insert提交之前自動生成一個自增主鍵。
通過mysql函數(shù)獲取到剛插入記錄的自增主鍵:
LAST_INSERT_ID()
是在insert之后調(diào)用此函數(shù),需要修改UserInsert的定義
SELECT LAST_INSERT_ID()
INSERT into user(username,password,address) value(#{username},#{password},#{address})
非自增主鍵返回(使用uuid)
使用mysql的uuid()函數(shù)生成主鍵,需要修改表中id字段類型為string,長度設(shè)置成35位
執(zhí)行思路:
先通過uuid()查詢到主鍵,將主鍵輸入到sql語句中
執(zhí)行uuid()語句順序相對于insert語句之前執(zhí)行
SELECT uuid()
INSERT into user(id,username,password,address) value(#{id},#{username},#{password},#{address})
mybatis開發(fā)dao的方法
sqlSession使用范圍
sqlSessionFactoryBuilder
通過sqlSessionFactoryBuilder創(chuàng)建會話工廠sqlSessionFactory
sqlSessionFactory
通過sqlSessionFactory創(chuàng)建sqlSession,通過單例模式管理sqlSessionFactory(工廠一旦創(chuàng)建,一直使用一個實例)
sqlSession
是一個面向用戶的接口(程序員)的接口
sqlSession中提供了很多操作數(shù)據(jù)庫的方法:例如:selectOne(返回單個對象)selectList(返回單個或多個對象)
sqlSession是線程不安全的,在sqlSession實現(xiàn)類中除了有接口中的方法(操作數(shù)據(jù)庫的方法)還有數(shù)據(jù)域?qū)傩?/p>
sqlSession最佳應用場合在方法體內(nèi),定義為局部變量使用
原始dao開發(fā)方法(程序員需要寫dao接口和dao實現(xiàn)類)
思路:
程序員需要寫dao接口和dao實現(xiàn)類。
需要向dao實現(xiàn)類中注入sqlSessionFactory(會話工廠),在方法體內(nèi)通過工廠(sqlSessionFactory)創(chuàng)建sqlSession
總結(jié)原始開發(fā)dao的問題
1.dao的接口實現(xiàn)類方法中存在大量模板方法,設(shè)想能否將這些代碼提取出來
2.調(diào)用sqlSession方法時將statement的id硬編碼了
3.調(diào)用sqlSession方法時傳入的變量,由于sqlSession方法使用泛型,即使變量類型傳入錯誤,在編譯階段也不報錯,只有在運行時報錯,不利于程序開發(fā)
mapper代理方法(程序員只需要mapper接口(相當于dao接口))
思路
1.程序員只需要mapper接口(相當于dao接口),需要遵循一些開發(fā)規(guī)范,mybatis可以自動生成mapper接口實現(xiàn)類的代理對象
2.程序員還需要編寫mapper.xml映射文件
開發(fā)規(guī)范:
1.在mapper.xml中namespace等于mapper接口地址
image.png
2.mapper.java接口中的方法名和mapper.xml中statement的id一致
3.mapper.java接口中的方法輸入?yún)?shù)類型和mapper.xml中statement的parameterType指定的類型一致
4.mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致
image.png
image.png
總結(jié)
以上開發(fā)規(guī)范主要是對下邊的代碼進行統(tǒng)一的生成:
image.png
SqlMapConfig.xml
properties(屬性)
需求:
將數(shù)據(jù)庫連接的參數(shù)單獨配置在db.properties中,只需要在sqlMapConfig.xml中加載db.properties的屬性值
在SqlMapConfig.xml中就不需要對數(shù)據(jù)庫連接參數(shù)硬編碼
將數(shù)據(jù)庫連接參數(shù)只配置在db.properties中,原因:方便對參數(shù)進行統(tǒng)一的管理,其他xml可以引用該db.properties
db.properties的文件
image.png
sqlMapConfig.xml加載屬性名稱
image.png
image.png
建議:
不要在properties元素體內(nèi)添加任何屬性值,只將屬性值定義在properties文件中
setting(全局配置參數(shù))需要時設(shè)置,不需要就不要設(shè)置(會影響mybatis的運行)
mybatis框架在運行時可以調(diào)整一些運行參數(shù)
比如:開啟二級緩存、開啟延時加載……
全局參數(shù)將會影響mybatis的運行行為
typeAliases(類型別名)
單個定義別名
image.png
批量定義別名
image.png
在dao.xml中的返回值類型填實體類的名稱,首字母大寫小寫都可以
typeHandles(類型處理器)
在mybatis中通過typeHandles完成jdbc類型和java類型的轉(zhuǎn)換
objectFactory(對象工廠)
plugins(插件)
environments(環(huán)境集合屬性對象)
environment(環(huán)境子屬性對象)
transactionManager(事務管理)
dataSource(數(shù)據(jù)源)
mappers(映射器)
通過resource加載單個映射文件
image.png
通過mapper接口加載
加載單個映射文件
image.png
批量加載映射文件(建議使用)
image.png
動態(tài)sql
什么是動態(tài)sql
mybatis核心就是對sql語句進行靈活的操作,通過表達式進行判斷,對sql進行靈活拼接、組裝
需求:
用戶信息總和查詢列表和用戶信息查詢列表總數(shù)這兩個statement的定義使用動態(tài)sql
對查詢條件進行判斷,如果輸入?yún)?shù)不為空才能進行查詢條件拼接;例如:
select * from user
and user.username = #{userCustom.username}
and user.sex = #{userCustom.sex}
sql片段
需求:
將上邊實現(xiàn)的動態(tài)sql判斷代碼塊抽取出來,組成一個sql片段。其他的statement中就可以引用sql片段
定義sql片段
and user.username = #{userCustom.username}
and user.sex = #{userCustom.sex}
應用sql片段
select * from user
/*應用sql片段*/
/*在這里還會引用其他的sql片段*/
foreach
向sql傳遞數(shù)組或list,mybatis使用foreach解析
需求
在用戶查詢列表和查詢總數(shù)的statement中增加多個id輸入查詢
sql語句如下:
select * from user where id=1 or id=10 or id=16或select * from user where id in(1,10,16)
在輸入?yún)?shù)類型中添加List傳入多個id
private List ids傳入多個id
mapper.xml的配置
在查詢條件中,查詢條件定義成一個sql片段,需要修改sql片段
/*每次遍歷需要拼接的串*/
id=#{user_id}
select * from user where id in(1,10,16)的foreach查詢方法
image.png
總結(jié)
以上是生活随笔為你收集整理的mysql生成uui mybatis_mybatis----基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: mysql web日志_mysql日志管
- 下一篇: python处理重复的复制粘贴_如何将数
