日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MyBatis学习总结一

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis学习总结一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mybatis學習總結一

  • 1、Mybatis介紹
  • 2、Mybatis架構圖
    • 2.1、架構圖的意義
      • 2.1.1、JDBC編寫
      • 2.1.2、反思問題
    • 2.2、Mybatis架構圖
  • 3、入門案例
    • 3.1、下載地址以及導入jar包
    • 3.2、工程目錄
    • 3.3、創建PO類
    • 3.4、創建全局配置文件
    • 3.5、創建映射文件
    • 3.6、在全局配置文件中加載映射文件
    • 3.7、測試
    • 3.8、實驗結果
  • 4、Mybatis開發的兩種方式
    • 4.0、映射文件User.xml詳解
      • 4.0.1、mapper元素
      • 4.0.2、CRUD元素
      • 4.0.3、CRUD元素常用屬性
      • 4.0.4、#{id}與${id}的區別
    • 4.1、dao類實現CRUD
      • 4.1.0、工程目錄
      • 4.1.1、UserDao
      • 4.1.2、UserDaoImp
      • 4.1.3、User.xml
      • 4.1.3、測試Dao的CRUD
      • 4.1.4、測試結果
      • 4.1.5、log4j.properties導入及其測試結果
        • 4.1.5.1、創建log4j.properties
        • 4.1.5.1、編寫log4j.properties
        • 4.1.5.1、測試
      • 4.1.4、編寫Dao類的問題
    • 4.2、使用動態代理mapper實現CRUD
      • 4.2.0、Mapper代理的開發規范
      • 4.2.1、開發目錄
      • 4.2.2、創建UserDao
      • 4.2.3、配置mapper映射文件
      • 4.2.4、測試
      • 4.2.5、測試結果
  • 5、全局配置文件詳解
    • 5.1、properties元素
    • 5.2、settings
    • 5.3、typeAliases
      • 5.3.1、Mybatis支持的別名
      • 5.3.2、自定義別名
    • 5.4、mappers
  • 6、輸入映射與輸出映射
    • 6.1、輸入映射與簡單類型輸出映射
      • 6.1.1、簡單類型輸入
        • 映射文件
        • UserDao接口
        • 測試方法
        • 實驗結果
      • 6.1.2、POJO類型輸入
        • 映射文件
        • UserDao接口
        • 測試方法
        • 實驗結果
      • 6.1.3、POJO類型嵌套POPJ類型的輸入映射
        • User
        • UserVo
        • 映射文件
        • UserDao接口
        • 測試方法
        • 實驗結果
      • 6.1.4、Map類型的輸入映射
        • 映射文件
        • UserDao接口
        • 測試
        • 測試結果
    • 6.2、簡單類型輸入映射與輸出映射
      • 6.2.1、resultMap屬性
        • 映射文件
        • UserDao接口
        • 測試
        • 測試結果
      • 復雜輸入類型與復雜輸出類型的一個例子
        • UserVo類
        • UserDao接口
        • 映射文件
        • 測試
        • 測試結果
  • 7、動態sql
    • 7.1、動態sql介紹
    • 7.2、If標簽/where標簽
      • 映射文件
      • UserDao接口
      • 測試
      • 測試結果
    • 7.3、sql片段
        • 映射文件
    • 7.4、sql片段
    • 參考

1、Mybatis介紹

Mybatis是一個類似于Hibernate的ORM持久化框架,支持普通SQL查詢,存儲過程以及高級映射。Mybatis通過使用簡單的XML或注解用于配置和原始映射,將接口和POJO對象映射成數據庫中的記錄。

Hibernate是一個完全的ORM框架,而Mybatis是一個不完全的orm框架。Mybatis讓程序員只關注sql本身,而不需要去關注如連接的創建、statement的創建等操作。Mybatis會將輸入參數、輸出結果進行映射。

由于Mybatis是直接基于JDBC做了簡單的映射包裝,所有從性能角度來看:JDBC > Mybatis > Hibernate。


2、Mybatis架構圖

下圖來自于這里!

2.1、架構圖的意義

2.1.1、JDBC編寫

