多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > 數(shù)據(jù)庫(kù) > 數(shù)據(jù)庫(kù)應(yīng)用 > MyBatis入門(mén)第2天--MyBatis基礎(chǔ)知識(shí)(二)

MyBatis入門(mén)第2天--MyBatis基礎(chǔ)知識(shí)(二)

來(lái)源:程序員人生   發(fā)布時(shí)間:2016-09-12 15:26:37 閱讀次數(shù):3522次
文檔版本 開(kāi)發(fā)工具 測(cè)試平臺(tái) 工程名字 日期 作者 備注
V1.0 2016.06.26 lutianfei none

mybatis開(kāi)發(fā)dao的方法

SqlSession使用范圍

  • SqlSessionFactoryBuilder

    • 通過(guò)SqlSessionFactoryBuilder創(chuàng)建會(huì)話工廠SqlSessionFactory
    • 將SqlSessionFactoryBuilder當(dāng)做1個(gè)工具類使用便可,不需要使用單例管理SqlSessionFactoryBuilder。
    • 在需要?jiǎng)?chuàng)建SqlSessionFactory時(shí)候,只需要new1次SqlSessionFactoryBuilder便可。
  • SqlSessionFactory

    • 通過(guò)SqlSessionFactory創(chuàng)建SqlSession,使用單例模式管理sqlSessionFactory(工廠1旦創(chuàng)建,使用1個(gè)實(shí)例)。
    • 將來(lái)mybatis和spring整合后,使用單例模式管理sqlSessionFactory。
  • SqlSession

    • SqlSession是1個(gè)面向用戶(程序員)的接口。
    • SqlSession中提供了很多操作數(shù)據(jù)庫(kù)的方法:如:selectOne(返回單個(gè)對(duì)象)、selectList(返回單個(gè)或多個(gè)對(duì)象)、。
    • SqlSession是線程不安全的,在SqlSesion實(shí)現(xiàn)類中除有接口中的方法(操作數(shù)據(jù)庫(kù)的方法)還有數(shù)據(jù)域?qū)傩浴?/li>
    • SqlSession最好利用場(chǎng)合在方法體內(nèi),定義成局部變量使用。
  • SqlSession履行進(jìn)程以下:

    • 1、 加載數(shù)據(jù)源等配置信息
      • Environment environment = configuration.getEnvironment();
    • 2、 創(chuàng)建數(shù)據(jù)庫(kù)鏈接
    • 3、 創(chuàng)建事務(wù)對(duì)象
    • 4、 創(chuàng)建Executor,SqlSession所有操作都是通過(guò)Executor完成,mybatis源碼以下:
if (ExecutorType.BATCH == executorType) { executor = newBatchExecutor(this, transaction); } elseif (ExecutorType.REUSE == executorType) { executor = new ReuseExecutor(this, transaction); } else { executor = new SimpleExecutor(this, transaction); } if (cacheEnabled) { executor = new CachingExecutor(executor, autoCommit); }
* 5、 SqlSession的實(shí)現(xiàn)類即DefaultSqlSession,此對(duì)象中對(duì)操作數(shù)據(jù)庫(kù)實(shí)質(zhì)上用的是Executor
  • 結(jié)論:
    • 每一個(gè)線程都應(yīng)當(dāng)有它自己的SqlSession實(shí)例。SqlSession的實(shí)例不能同享使用,它也是線程不安全的。因此最好的范圍是要求或方法范圍。絕對(duì)不能將SqlSession實(shí)例的援用放在1個(gè)類的靜態(tài)字段或?qū)嵗侄沃小?/li>
    • 打開(kāi)1個(gè) SqlSession;使用終了就要關(guān)閉它。通常把這個(gè)關(guān)閉操作放到 finally 塊中以確保每次都能履行關(guān)閉。以下:
