Mybatis入門系列01-Mybatis簡介及第一個(gè)Mybatis程序

1. 簡介

1.1 為什么使用Mybatis

java服務(wù)器需要與數(shù)據(jù)庫操作,java傳統(tǒng)的數(shù)據(jù)庫操作通過JDBC實(shí)現(xiàn)。JDBC提供了java與數(shù)據(jù)庫連接及操作的接口,但與數(shù)據(jù)庫交互時(shí)需要==編寫JDBC文件==,同時(shí)SQL語句也會出現(xiàn)在java中,導(dǎo)致==java與SQL的耦合==,為了解決這兩個(gè)問題,引入了Mybatis解決java JDBC實(shí)現(xiàn)數(shù)據(jù)庫操作帶來的問題。

1.2 什么是Mybatis

image-20201202171812129.png

MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄。

  • <font color="red">持久層框架</font>;
  • 支持自定義SQL、存儲過程和高級映射;
  • 免除JDBC代碼,設(shè)置參數(shù)及獲取結(jié)果集的工作;
  • <font color="red">XML</font>或<font color="red">注解</font>進(jìn)行配置;

1.3 持久層

易失性存儲:指存儲在內(nèi)存中,數(shù)據(jù)隨著系統(tǒng)掉電會丟失,為非持久化數(shù)據(jù)。

持久化:對應(yīng)于“易失性存儲”,將易失性存儲的數(shù)據(jù)轉(zhuǎn)變?yōu)槌志脿顟B(tài)。

為什么持久化:有些數(shù)據(jù)需要長久保存,不能斷電即失。

持久化的方式:數(shù)據(jù)庫;IO文件;...

持久層:處理持久化過程的代碼塊,實(shí)現(xiàn)持久化數(shù)據(jù)與內(nèi)存數(shù)據(jù)的相互轉(zhuǎn)化。

1.4 Mybatis的特點(diǎn)

Mybatis的作用:==幫助程序操作數(shù)據(jù)庫。==

Mybatis的特點(diǎn):

  • sql與代碼的分離,提高可維護(hù)性;
  • 提供映射標(biāo)簽,支持對象與數(shù)據(jù)庫的orm字段關(guān)系映射;
  • 提供對象關(guān)系映射標(biāo)簽,支持對象關(guān)系組建維護(hù);
  • 提供xml標(biāo)簽,支持編寫動態(tài)sql。

1.5 如何學(xué)習(xí)Mybatis

maven倉庫中查找Mybatis依賴包: https://mvnrepository.com/

Mybatis文檔:https://mybatis.org/mybatis-3/zh/index.html

2. Mybatis環(huán)境搭建與第一個(gè)Mybaits程序(基于Maven)

2.1 環(huán)境搭建

基于Maven項(xiàng)目中使用Mybatis,只需要在.pom文件中引入Mybatis對應(yīng)的包即可。

<dependencies>
    <!--java的Mysql包,用于連接Mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>
    <!--Mybatis依賴-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    <!--junit依賴,用于測試,可以使用@Tset注解實(shí)現(xiàn)模塊的測試-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

2.2 第一個(gè)Mybatis程序

一個(gè)Mybatis程序構(gòu)建完成后的示例結(jié)構(gòu)如下圖。

image-20201205121753726.png