package com.csa.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.jupiter.api.Test;public class App {@Testpublic void app() throws Exception {// 加載驅動Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/mybatis";String user = "root";String password = "3306";Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;try {// 創建數據庫連接connection = DriverManager.getConnection(url, user, password);// 創建Statement對象String sql = "SELECT * FROM user WHERE username = ?";statement = connection.prepareStatement(sql);// 設置參數,下標從1開始statement.setString(1, "rose");// 執行sql,變量結果集resultSet = statement.executeQuery();while (resultSet.next()) {System.out.println("id: " + resultSet.getInt("id"));System.out.println("name: " + resultSet.getString("username"));System.out.println("age: " + resultSet.getString("age"));}} finally {// 釋放資源if (null != resultSet) {resultSet.close();}if (null != statement) {statement.close();}if (null != connection) {connection.close();}}} }

2.1.2、反思問題

JDBC這種固定的東西,完全可以用框架加以實現。因為編寫的內容都是一樣的!

差不多有以下幾個問題:

  • 在創建連接時,存在硬編碼
  • 在執行statement時存在硬編碼
  • 頻繁的開啟和關閉數據庫連接,會造成數據庫性能下降
  • 解決方案:配置xml文件來解決這些問題,使得管理起來方便、高效!

    2.2、Mybatis架構圖

    下圖來自于這里!


    3、入門案例

    3.1、下載地址以及導入jar包

    Mybatis下載地址

    別忘記連接數據庫的jar!

    3.2、工程目錄

    3.3、創建PO類

    package com.csa.po;public class User {private Integer id;private String username;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", age=" + age + "]";} }

    3.4、創建全局配置文件

    編寫SqlMapConfig.xml:

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 引入外部文件 --><properties resource="jdbc.properties"></properties><!-- 環境 --><environments default="development"><environment id="development"><transactionManager type="JDBC" /><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><!-- 加載UserMapper.xml文件 <mappers><mapper resource="User.xml"/></mappers>--> </configuration>

    3.5、創建映射文件

    編寫User.xml:

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="app"><select id="findUserById" parameterType="int" resultType="com.csa.po.User">select * from User where id = #{id}</select> </mapper>

    3.6、在全局配置文件中加載映射文件

    重新編寫SqlMapConfig.xml(在最后添加一個mappers):

    <configuration>.........<environments ...>...</environments><!-- 加載UserMapper.xml文件 --><mappers><mapper resource="User.xml"/></mappers> </configuration>

    3.7、測試

    package com.csa.app;import java.io.InputStream;import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder;import com.csa.po.User;public class App {public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調用SqlSession的增刪改查的方法User user = sqlSession.selectOne("app.findUserById",1);// 打印userSystem.out.println(user);// 關閉資源sqlSession.close();} }

    3.8、實驗結果


    4、Mybatis開發的兩種方式

    4.0、映射文件User.xml詳解

    4.0.1、mapper元素

    <mapper namespace="app">...</mapper>其中namespace是命名空間。

    4.0.2、CRUD元素

    分別是select、insert、update、delete元素。

    例如:

    <select id="findUserById" parameterType="int" resultType="com.csa.po.User">select *from User where id = #{id} </select>

    4.0.3、CRUD元素常用屬性

    CRUD元素的幾個常用屬性:

  • id:唯一,用于被程序調用
  • parameterType:參數類型,POJO類型或者基本數據類型
  • parameterMap:參數類型,一個Map集合
  • resultType:結果類型,POJO類型或者基本數據類型
  • resultMap:結果類型,一個Map集合
  • 4.0.4、#{id}與${id}的區別

    #{id}是占位符,安全

    ${id}是用于字符串連接的,不安全,會被sql注入。

    4.1、dao類實現CRUD

    4.1.0、工程目錄

    4.1.1、UserDao

    package com.csa.dao;import java.util.List; import com.csa.po.User;public interface UserDao {/*** 添加用戶 * @return 是否添加成功*/public boolean addUser(User user);/*** 刪除指定id的用戶* @param id */public boolean deleteUserById(Integer id);/*** 更新用戶信息* @param user*/public boolean updateUser(User user);/*** 通過id查找用戶* @param id* @return*/public User findUserById(Integer id);/*** 查找所有用戶* @return*/public List<User> selectUserList(); }

    4.1.2、UserDaoImp

    package com.csa.dao.imp;import java.util.List;import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory;import com.csa.dao.UserDao; import com.csa.po.User;public class UserDaoImp implements UserDao {// DI依賴注入private SqlSessionFactory sqlSessionFactory;public UserDaoImp(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}@Overridepublic boolean addUser(User user) {// 創建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調用SqlSession的增刪改查的方法int insert = sqlSession.insert("app.addUser", user);// 提交事務sqlSession.commit();// 關閉資源sqlSession.close();return insert != 0;}@Overridepublic boolean deleteUserById(Integer id) {// 創建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調用SqlSession的增刪改查的方法int delete = sqlSession.delete("app.deleteUserById", id);// 提交事務sqlSession.commit();// 關閉資源sqlSession.close();return delete != 0;}@Overridepublic boolean updateUser(User user) {// 創建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調用SqlSession的增刪改查的方法int update = sqlSession.update("app.updateUser", user);// 提交事務sqlSession.commit();// 關閉資源sqlSession.close();return update != 0;}@Overridepublic User findUserById(Integer id) {// 創建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調用SqlSession的增刪改查的方法User user = sqlSession.selectOne("app.findUserById", id);// 關閉資源sqlSession.close();return user;}@Overridepublic List<User> selectUserList() {// 創建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調用SqlSession的增刪改查的方法List<User> userList = sqlSession.selectList("app.selectUserList");// 關閉資源sqlSession.close();return userList;} }

    4.1.3、User.xml

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="app"><!-- 增加 --><insert id="addUser" parameterType="com.csa.po.User"><!-- 對于這個例子keyProperty:查找的結果放在id中order:在執行insert語句''之后(AFTER)"再執行select last_insert_id()--><selectKey keyProperty="id" resultType="int" order="AFTER">select last_insert_id()</selectKey>insert into User(username,age) values(#{username},#{age})</insert><!-- 刪除 --><delete id="deleteUserById" parameterType="int">delete from User where id=#{id}</delete><!-- 改 --><update id="updateUser" parameterType="com.csa.po.User">update User set username=#{username},age=#{age} where id like #{id}</update><!-- 查詢一個對象 --><select id="findUserById" parameterType="int" resultType="com.csa.po.User">select * from User where id = #{id}</select><!-- 查詢多個對象 --><select id="selectUserList" resultType="com.csa.po.User">select * from User</select> </mapper>

    4.1.3、測試Dao的CRUD

    package com.csa.app;import java.io.InputStream; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.csa.dao.UserDao; import com.csa.dao.imp.UserDaoImp; import com.csa.po.User;public class App {public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創建dao類UserDao userDao = new UserDaoImp(sqlSessionFactory);// 調用增刪改查方法// 1.增User user = new User();user.setUsername("hack");user.setAge(19);boolean insert = userDao.addUser(user);if(insert) {System.out.println("增加"+user+"成功");}else {System.out.println("增加失敗:"+user);}// 2.改user.setUsername("mybatis");user.setAge(0);boolean update = userDao.updateUser(user);if(update) {System.out.println("更新"+user+"成功");}else {System.out.println("更新失敗:"+user);}// 3.刪boolean delete = userDao.deleteUserById(user.getId());if(delete) {System.out.println("刪除"+user+"成功");}else {System.out.println("刪除失敗:"+user);}// 4.查// 4.1查詢單個user = userDao.findUserById(user.getId());if(user!=null) {System.out.println("查詢"+user+"成功");}else {System.out.println("查詢失敗:"+user);}// 4.2查詢所有List list = userDao.selectUserList();System.out.println(list);} }

    4.1.4、測試結果

    如果發現WARN這種結果,是因為沒有log4j.properties文件。

    4.1.5、log4j.properties導入及其測試結果

    4.1.5.1、創建log4j.properties

    4.1.5.1、編寫log4j.properties

    log4j.rootLogger=DEBUG, Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.org.apache=INFO

    4.1.5.1、測試

    4.1.4、編寫Dao類的問題

    我們發現一個問題:編寫了很多重復性的代碼,而且都是固定(模板)形式!

    解決方案:使用動態代理(Mapper)來解決!

    4.2、使用動態代理mapper實現CRUD

    4.2.0、Mapper代理的開發規范

  • mapper接口的全限定名要和mapper映射文件的namespace值一致
  • mapper接口的方法名稱要和mapper映射文件的statement的id一致
  • mapper接口的方法參數類型要和mapper映射文件的statement的parameterType的值一致,而且它的參數是一個
  • mapper接口的方法返回值類型要和mapper映射文件的statement的resultType的值一致
  • 4.2.1、開發目錄

    與上一個相比,只是少了實現類

    4.2.2、創建UserDao

    與上面一樣。

    4.2.3、配置mapper映射文件

    不同的地方就只有一處:注意看namespace屬性的不同。

    <mapper namespace="com.csa.dao.UserDao">內容與上面的一樣</mapper>

    4.2.4、測試

    不同之處也只在于這兩行:

    // 創建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 創建dao類 UserDao userDao = sqlSession.getMapper(UserDao.class);

    下面是一個完整的:

    package com.csa.app;import java.io.InputStream; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.csa.dao.UserDao; import com.csa.po.User;public class App {public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創建dao類UserDao userDao = sqlSession.getMapper(UserDao.class);// 調用增刪改查方法// 1.增User user = new User();user.setUsername("hack");user.setAge(19);boolean insert = userDao.addUser(user);if(insert) {System.out.println("增加"+user+"成功");}else {System.out.println("增加失敗:"+user);}// 2.改...// 3.刪...// 4.查// 4.1查詢單個...// 4.2查詢所有...} }

    4.2.5、測試結果


    5、全局配置文件詳解

    5.1、properties元素

    用于加載配置文件。比如<properties resource="配置文件的路徑"></properties>。使用時${屬性名}即可。

    5.2、settings



    <!--參數說明:cacheModelsEnabled:啟用或禁用SqlMapClient的所有緩存model。調試程序時使用。enhancementEnabled:啟用或禁用運行時字節碼增強,以優化訪問Java Bean屬性的性能,同時優化延遲加載的性能。lazyLoadingEnabled:啟用或禁用SqlMapClient的所有延遲加載。調試程序時使用。maxRequests:同時執行SQL語句的最大線程數。大于這個值的線程將阻塞直到另一個線程執行完成。不同的DBMS有不同的限制值,但任何數據庫都有這些限制。通常這個值應該至少是maxTransactions的10倍,并且總是大于maxSessions和maxTranactions。減小這個參數值通常能提高性能。maxSessions:同一時間內活動的最大session數。一個session可以是代碼請求的顯式session,也可以是當線程使用SqlMapClient實例(即執行一條語句)自動獲得的session。它應該總是大于或等于maxTransactions并小于maxRequests。減小這個參數值通常能減少內存使用。maxTransactions:同時進入SqlMapClient.startTransaction()的最大線程數。大于這個值的線程將阻塞直到另一個線程退出。不同的DBMS有不同的限制值,但任何數據庫都有這些限制。這個參數值應該總是小于或等于maxSessions并總是遠遠小于maxRequests。減小這個參數值通常能提高性能。useStatementNamespaces:如果啟用本屬性,必須使用全限定名來引用mapped statement。Mapped statement的全限定名由sql-map的名稱和mapped-statement的名稱合成,例如queryForObject(“sqlMapName.statementName”)--><settings cacheModelsEnabled="true"enhancementEnabled="false"lazyLoadingEnabled="false"maxRequests="3000"maxSessions="3000"maxTransactions="3000"useStatementNamespaces="false"/>

    5.3、typeAliases

    5.3.1、Mybatis支持的別名

    別名映射的類型
    _bytebyte
    _longlong
    _shortshort
    _intint
    _integerint
    _doubledouble
    _floatfloat
    _booleanboolean
    stringString
    byteByte
    longLong
    shortShort
    intInteger
    integerInteger
    doubleDouble
    floatFloat
    booleanBoolean
    dateDate
    decimalBigDecimal
    bigdecimalBigDecimal

    5.3.2、自定義別名

    <typeAliases><!--定義單個別名 --><typeAlias type="com.csa.po.User" alias="user"/><!-- 批量定義別名規則:類首字母小寫--><package name="com.csa.po"/> </typeAliases>

    5.4、mappers

    以下4種形式,加載映射文件:

    <!-- 加載UserMapper.xml文件 --> <mappers><!-- 相對路徑 --><mapper resource="User.xml"/><!-- 完全限定路徑 --><mapper url="file:///D:\Mybatis\MybatisPro2\src\User.xml"/><!-- 接口路徑 --><mapper class="com.csa.dao.UserDao"/><!-- 包路徑(常用) --><package name="com.csa.dao"/> </mappers>

    6、輸入映射與輸出映射

    6.1、輸入映射與簡單類型輸出映射

    6.1.1、簡單類型輸入

    映射文件

    <!-- 查詢對應ID的用戶名 --> <select id="findUsernameById" parameterType="int" resultType="string">select username from User where id = #{id} </select>

    UserDao接口

    /*** 通過id查找用戶名* @param id* @return 用戶名*/ public String findUsernameById(Integer id);

    測試方法

    public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創建dao類UserDao userDao = sqlSession.getMapper(UserDao.class);// 執行簡單類型的查找userDao.findUsernameById(16);System.out.println(username);// 關閉sqlSessionsqlSession.close(); }

    實驗結果

    6.1.2、POJO類型輸入

    映射文件

    <!-- 查詢符合年齡和出生月份的用戶 --> <select id="selectUsernamesByBrithday" parameterType="com.csa.po.User" resultType="string">select username from User where age=${age} and brithdayMonth=${brithdayMonth} </select>

    UserDao接口

    /*** 查找與User的同年同月生的用戶的用戶名* @param user* @return*/ public List<String> selectUsernamesByBrithday(User user);

    測試方法

    public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創建dao類UserDao userDao = sqlSession.getMapper(UserDao.class);User user = userDao.findUserById(15);System.out.println(user);List<String> usernames = userDao.selectUsernamesByBrithday(user);System.out.println(usernames);// 關閉sqlSessionsqlSession.close(); }

    實驗結果

    6.1.3、POJO類型嵌套POPJ類型的輸入映射

    User

    package com.csa.po;public class User {private Integer id;private String username;private Integer age;private Integer brithdayMonth;// set/get...@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", age=" + age + ", brithdayMonth=" + brithdayMonth + "]";} }

    UserVo

    package com.csa.po;public class UserVo {private User user;// set/get...@Overridepublic String toString() {return "UserVo [user=" + user + "]";} }

    映射文件

    <!-- POJO類型嵌套POPJ類型的輸入映射,查詢符合年齡和出生月份的用戶 --><select id="selectUserVonamesByBrithday" parameterType="com.csa.po.UserVo" resultType="string">select username from User where age=${user.age} and brithdayMonth=${user.brithdayMonth}</select>

    UserDao接口

    /*** POJO類型嵌套POPJ類型的輸入映射* 查找與UserVo的同年同月生的用戶的用戶名* @param userVo* @return*/ public List<String> selectUserVonamesByBrithday(UserVo userVo);

    測試方法

    public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創建dao類UserDao userDao = sqlSession.getMapper(UserDao.class);User user = userDao.findUserById(15);UserVo userVo = new UserVo();userVo.setUser(user);System.out.println(userVo);List<String> usernames = userDao.selectUserVonamesByBrithday(userVo);System.out.println(usernames);// 關閉sqlSessionsqlSession.close(); }

    實驗結果

    6.1.4、Map類型的輸入映射

    映射文件

    <!-- 查詢在某年某月出生的用戶的用戶名 --> <select id="findUsernamesByBrithday" parameterType="hashmap" resultType="string">select username from User where age=${age} and brithdayMonth=${brithdayMonth} </select>

    UserDao接口

    /*** 通過hashmap查詢在某年某月出生的用戶的用戶名* @param map* @return*/ public List<String> findUsernamesByBrithday(Map<String,Object> map);

    測試

    public static void main(String[] args) throws Exception {//讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創建dao類UserDao userDao = sqlSession.getMapper(UserDao.class);Map<String,Object> map = new HashMap<>();map.put("age", 12);map.put("brithdayMonth", 10);List<String> usernames = userDao.findUsernamesByBrithday(map);System.out.println(usernames);// 關閉sqlSessionsqlSession.close(); }

    測試結果

    6.2、簡單類型輸入映射與輸出映射

    6.2.1、resultMap屬性

    映射文件

    <!-- 定義一個resultMap,id唯一標識 --> <resultMap type="com.csa.po.User" id="userMap"><result column="_id" property="id"/><result column="_username" property="username"/><result column="_age" property="age"/><result column="_brithdayMonth" property="brithdayMonth"/> </resultMap><!-- 使用resultMap,通過id查詢User --> <select id="selectUserMap" parameterType="int" resultMap="userMap">select id _id,username _username,age _age,brithdayMonth _brithdayMonth from User where id=#{id} </select>

    UserDao接口

    /*** 通過id查詢User* @param id* @return*/ public User selectUserMap(Integer id);

    測試

    public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創建daoUserDao userDao = sqlSession.getMapper(UserDao.class);User user = userDao.selectUserMap(15);System.out.println(user);// 關閉sqlSessionsqlSession.close(); }

    測試結果

    復雜輸入類型與復雜輸出類型的一個例子

    輸入類型是map,輸出類型是一個UserVo。

    UserVo類

    package com.csa.po; public class UserVo {private User user;public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "UserVo [user=" + user + "]";} }

    UserDao接口

    /*** 通過map類型查找UserVo* @param map* @return*/ public List<UserVo> selectUserVosMap(Map<String,Object> map);

    映射文件

    <!-- 復雜輸入類型與復雜輸出類型的一個例子 --> <!-- resultmap --> <resultMap type="com.csa.po.UserVo" id="userVoMap"><result column="id" property="user.id"/><result column="username" property="user.username"/><result column="age" property="user.age"/><result column="brithdayMonth" property="user.brithdayMonth"/> </resultMap> <!-- 使用resultMap,查詢在某年某月出生的User并封裝到UserVo --> <select id="selectUserVosMap" parameterType="hashmap" resultMap="userVoMap">select * from User where age=#{age} and brithdayMonth=#{brithdayMonth} </select>

    測試

    public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創建daoUserDao userDao = sqlSession.getMapper(UserDao.class);Map<String,Object> map = new HashMap<>();map.put("age", 12);map.put("brithdayMonth", 10);List<UserVo> userVo = userDao.selectUserVosMap(map);System.out.println(userVo);// 關閉sqlSessionsqlSession.close(); }

    測試結果


    7、動態sql

    7.1、動態sql介紹

    在mybatis中,它提供了一些動態sql標簽,可以讓程序員更快的進行mybatis的開發,這些動態sql可以通過sql的可重用性。

    常用的動態sql標簽:if標簽、where標簽、sql片段、foreach標簽

    7.2、If標簽/where標簽

    映射文件

    <!-- 復雜輸入類型與復雜輸出類型的一個例子 --> <!-- resultmap --> <resultMap type="com.csa.po.UserVo" id="userVoMap"><result column="id" property="user.id"/><result column="username" property="user.username"/><result column="age" property="user.age"/><result column="brithdayMonth" property="user.brithdayMonth"/> </resultMap><!-- 輸入類型:UserVo輸出類型:UserVo查詢特定某年某月出生的用戶,如果這個用戶年齡和月份沒有透露完全,則根據對應的去查找--> <select id="selectUserVoList" parameterType="com.csa.po.UserVo" resultMap="userVoMap">select * from User<!-- where標簽:默認去掉后面第一個and,如果沒有參數,則把自己干掉 --><where><!-- if標簽:可以對輸入的參數進行判斷 --><!-- 與OGNL表達式類似 --><if test="user != null"><if test="user.age != null">and age=#{user.age}</if><if test="user.brithdayMonth != null">and brithdayMonth=#{brithdayMonth}</if></if></where> </select>

    UserDao接口

    /*** 查詢特定某年某月出生的用戶,如果這個用戶年齡和月份沒有透露完全,則根據對應的去查找* @param userVo* @return*/ public List<UserVo> selectUserVoList(UserVo userVo);

    測試

    public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創建daoUserDao userDao = sqlSession.getMapper(UserDao.class);User user = new User();UserVo userVo = new UserVo();user.setAge(12);userVo.setUser(user);List<UserVo> userVoList = userDao.selectUserVoList(userVo);System.out.println(userVoList);// 關閉sqlSessionsqlSession.close(); }

    測試結果

    7.3、sql片段

    映射文件

    <!-- 輸入類型:UserVo輸出類型:UserVo查詢特定某年某月出生的用戶,如果這個用戶年齡和月份沒有透露完全,則根據對應的去查找--> <select id="selectUserVoList" parameterType="com.csa.po.UserVo" resultMap="userVoMap">select * from User<include refid="whereUser"></include> </select><sql id="whereUser"><!-- where標簽:默認去掉后面第一個and,如果沒有參數,則把自己干掉 --><where><!-- if標簽:可以對輸入的參數進行判斷 --><!-- 與OGNL表達式類似 --><if test="user != null"><if test="user.age != null">and age=#{user.age}</if><if test="user.brithdayMonth != null">and brithdayMonth=#{brithdayMonth}</if></if></where> </sql>

    7.4、sql片段

    <foreach collection="迭代集合" item="迭代對象" open="()" close=")" separator=",">#{迭代對象.屬性} </foreach>

    參考

    黑馬筆記和各種博客!

    總結

    以上是生活随笔為你收集整理的MyBatis学习总结一的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。