SqlSession session = sqlSessionFactory.openSession(); try { // do work } finally { session.close(); }


原始dao開(kāi)發(fā)方法

  • 程序員需要寫(xiě)dao接口和dao實(shí)現(xiàn)類
  • 思路

    • 程序員需要寫(xiě)dao接口和dao實(shí)現(xiàn)類。
    • 需要向dao實(shí)現(xiàn)類中注入SqlSessionFactory,在方法體內(nèi)通過(guò)SqlSessionFactory創(chuàng)建SqlSession
  • dao接口


  • dao接口實(shí)現(xiàn)類
public class UserDaoImpl implements UserDao { // 需要向dao實(shí)現(xiàn)類中注入SqlSessionFactory // 這里通過(guò)構(gòu)造方法注入 private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Override public User findUserById(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); User user = sqlSession.selectOne("test.findUserById", id); // 釋放資源 sqlSession.close(); return user; } @Override public List<User> findUserByName(String name) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> list = sqlSession.selectList("test.findUserByName", name); // 釋放資源 sqlSession.close(); return list; } @Override public void insertUser(User user) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //履行插入操作 sqlSession.insert("test.insertUser", user); // 提交事務(wù) sqlSession.commit(); // 釋放資源 sqlSession.close(); } @Override public void deleteUser(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //履行插入操作 sqlSession.delete("test.deleteUser", id); // 提交事務(wù) sqlSession.commit(); // 釋放資源 sqlSession.close(); }


  • 測(cè)試代碼:
public class UserDaoImplTest { private SqlSessionFactory sqlSessionFactory; // 此方法是在履行testFindUserById之前履行 @Before public void setUp() throws Exception { // 創(chuàng)建sqlSessionFactory // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 創(chuàng)建會(huì)話工廠,傳入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); } @Test public void testFindUserById() throws Exception { // 創(chuàng)建UserDao的對(duì)象 UserDao userDao = new UserDaoImpl(sqlSessionFactory); // 調(diào)用UserDao的方法 User user = userDao.findUserById(1); System.out.println(user); } }


原始dao開(kāi)提問(wèn)題
  • dao接口實(shí)現(xiàn)類方法中存在大量模板方法,假想能否將這些代碼提取出來(lái),大大減輕程序員的工作量。
  • 調(diào)用sqlsession方法時(shí)將statement的id硬編碼了
  • 調(diào)用sqlsession方法時(shí)傳入的變量,由于sqlsession方法使用泛型,即便變量類型傳入毛病,在編譯階段也不報(bào)錯(cuò),不利于程序員開(kāi)發(fā)。

mapper代理方法

  • 程序員只需要mapper接口(相當(dāng) 于dao接口)

mapper代理開(kāi)發(fā)規(guī)范

  • 程序員還需要編寫(xiě)mapper.xml映照文件
  • 程序員編寫(xiě)mapper接口需要遵守1些開(kāi)發(fā)規(guī)范,這樣Mybatis可以自動(dòng)生成mapper接口實(shí)現(xiàn)類代理對(duì)象。

  • 開(kāi)發(fā)規(guī)范:

    • 1、在mapper.xml中namespace等于mapper接口地址
      • 2、mapper.java接口中的方法名和mapper.xml中statement的id1致
    • 3、mapper.java接口中的方法輸入?yún)?shù)類型和mapper.xml中statement的parameterType指定的類型1致。
    • 4、mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型1致。

  • 總結(jié):
    • 以上開(kāi)發(fā)規(guī)范主要是對(duì)下邊的代碼進(jìn)行統(tǒng)1生成:
User user = sqlSession.selectOne("test.findUserById", id); sqlSession.insert("test.insertUser", user);
  • 編寫(xiě)XXXmapper.java
public interface UserMapper { //用戶信息綜合查詢 public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception; //用戶信息綜合查詢總數(shù) public int findUserCount(UserQueryVo userQueryVo) throws Exception; //根據(jù)id查詢用戶信息 public User findUserById(int id) throws Exception; //根據(jù)id查詢用戶信息,使用resultMap輸出 public User findUserByIdResultMap(int id) throws Exception; //根據(jù)用戶名列查詢用戶列表 public List<User> findUserByName(String name)throws Exception; //插入用戶 public void insertUser(User user)throws Exception; //刪除用戶 public void deleteUser(int id)throws Exception; }


  • XXXmapper.xml



  • 在SqlMapConfig.xml中加載mapper.xml
<!-- 加載 映照文件 --> <mappers> <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> <!-- 批量加載mapper 指定mapper接口的包名,mybatis自動(dòng)掃描包下邊所有mapper接口進(jìn)行加載,遵守1些規(guī)范:需要將mapper接口類名和mapper.xml映照文件名稱保持1致,且在1個(gè)目錄中 上邊規(guī)范的條件是:使用的是mapper代理方法 --> <package name="cn.itcast.mybatis.mapper"/> </mappers>
  • 測(cè)試
@Test public void testFindUserById() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //創(chuàng)建UserMapper對(duì)象,mybatis自動(dòng)生成mapper代理對(duì)象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //調(diào)用userMapper的方法 User user = userMapper.findUserById(1); System.out.println(user); }
  • 1些問(wèn)題總結(jié)
    • 代理對(duì)象內(nèi)部調(diào)用selectOne或selectList ?
      • 如果mapper方法返回單個(gè)pojo對(duì)象(非集合對(duì)象),代理對(duì)象內(nèi)部通過(guò)selectOne查詢數(shù)據(jù)庫(kù)
      • 如果mapper方法返回集合對(duì)象,代理對(duì)象內(nèi)部通過(guò)selectList查詢數(shù)據(jù)庫(kù)
    • mapper接口方法參數(shù)只能有1個(gè)是不是影響系統(tǒng)擴(kuò)大保護(hù)?
      • 系統(tǒng)框架中,dao層的代碼是被業(yè)務(wù)層公用的。即便mapper接口只有1個(gè)參數(shù),可使用包裝類型的pojo滿足不同的業(yè)務(wù)方法的需求。
      • 注意:持久層方法的參數(shù)可以包裝類型、map、list等等;
      • 但service方法中建議不要使用包裝類型(不利于業(yè)務(wù)層的可擴(kuò)大)。


SqlMapConfig.xml配置文件

  • mybatis的全局配置文件SqlMapConfig.xml,配置內(nèi)容以下:
    • properties(屬性)
    • settings(全局配置參數(shù))
    • typeAliases(類型別名)
    • typeHandlers(類型處理器)
    • objectFactory(對(duì)象工廠)
    • plugins(插件)
    • environments(環(huán)境集合屬性對(duì)象)
    • environment(環(huán)境子屬性對(duì)象)
    • transactionManager(事務(wù)管理)
    • dataSource(數(shù)據(jù)源)
    • mappers(映照器)
properties屬性
  • 需求:將數(shù)據(jù)庫(kù)連接參數(shù)單獨(dú)配置在db.properties中,只需要在SqlMapConfig.xml中加載db.properties的屬性值。

  • 在SqlMapConfig.xml中就不需要對(duì)數(shù)據(jù)庫(kù)連接參數(shù)硬編碼。

  • 數(shù)據(jù)庫(kù)連接參數(shù)只配置在db.properties中:方便對(duì)參數(shù)進(jìn)行統(tǒng)1管理,其它xml可以援用該db.properties。
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=mysql


  • 在sqlMapConfig.xml加載屬性文件
<!-- 加載屬性文件 --> <properties resource="db.properties"> <!--properties中還可以配置1些屬性名和屬性值 --> <!-- <property name="jdbc.driver" value=""/> --> </properties> <!-- 和spring整合后 environments配置將廢除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務(wù)管理,事務(wù)控制由mybatis--> <transactionManager type="JDBC" /> <!-- 數(shù)據(jù)庫(kù)連接池,由mybatis管理--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>
  • properties特性:
  • 注意: MyBatis 將依照下面的順序來(lái)加載屬性:
    • 在 properties 元素體內(nèi)定義的屬性首先被讀取。
    • 然后會(huì)讀取properties 元素中resource或 url 加載的屬性,它會(huì)覆蓋已讀取的同名屬性。
    • 最后讀取parameterType傳遞的屬性,它會(huì)覆蓋已讀取的同名屬性。
  • 因此,通過(guò)parameterType傳遞的屬性具有最高優(yōu)先級(jí)resourceurl 加載的屬性次之最低優(yōu)先級(jí)的是 properties 元素體內(nèi)定義的屬性。

  • 建議:

    • 不要在properties元素體內(nèi)添加任何屬性值,只將屬性值定義在properties文件中。
    • 在properties文件中定義屬性名要有1定的特殊性,如:XXXXX.XXXXX.XXXX


settings全局參數(shù)配置
  • mybatis框架在運(yùn)行時(shí)可以調(diào)劑1些運(yùn)行參數(shù)。
  • 比如:開(kāi)啟2級(jí)緩存、開(kāi)啟延遲加載。。
  • 全局參數(shù)將會(huì)影響mybatis的運(yùn)行行動(dòng)。
  • 詳細(xì)參見(jiàn)“學(xué)習(xí)資料/mybatis-settings.xlsx”文件


typeAliases(別名)重點(diǎn)
  • 需求

    • 在mapper.xml中,定義很多的statement,statement需要parameterType指定輸入?yún)?shù)的類型、需要resultType指定輸出結(jié)果的映照類型。
    • 如果在指定類型時(shí)輸入類型全路徑,不方便進(jìn)行開(kāi)發(fā),可以針對(duì)parameterTyperesultType 指定的類型定義1些別名,在mapper.xml中通過(guò)別名定義,方便開(kāi)發(fā)。
  • mybatis默許支持的別名

