天天最資訊丨mybatis 初探

2022-12-20 18:13:38 來源:51CTO博客

Mybatis

我的環境

jdk1.8mysql 8.0.23maven 3.8.4IDEA
                        mysql            mysql-connector-java            8.0.11                            org.mybatis            mybatis            3.4.6                            junit            junit            4.12                                                    src/main/resources                                    **/*.properties                    **/*.xml                                true                                        src/main/java                                    **/*.properties                    **/*.xml                                true                        

mybatis-config.xml


(相關資料圖)

                                                                                                                                            
D:\Java_IDE\apache-maven-3.8.4\maven-repo

環境:

jdk 1.8Mysql 5.7maven 3.6.1IDEA

回顧

JDBCMysqljava基礎Mavenjunit

SSM框架:配置文件的,最好方式

1、簡介

1.1、什么是mybatis

一款優秀的持久層框架支持定制化SQL,存儲過程及高級映射避免了幾乎所有的JDBC代碼和手動參數以及獲取結果集。MyBatis可以使用簡單的XML或注解來配置和映射原生類型、接口和Java的POJO()為數據庫中的記錄MyBatis本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation遷移到了google code,并且改名為MyBatis。2013年11月遷移到Github。

如何獲取Mybatis

Maven倉庫GitHub中文文檔

1.2、持久化

數據持久化●持久化就是將程序的數據在持久狀態和瞬時狀態轉化的過程●內存:斷電即失●數據庫(Jdbc), io文件持久化。●生活:冷藏.罐頭。為什么需要需要持久化?****●有一些對象,不能讓他丟掉。●內存太貴了

1.3、持久層

Dao層,Service層 ,Controller層...●完成持久化工作的代碼塊●層界限十分明顯。

1.4、為什么需要mybatis

●幫助程序猿將數據存入到數據庫中。方便●傳統的JDBC代碼太復雜了。簡化。框架。自動化。●不用Mybatis也可以。更容易.上手。技術沒有高低之分●優點:。簡單易學。靈活。sq|和代碼的分離,提高了可維護性。。提供映射標簽,支持對象與數據庫的orm字段關系映射。提供對象關系映射標簽,支持對象關系組建維護。提供xml標簽,支持編寫動態sql。

最重要的一點:使用的人多!

2、第一個Mybatis程序

2.1、搭建環境

新建數據庫

                    mysql            mysql-connector-java            5.1.35                            org.mybatis            mybatis            3.5.2                            junit            junit            4.11            

2.2、創建一個模塊

                                                                                                                            

編寫mybatis工具類