其具體構(gòu)建步驟如下:

  • 準(zhǔn)備數(shù)據(jù)庫;

  • 新建一個(gè)maven項(xiàng)目,并在項(xiàng)目的main目錄下的resource文件夾中新建mybatis-config.xml文件,結(jié)構(gòu)如下:

    <!--文件名:mybatis-config.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>
        <!--default通過id選擇對應(yīng)的environment,即可支持不止一種環(huán)境,如dev/pub/test環(huán)境等-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/> <!-- manager默認(rèn)選擇JDBC -->
                <dataSource type="POOLED"> <!-- 數(shù)據(jù)源,即需要連接的數(shù)據(jù)庫-->
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!-- 數(shù)據(jù)庫驅(qū)動 -->
                    <!-- url,服務(wù)器地址+數(shù)據(jù)庫名稱+配置參數(shù)(useSSL(安全驗(yàn)證登錄), useUnicode(UTF統(tǒng)一編碼), characterCoding=UTF-8(UTF-8編碼,用于識別中文字符),有時(shí)還需要設(shè)置時(shí)區(qū)) -->
                    <property name="url" value="jdbc:mysql://【你的服務(wù)器地址】/【你的數(shù)據(jù)庫名】?useSSL=false&amp;useUnicode=true&amp;characterCoding=UTF-8"/>
                    <property name="username" value="[yourusername]"/> <!-- 數(shù)據(jù)庫用戶名 -->
                    <property name="password" value="[yourpasswrod]"/> <!-- 數(shù)據(jù)庫密碼 -->
                </dataSource>
            </environment>
        </environments>
    
        <!-- 項(xiàng)目中配置的Mapper對應(yīng)的xml文件 -->
        <mappers>
            <mapper resource="com/hy/dao/UserMapper.xml" /> 
        </mappers>
    </configuration>
    
  • 構(gòu)建Mybatis工具類:在utils文件夾中新建MybatisUtil.java工具類,用于讀取xml構(gòu)建sqlSession實(shí)例,作為程序與數(shù)據(jù)庫的連接。

    //文件名:MybatisUtils.java
    public class MybatisUtils {
        //新建靜態(tài)sqlSessionFactory對象,該對象只需要在項(xiàng)目初始化時(shí)生成一次;
        private static SqlSessionFactory sqlSessionFactory;
        
        static {
            try {
                //定義xml文件地址,默認(rèn)地址在resources文件夾中;
                String resource = "mybatis-config.xml";
                InputStream inputStream = null;
                //對過inputSteam流解析xml中的數(shù)據(jù)庫及項(xiàng)目信息;
                inputStream = Resources.getResourceAsStream(resource);
                //sqlSessionFactory對象由sqlSessionFactoryBuilder對象的build方法實(shí)例化;
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //定義一個(gè)getSqlSession方法來構(gòu)建一個(gè)sqlSession實(shí)例,通過sqlSessionFactory的openSession()方法實(shí)現(xiàn)。
        //sqlSession完全包含了面向數(shù)據(jù)庫執(zhí)行SQL命令所需的所有方法!
        //參數(shù)true指打開了sqlSession的自動提交,即更改數(shù)據(jù)庫后無需手動commit。
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession(true);
        }
    }
    
  • 編寫數(shù)據(jù)庫

    數(shù)據(jù)定義一般放入pojo文件夾,一般一個(gè)數(shù)據(jù)表與一個(gè)類對應(yīng),類的屬性為表中的字段,同時(shí)構(gòu)建出get/set方法,tostring方法,有參/無參構(gòu)造方法。

    //文件名:User.java
    package com.hy.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 + '\'' +
                    '}';
        }
    }
    
  • 編寫數(shù)據(jù)庫交互接口

    數(shù)據(jù)庫交互的接口一般放在dao文件夾,定義數(shù)據(jù)庫的基本操作(CRUD),一般命名為XxxMapper,定義為接口文件。

    //文件名:UserMapper.java
    public interface UserMapper {
        //獲取全部用戶;
        List<User> getUserList();
    
        //根據(jù)id查詢用戶;
        User getUserById(int id);
    
        //根據(jù)name查詢用戶;
        List<User> getUserListByName(String name);
    
        //insert一個(gè)用戶;
        void addUser(User user);
    
        //按id更新一個(gè)用戶;
        void updateUserById(User user);
    
        //按id刪除一個(gè)用戶;
        Integer deleteUserById(int id);
    
        //利用map適配查詢內(nèi)容;
        int addUserPartly(Map<String,Object> map);
    
        //模糊查詢;
        List<User> getUserLike(String value);
    }
    
  • 編寫XxxMapper.xml文件

    上一步中的接口的實(shí)現(xiàn)在此xml文件中定義,當(dāng)然也可以直接用java編寫實(shí)現(xiàn)類。而Mybatis的作用即在此步驟中,通過xml配置文件替換了java的實(shí)現(xiàn)類,免去了實(shí)現(xiàn)類中連接數(shù)據(jù)庫等基礎(chǔ)操作的代碼,簡化代碼并實(shí)現(xiàn)了java和SQL的解耦。

    <!--文件名: UserMapper.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">
    <!--namespace指向?qū)?yīng)的接口文件,需要使用全路徑的地址-->
    <mapper namespace="com.hy.dao.UserMapper">
        <select id="getUserList" resultType="com.hy.pojo.User">
            select * from db_hy.user
        </select>
    
        <!--id為對應(yīng)接口文件定義的方法-->
        <!--parameterType為傳入?yún)?shù)的類型,基本類型和String類型可省略,其他對象必須寫包的全路徑名稱-->
        <!--resultType為返回參數(shù)的類型,基本類型和String類型可省略,其他對象必須寫包的全路徑名稱-->
        <!--如果傳入或返回參數(shù)不止一個(gè),可以使用map對象傳參,也有其他方法-->
        <select id="getUserLike" parameterType="java.lang.String" resultType="com.hy.pojo.User">
            select * from db_hy.user where name like "%"#{value}"%"
        </select>
    
        <select id="getUserById" parameterType="int" resultType="com.hy.pojo.User">
            select * from db_hy.user where id = #{id}
        </select>
    
        <select id="getUserListByName" parameterType="String" resultType="com.hy.pojo.User">
            select * from db_hy.user where name = #{name}
        </select>
    
        <insert id="addUser" parameterType="com.hy.pojo.User">
            insert into db_hy.user (id,name,pwd) values (#{id}, #{name}, #{pwd})
        </insert>
    
        <!--通過map對象,可以自定義傳入的內(nèi)容, -->
        <insert id="addUserPartly" parameterType="map">
            insert into db_hy.user (id,name,pwd) values (#{userid}, #{userName}, #{passWORD})
        </insert>
    
        <update id="updateUserById" parameterType="com.hy.pojo.User">
            update db_hy.user set name=#{name}, pwd=#{pwd} where id=#{id}
        </update>
    
        <delete id="deleteUserById" parameterType="int">
            delete from db_hy.user where id=#{id}
        </delete>
    </mapper>
    
  • 將Mapper.xml引入項(xiàng)目

    要使上一步中的Mapper.xml文件在項(xiàng)目中起作用,需要將xml文件引入項(xiàng)目。具體實(shí)現(xiàn)分為2步。

    首先,需要將該文件引入mybatis的核心配置文件中,即引入mybatis-config.xml文件中。

    image-20201205122248564.png

其次,需要在maven中將xml文件所在地址定義為maven搜索配置文件掃描的地址,否則maven在編譯程序時(shí)不會讀取該文件。

<dependencies>
  <!-- xxx -->
</dependencies>
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>

        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>

        </resource>
    </resources>
</build>
  • 編寫測試類進(jìn)行測試

    在test文件夾中新建對應(yīng)接口文件相同位置的建立對應(yīng)的測試類,測試測試方法驗(yàn)證。

    //文件名: UserMapperTest.java
    public class UserMapperTest {
    
        @Test
        public void test(){
          //新建sqlSession連接。
            SqlSession sqlSession = MybatisUtils.getSqlSession();
    
            try{
                //通過sqlSession的getMapper方法獲取UserMapper對象;
                //該對象就是對應(yīng)UserMapper接口的實(shí)例化對象。
                UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
                //UserMapper對象可以直接使用接口定義的方法,方法的實(shí)現(xiàn)來自Mapper.xml配置文件。
                List<User> userList = userMapper.getUserList();
    
                for (User user : userList) {
                    System.out.println(user);
                }
            } finally {
                //測試完畢要記得關(guān)閉連接,釋放內(nèi)存。
                sqlSession.close();
                System.out.println("=====================");
            }
    
        }
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容