別名 映照的類型
_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


  • 自定義別名
  • 單個(gè)別名定義

  • 援用別名:

  • 批量定義別名(經(jīng)常使用)

<!-- 別名定義 --> <typeAliases> <!-- 針對(duì)單個(gè)別名定義 type:類型的路徑 alias:別名 --> <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> --> <!-- 批量別名定義 指定包名,mybatis自動(dòng)掃描包中的po類,自動(dòng)定義別名,別名就是類名(首字母大寫(xiě)或小寫(xiě)都可以) --> <package name="cn.itcast.mybatis.po"/> </typeAliases>


typeHandlers(類型處理器)
  • mybatis中通過(guò)typeHandlers完成jdbc類型和java類型的轉(zhuǎn)換。
  • 通常情況下,mybatis提供的類型處理器滿足平常需要,不需要自定義
  • mybatis支持類型處理器:
類型處理器 Java類型 JDBC類型
BooleanTypeHandler Boolean,boolean 任何兼容的布爾值
ByteTypeHandler Byte,byte 任何兼容的數(shù)字或字節(jié)類型
ShortTypeHandler Short,short 任何兼容的數(shù)字或短整型
IntegerTypeHandler Integer,int 任何兼容的數(shù)字和整型
LongTypeHandler Long,long 任何兼容的數(shù)字或長(zhǎng)整型
FloatTypeHandler Float,float 任何兼容的數(shù)字或單精度浮點(diǎn)型
DoubleTypeHandler Double,double 任何兼容的數(shù)字或雙精度浮點(diǎn)型
BigDecimalTypeHandler BigDecimal 任何兼容的數(shù)字或10進(jìn)制小數(shù)類型
StringTypeHandler String CHAR和VARCHAR類型
ClobTypeHandler String CLOB和LONGVARCHAR類型
NStringTypeHandler String NVARCHAR和NCHAR類型
NClobTypeHandler String NCLOB類型
ByteArrayTypeHandler byte[] 任何兼容的字節(jié)流類型
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 任意 其他或未指定類型
EnumTypeHandler Enumeration類型 VARCHAR-任何兼容的字符串類型,作為代碼存儲(chǔ)(而不是索引)。