public class MybatisUtils {    private static SqlSessionFactory sqlSessionFactory;    static {        try {            //1、 獲取SqlSessionFactory對象            String resource = "mybatis-config.xml";            InputStream inputStream = Resources.getResourceAsStream(resource);           sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        } catch (IOException e) {            e.printStackTrace();        }    }    //既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實例。    // SqlSession 提供了在數據庫執行 SQL 命令所需的所有方法。你可以通過 SqlSession 實例來直接執行已映射的 SQL 語句    public static SqlSession getSqlSession(){        SqlSession sqlSession = sqlSessionFactory.openSession();        return sqlSession;    }}

2.3、編寫代碼

實體類
package com.mink.pojo;public class User {    private  int id;    private String name;    private String pwd;    public User() {    }    public User(int id, String name, String pwd) {        this.id = id;        this.name = name;        this.pwd = pwd;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPwd() {        return pwd;    }    public void setPwd(String pwd) {        this.pwd = pwd;    }    @Override    public String toString() {        return "User{" +                "id=" + id +                ", name="" + name + "\"" +                ", pwd="" + pwd + "\"" +                "}";    }}
dao接口
public interface UserDao {    List getUserList();}
接口實現類 由原來的UserDaoImpl轉變為一個UserMapper配置文件
    

2.4、測試

注意點:

org.apache.ibatis.binding.BindingException: Type interface com.mink.dao.UserDao is not known to the MapperRegistry.

junit測試

3、CRUD

1、namespace

namespace中的包名要和Dao/mapper接口的包名一致

2、select

選擇查詢語句

id:就是namespace中的方法名resultType:SQL語句執行的返回值parameterType="int" 參數類型
注意增刪改需要提交事務

3、insert

4、update

5、delete

6、分析錯誤

標簽不要匹配錯 resource 綁定 路徑用com/mink/pojo///程序配置文件必須符合規范NullPointerException,沒有注冊到資源!輸出的xml文件中出現中文亂碼maven資源沒有導出問題

7、萬能的map

假設我們的實體類 或數據表中,字段或參數過多,考慮使用map

int addUser2(Map map);
        insert into mybatis.user (id,name ,pwd)values (#{userid},#{username},#{password})    
@Test    public void addUser2Test2(){        SqlSession sqlSession = MybatisUtils.getSqlSession();        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        Map map = new HashMap();        map.put("userid",7);        map.put("username","map");        map.put("password","");        mapper.addUser2(map);        sqlSession.commit();        sqlSession.close();    }

Map傳遞參數,直接在sq|中取出key即可!對象傳遞參數,直接在sq|中取對象的屬性即可!

只有一個基本類型的情況下,可直接在sql中取到

多個參數用map或者注解

8、思考題

模糊查詢怎么寫?

Java代碼執行的時候,傳遞通配符% %
List like = mapper.getUserLike("%m%");
2.在sql拼接中使用通配符!

4、配置解析

1、核心配置文件

configuration(配置)??properties(屬性)????settings(設置)????typeAliases(類型別名)????typeHandlers(類型處理器)????objectFactory(對象工廠)????plugins(插件)??environments(環境配置)environment(環境變量)transactionManager(事務管理器)dataSource(數據源)??databaseIdProvider(數據庫廠商標識)????mappers(映射器)??

2、環境配置

MyBatis可以配置成適應多種環境不過要記住:盡管可以配置多個環境,但每個SqlSessionFactory實例只能選擇-種環境。學會使用配置多套運行環境!Mybatis默認的事務管理器就是JDBC,連接池: POOLED

3、屬性

我們可以通過properties屬性來實現引用配置文件這些屬性都是可外部配置且可動態替換的,既可以在典型的Java屬性文件中配置,亦可通過properties元素的子元素來傳遞。db.properties

driver=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&;serverTimezone=UTC&;useSSL=trueuser=rootpwd=admin

在核心配置文件中映入

可以直接引入外部文件可以在其中增加一些屬性配置如果兩個文件有同-一個字段,優先使用外部配置文件的! .

4、類型別名(typeAliases)

類型別名是為Java類型設置一個短的名字。存在的意義僅在于用來減少類完全限定名的冗余。

            

也可以指定一個包名 ,MyBatis 會在包名下面搜索需要的Java Bean,比如:掃描實體類的包,它的默認別名就為這個類的名,首字母小寫!

                    

在實體類比較少的時候,使用第一種方式。如果實體類十分多,建議使用第二_種。第一種可以DIY別名,第二種則.不行 如果非要改,需要在實體.上增加注解

@Alias("user")public class User {

5、設置

p7

6、其他配置

●typeHandlers (類型處理器)●objectFactory_ (對象工廠)●plugins插件。mybatis-generator-core。mybatis-plus。通用mapper

7、映射器(mappers)

MapperRegistry:注冊綁定我們的Mapper文件;

方式一
      
方式三
      

注意點:●接口和他的Mapper配置文件必須同名!●接口和他的Mapper配置文件必須在同一個包下!

方式四
  

注意點:●接口和他的Mapper配置文件必須同名!●接口和他的Mapper配置文件必須在同一個包下!

8、生命周期

生命周期,和作用域,是至關重要的,因為錯誤的使用會導致非常嚴重的并發問題。

SqlSessionFactoryBuilder:

●一-旦創建了SqlSessionFactory, 就不再需要它了●局部變量

SqlSessionFactory:

●說白了就是可以想象為:數據庫連接池.●SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創建另一個實例。

●因此SqlSessionFactory的最佳作用域是應用作用域。●最簡單的就是使用單例模式或者靜態單例模式。

SqlSession

●連接到連接池的一一個請求!●SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。●用完之后需要趕緊關閉,否則資源被占用!

這里面的每一個Mapper, 就代表一個具體的業務!

5、解決屬性名和字段名不一致的問題

1、問題

public class User {    private  int id;    private String name;    private String password;

實體類與數據庫名字不匹配,

查詢出來為null值

1、起別名

2、在UserMapper文件中的sql語句 resultType 改為 resultMap

新建resultMap標簽

??resultMap?? 元素是 MyBatis 中最重要最強大的元素。ResultMap 的設計思想是,對簡單的語句做到零配置,對于復雜一點的語句,只需要描述語句之間的關系就行了。

6、日志

6.1、日志工廠

如果一個數據庫操作,出現了異常,我們需要排錯。日志就是最好的助手!曾經: sout、debug現在:日志工廠!

logImpl 可選的值有:

SLF4JLOG4J【掌握】LOG4J2JDK_LOGGINGCOMMONS_LOGGINGSTDOUT_LOGGING【掌握】NO_LOGGING,或者是實現了接口 ??org.apache.ibatis.logging.Log?? 的,且構造方法是以字符串為參數的類的完全限定名。

STDOUT_LOGGING標準日志輸出

標簽: 配置文件 生命周期 單例模式

上一篇:要聞速遞:Android平臺GB28181設備接入模塊分辨率發生變化怎么辦?
下一篇:全球簡訊:keepalived實現業務高可用