mappers(映照配置)
  • 通過(guò)resource加載單個(gè)映照文件,<mapper resource=" " />使用相對(duì)類路徑的資源
    • 如:<mapper resource="sqlmap/User.xml" />


  • 使用完全限定路徑<mapper url=" " />

    • 如:<mapper url="file:///D:\workspace_spingmvc\mybatis_01\config\sqlmap\User.xml" />
  • 通過(guò)mapper接口加載單個(gè)mapper

    • 規(guī)范:mapper**接口類名和mapper.xml映照文件名稱必須保持1致,且在1個(gè)package目錄中**;并且要使用mapper代理方法
<!-- 通過(guò)mapper接口加載單個(gè)映照文件需要遵守1些規(guī)范:mapper接口類名和mapper.xml映照文件名稱必須保持1致,且在1個(gè)package目錄中;并且要使用mapper代理方法--> <mapper class="cn.itcast.mybatis.mapper.UserMapper"/>


  • 批量加載mapper(推薦使用)
    • 當(dāng)指定mapper接口的包名時(shí),mybatis會(huì)自動(dòng)掃描包下邊所有mapper接口進(jìn)行加載
    • 應(yīng)遵守的1些規(guī)范:需要將mapper**接口類名和mapper.xml映照文件名稱保持1致,且在1個(gè)package目錄中;并且使用的是**mapper代理方法
<package name="cn.itcast.mybatis.mapper"/>


輸入映照

  • 通過(guò)parameterType指定輸入?yún)?shù)的類型,類型可以是簡(jiǎn)單類型、hashmap、pojo的包裝類型。
傳遞pojo的包裝對(duì)象
  • 需求:

    • 完成用戶信息的綜合查詢,需要傳入查詢條件很復(fù)雜(可能包括用戶信息、其它信息,比如商品、定單的)
  • 定義包裝類型pojo

    • 針對(duì)上邊需求,建議使用自定義的包裝類型的pojo。在包裝類型的pojo中將復(fù)雜的查詢條件包裝進(jìn)去。


  • 映照文件XXXmapper.xml設(shè)置
    • 在UserMapper.xml中定義用戶信息綜合查詢(查詢條件復(fù)雜,通太高級(jí)查詢進(jìn)行復(fù)雜關(guān)聯(lián)查詢)。

  • mapper.java

  • 測(cè)試代碼


傳遞hashmap
  • Sql映照文件定義以下:
    • #中 id 和 username是hashmap的key。
<!-- 傳遞<u>hashmap</u>綜合查詢用戶信息 --> <select id="findUserByHashmap" parameterType="hashmap" resultType="user"> select * from user where id=#{id} and username like '%${username}%' </select>


  • 測(cè)試:
Public void testFindUserByHashmap()throws Exception{ //獲得session SqlSession session = sqlSessionFactory.openSession(); //獲限mapper接口實(shí)例 UserMapper userMapper = session.getMapper(UserMapper.class); //構(gòu)造查詢條件Hashmap對(duì)象 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("id", 1); map.put("username", "管理員"); //傳遞Hashmap對(duì)象查詢用戶列表 List<User>list = userMapper.findUserByHashmap(map); //關(guān)閉session session.close(); }
  • 異常測(cè)試:
    • 傳遞的map中的key和sql中解析的key不1致。
    • 測(cè)試結(jié)果沒(méi)有報(bào)錯(cuò),只是通過(guò)key獲得值為空。


輸出映照

resultType
  • 使用resultType進(jìn)行輸出映照,只有查詢出來(lái)的列名pojo中的屬性名1致,該列才可以映照成功。

    • 如果查詢出來(lái)的列名和pojo中的屬性名全部不1致,沒(méi)有創(chuàng)建pojo對(duì)象。
    • 只要查詢出來(lái)的列名和pojo中的屬性有1個(gè)1致,就會(huì)創(chuàng)建pojo對(duì)象。
  • 輸出簡(jiǎn)單類型

  • 需求

    • 用戶信息的綜合查詢列表總數(shù),通過(guò)查詢總數(shù)和上邊用戶綜合查詢列表才可以實(shí)現(xiàn)分頁(yè)。
  • Usermapper.xml


  • Usermapper.java

  • 測(cè)試代碼

  • 小結(jié)

    • 查詢出來(lái)的結(jié)果集只有1行且1列,可使用簡(jiǎn)單類型進(jìn)行輸出映照。
  • 輸出pojo對(duì)象和pojo列表

  • 不論是輸出的pojo單個(gè)對(duì)象還是1個(gè)列表(list中包括pojo),在mapper.xml中resultType指定的類型是1樣的。
  • 在mapper.java指定的方法返回值類型不1樣:

    • 1、輸出單個(gè)pojo對(duì)象,方法返回值是單個(gè)對(duì)象類型
    • 2、輸出pojo對(duì)象list,方法返回值是List<Pojo>
  • 生成的動(dòng)態(tài)代理對(duì)象中是根據(jù)mapper方法的返回值類型肯定是調(diào)用selectOne(返回單個(gè)對(duì)象調(diào)用)還是selectList (返回集合對(duì)象調(diào)用)


resultMap
  • mybatis中使用resultMap完成高級(jí)輸出結(jié)果映照。

  • resultMap使用方法

    • 如果查詢出來(lái)的列名pojo的屬性名不1致,通過(guò)定義1個(gè)resultMap對(duì)列名和pojo屬性名之間作1個(gè)映照關(guān)系
  • 案例: 將下邊的sql使用User完成映照

    • User類中屬性名和上邊查詢列名不1致。
SELECT id id_,username username_ FROM USER WHERE id=#{value}


  • 1、在UserMapper.xml中定義resultMap

<!-- 定義resultMap 將SELECT id id_,username username_ FROM USER 和User類中的屬性作1個(gè)映照關(guān)系 type:resultMap終究映照的java對(duì)象類型,可使用別名 id:對(duì)resultMap的唯1標(biāo)識(shí) --> <resultMap type="user" id="userResultMap"> <!-- id表示查詢結(jié)果集中唯1標(biāo)識(shí) column:查詢出來(lái)的列名 property:type指定的pojo類型中的屬性名 終究resultMap對(duì)column和property作1個(gè)映照關(guān)系 (對(duì)應(yīng)關(guān)系) --> <id column="id_" property="id"/> <!-- result:對(duì)普通名映照定義 column:查詢出來(lái)的列名 property:type指定的pojo類型中的屬性名 終究resultMap對(duì)column和property作1個(gè)映照關(guān)系 (對(duì)應(yīng)關(guān)系) --> <result column="username_" property="username"/> </resultMap>



  • 2、使用resultMap作為statement的輸出映照類型
<!-- 使用resultMap進(jìn)行輸出映照 resultMap:指定定義的resultMap的id,如果這個(gè)resultMap在其它的mapper文件,前邊需要加namespace --> <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap"> SELECT id id_,username username_ FROM USER WHERE id=#{value} </select>


  • mapper.java

  • 測(cè)試

@Test public void testFindUserByIdResultMap() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //創(chuàng)建UserMapper對(duì)象,mybatis自動(dòng)生成mapper代理對(duì)象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //調(diào)用userMapper的方法 User user = userMapper.findUserByIdResultMap(1); System.out.println(user); }


  • 小結(jié)
    • 使用resultType進(jìn)行輸出映照,只有查詢出來(lái)的列名和pojo中的屬性名1致,該列才可以映照成功。
    • 如果查詢出來(lái)的列名和pojo的屬性名不1致,通過(guò)定義1個(gè)resultMap對(duì)列名和pojo屬性名之間作1個(gè)映照關(guān)系。

動(dòng)態(tài)sql

  • 甚么是動(dòng)態(tài)sql

    • mybatis核心 對(duì)sql語(yǔ)句進(jìn)行靈活操作,通過(guò)表達(dá)式進(jìn)行判斷,對(duì)sql進(jìn)行靈活拼接、組裝。
  • 需求

    • 用戶信息綜合查詢列表和用戶信息查詢列表總數(shù)這兩個(gè)statement的定義使用動(dòng)態(tài)sql。
    • 對(duì)查詢條件進(jìn)行判斷,如果輸入?yún)?shù)不為空才進(jìn)行查詢條件拼接。
  • mapper.xml


  • 測(cè)試代碼


sql片斷

  • 需求

    • 將上邊實(shí)現(xiàn)的動(dòng)態(tài)sql判斷代碼塊抽取出來(lái),組成1個(gè)sql片斷。其它的statement中就能夠援用sql片斷。方便程序員進(jìn)行開(kāi)發(fā)。
  • 定義sql片斷,在UserMapper.xml頂部

  • 援用sql片斷
    • 在mapper.xml中定義的statement中援用sql片斷:


foreach

  • 向sql傳遞數(shù)組或List,mybatis使用foreach解析

  • 需求

    • 在用戶查詢列表和查詢總數(shù)的statement中增加多個(gè)id輸入查詢。sql語(yǔ)句以下:
//兩種方法: 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<Integer> ids傳入多個(gè)id


  • 修改mapper.xml
    • 對(duì)此類型Sql語(yǔ)句:WHERE id=1 OR id=10 OR id=16
    • 在查詢條件中,查詢條件定義成1個(gè)sql片斷,需要修改sql片斷。
<sql id="query_user_where"> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex = #{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''"> and user.username LIKE '%${userCustom.username}%' </if> <if test="ids!=null"> <!-- 使用 foreach遍歷傳入ids collection:指定輸入 對(duì)象中集合屬性 item:每一個(gè)遍歷生成對(duì)象中 open:開(kāi)始遍用時(shí)拼接的串 close:結(jié)束遍用時(shí)拼接的串 separator:遍歷的兩個(gè)對(duì)象中需要拼接的串 --> <!-- 使用實(shí)現(xiàn)下邊的sql拼接: AND (id=1 OR id=10 OR id=16) --> <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or"> <!-- 每一個(gè)遍歷需要拼接的串 --> id=#{user_id} </foreach> <!-- 實(shí)現(xiàn) “ and id IN(1,10,16)”拼接 --> <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=","> 每一個(gè)遍歷需要拼接的串 #{user_id} </foreach> --> </if> </if> </sql>

  • 測(cè)試代碼

  • 在UserQueryVo中:

public class UserQueryVo { //傳入多個(gè)id private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } }


  • 對(duì)另外1個(gè)sql的實(shí)現(xiàn):
<!-- 實(shí)現(xiàn) “ and id IN(1,10,16)”拼接 --> <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=","> 每一個(gè)遍歷需要拼接的串 #{user_id} </foreach> -->
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 日本高清免费网站zzzzzzzz | 老年人一级特黄aa大片 | 亚洲图片小说综合 | 91精品日韩 | 久久综合国产 | 你操综合 | 看片在线麻豆免费 | 看亚洲a级一级毛片 | 国产精品久久久久久久久久久威 | 国产欧美综合在线 | 欧美日韩国产精品 | 亚洲高清免费视频 | 亚洲综合视频网 | 日韩一级欧美一级毛片在 | 亚洲欧美另类日韩 | 国产成人高清精品免费5388密 | 男人午夜网站 | 中文精品视频一区二区在线观看 | 精品免费视在线视频观看 | 东方aⅴ免费观看久久av | 在线婷婷 | 伊人国产在线 | 日韩欧美二区 | 美女福利视频国产免费观看 | 午夜视频免费在线播放 | 日韩久久久精品首页 | 九月婷婷天天澡天天添天天爽 | 麻豆毛片 | 一本之道无吗一二三区 | 亚洲欧美日韩精品久久亚洲区色播 | 国内成人乱小说 | 免费大黄网站在线观 | 国产成人精品免费视频大 | jzz欧美| 一区二区在线欧美日韩中文 | 久久成人性色生活片 | 三级中文字幕永久在线视频 | 亚洲在线天堂 | 成人免费的性色视频 | 国产精品久久久久天天影视 | 国产成人小视频在线观看 |