【mybatis xml】數據層框架應用–Mybatis 基於XML映射文件實現數據的CRUD

使用MyBatis框架進行持久層開發

  • MyBatis是支援普通SQL查詢,存儲過程和高級映射的優秀持久層框架。
  • MyBatis消除了幾乎所有的JDBC程式碼和參數的手工設置以及對結果集的檢索。
  • MyBatis可以使用簡單的XML或註解用於配置和原始映射,將介面和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成資料庫中的記錄。

你需要了解的知識點

1、什麼是SqlSessionFactory?

SqlSessionFactory是MyBatis框架中十分重要的對象,它是單個資料庫映射關係經過編譯後的記憶體鏡像,其主要作用是創建SqlSession。

SqlSessionFactory對象的實例可以通過SqlSessionFactoryBuilder對象來構建,而SqlSessionFactoryBuilder則可以通過XML配置文件或一個預先定義好的Configuration實例構建出SqlSessionFactory的實例

SqlSessionFactory對象是執行緒安全的,它一旦被創建,在整個應用執行期間都會存在。如果我們多次的創建同一個資料庫的SqlSessionFactory,那麼此資料庫的資源將很容易被耗盡。為此,通常每一個資料庫都會只對應一個SqlSessionFactory,所以在構建SqlSessionFactory實例時,建議使用單列模式。

2、MyBatis框架的核心配置文件

在MyBatis框架的核心配置文件中,元素是配置文件的根元素,其他元素都要在元素內配置。

3、mapper映射文件

在映射文件中,元素是映射文件的根元素,其他元素都是它的子元素。

使用

1、MyBatis下載

在Java或Java Web項目中添加MyBatis框架後,就能對數據表進行CRUD操作了。

方法一:可以從官方網站: //github.com/mybatis下載所需要的MyBatis版本。

方法二:使用maven的直接加入依賴,需要MySQL的驅動包、mybatis的驅動包

        <!--        資料庫  start-->
        <!--        引入jdbc與mysql依賴-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <!--        mybatis-->
        <!-- //mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!--        資料庫 end-->

注意這裡的mysql的驅動包,根據你自己安裝的mysql版本,使用mysql -V查詢,例如我的是8版本,所以用8版本的驅動包

2、創建實體類

在src目錄下新建com.lomtom.mybatis.entity包,並在其中創建實體類UserInfo(對應數據表user_info)。UserInfo類包含一些屬性(對應數據表user_info的部分欄位),以及與之對應的getXXX()和setXXX()方法,還可添加構造方法 。
當然你如果使用lombok可以不寫他的getter、setter以及constructor。

/**
 * @Author: LOMTOM
 * @Date: 2020/4/20
 * @Time: 15:12
 * @Email: [email protected]
 */
@Data
public class UserInfo {

    private Integer id;

    private String userName;

    private String passWord;

    private Date regDate;

}

3、創建屬性文件jdbc.properties

在resources目錄下創建屬性文件jdbc.properties,保存資料庫的連接資訊。

<properties>是一個配置屬性的元素,該元素通常用來將內部的配置外在化,即通過外部的配置來動態的替換內部定義的屬性。例如,資料庫的連接等屬性,就可以通過典型的Java屬性文件中的配置來替換,

請根據自己mysql版本,確認之後再食用

1、mysql for version 8
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaweb2?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456

2、mysql for version 5
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaweb2?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456

4、創建XML映射配置文件

resources目錄下創建MyBatis的XML配置文件mybatis-config.xml,用於載入mysql的連接配置。

<configuration>
    <!--載入屬性文件-->
    <properties resource="jdbc.properties"></properties>
    
    <!--給包中的類註冊別名,註冊後可以直接使用類名,而不用使用全限定的類名就是不用包含包名)。-->
    <typeAliases>
        <package name="com.lomtom.mybatis"/>
    </typeAliases>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/lomtom/mybatis/mapper/UserInfoMapper.xml"/>
    </mappers>
</configuration>
  1. <typeAliases>元素用於為配置文件中的Java類型設置一個簡短的名字,即設置別名。別名的設置與XML配置相關,其使用的意義在於減少全限定類名的冗餘。
    當POJO類過多時可以指定一個包名,MyBatis 會在包名下面搜索需要的 Java Bean。每一個在包 中的 Java Bean,在沒有註解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。若有註解,則別名為其註解值

  2. <environments>元素用於對環境進行配置。MyBatis的環境配置實際上就是數據源的配置,我們可以通過<environments>元素配置多種數據源,即配置多種資料庫。

5、創建SQL映射的XML文件

resources包中創建SQL映射的XML文件userInfoMapper.xml。

<mapper namespace="com.lomtom.mybatis.mapper.UserInfoMapper">
    <!--數據表 user_info的CRUD操作-->
    <insert id="addUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
        insert into user_info(userName, passWord, regDate)
        values(#{userName},#{passWord}, #{regDate})
    </insert>

    <delete id="deleteUserInfo" parameterType="int">
        delete from user_info where id = #{id}
    </delete>

    <update id="updateUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
        update user_info set userName = #{userName}, passWord = #{passWord}, regDate = #{regDate} where id = #{id}
    </update>

    <select id="getUserInfoById" parameterType="int" resultType="com.lomtom.mybatis.entity.UserInfo">
        select * from user_info where id = #{id}
    </select>

    <select id="getALLUserInfo" resultType="com.lomtom.mybatis.entity.UserInfo">
        select * from user_info
    </select>
</mapper>

在上述SQL映射文件中,

  • <insert>元素用於映射插入語句,
  • <delete>元素用於映射刪除語句,
  • <update>元素用於映射更新語句,
  • <select>元素用於映射查詢語句。

在這些元素中,id屬性設置在命名空間中唯一的標識符,用於引用這條語句。

  • parameterType屬性指定傳入這條語句的參數類的完全限定名或別名。
  • resultType屬性指定從這條語句中返回的期望類型的類的完全限定名或別名,若查詢結果是集合,則resultType的值應該是集合所包含的元素類型,而不能是集合本身。

6、創建Mapper介面

com.lomtom.mybatis.mapper包中創建UserInfoMapper.java介面,並且加入

  • testAddUserInfo()方法
  • testGetUserInfoById()方法
  • testGetAllUserInfo()方法
  • testUpdateUserInfo()方法
  • testDeleteUserInfo()方法

/**
 * @Author: LOMTOM
 * @Date: 2020/4/20
 * @Time: 15:24
 * @Email: [email protected]
 */
public interface UserInfoMapper {

    /**
     * 插入
     * @param userInfo
     * @return
     */
    int addUserInfo(UserInfo userInfo);

    /**
     * 刪除
     * @param id
     * @return
     */
    int deleteUserInfo(Integer id);

    /**
     * 獲取
     * @param id
     * @return
     */
    UserInfo getUserInfoById(Integer id);

    /**
     * 獲取全部
     * @return
     */
    List<UserInfo> getALLUserInfo();

    /**
     * 更新
     * @param userInfo
     * @return
     */
    void updateUserInfo(UserInfo userInfo);
}

7、編寫mybatis工具類


/**
 * @Author: LOMTOM
 * @Date: 2020/4/20
 * @Time: 15:49
 * @Email: [email protected]
 */
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory = null;
    static {
        try {
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory =  new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSession() {
        return sqlSessionFactory.openSession();
    }
}

8、編寫測試類

首先,需要加入必不可少的依賴

        <!--        測試-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

新建Test.java

/**
 * @Author: LOMTOM
 * @Date: 2020/4/20
 * @Time: 15:44
 * @Email: [email protected]
 */


public class MybatisTest {


    @Test
    public void testAddUserInfo(){
        SqlSession sqlSession= MybatisUtils.getSession();
        UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
        UserInfo userInfo= new UserInfo();
        userInfo.setUserName("qq小冰");
        userInfo.setPassWord("123");
        userInfo.setRegDate(new Date());
        int i= userInfoMapper.addUserInfo(userInfo);
        System. out. println (i+ " record has inserted !");
        sqlSession.commit();
        sqlSession.close();
    }


    @Test
    public void testGetUserInfoById(){
        SqlSession sqlSession= MybatisUtils.getSession();
        UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
        System.out.println(userInfoMapper.getUserInfoById(1));
        System. out. println ("record has got !");
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testGetAllUserInfo(){
        SqlSession sqlSession= MybatisUtils.getSession();
        UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
        System.out.println(userInfoMapper.getALLUserInfo());
        System. out. println ("record has got !");
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testUpdateUserInfo(){
        SqlSession sqlSession= MybatisUtils.getSession();
        UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
        UserInfo userInfo= new UserInfo();
        userInfo.setId(1);
        userInfo.setUserName("qq大冰");
        userInfo.setPassWord("123456");
        userInfo.setRegDate(new Date());
        try {
            userInfoMapper.updateUserInfo(userInfo);
            System. out. println ("record has updated !");
        }catch (Exception e){
            e.printStackTrace();
        }
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testDeleteUserInfo(){
        SqlSession sqlSession= MybatisUtils.getSession();
        UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
        int i= userInfoMapper.deleteUserInfo(1);
        System. out. println (i+ " record has deleted !");
        sqlSession.commit();
        sqlSession.close();
    }
}

你可能會出現的問題

問題一:找不到mapper映射文件

描述:

### The error may exist in com/lomtom/mybatis/mapper/UserInfoMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/lomtom/mybatis/mapper/UserInfoMapper.xml

分析: idea對目錄結構里的存放的文件類型有要求,mapper文件必須放入到resources目錄里
解決: 在pom.xml中加入資源解析,**/*.xml 代表src/main/java底下全部目錄下的全部xml文件

    <build>
        <!--        解決讀取不到main裡面的xml-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

問題二:mysql客戶端版本過低

描述:

MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client 

分析: 這是前面一直強調的mysql驅動包的,一定要根據自己的mysql版本導入相應的mysql驅動包
解決: 我的是 version 8,而我用的是5的驅動包,更改驅動包後解決

問題三:提示找不到UserInfo

描述:

### The error may exist in com/lomtom/mybatis/mapper/UserInfoMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/lomtom/mybatis/mapper/UserInfoMapper.xml'. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'UserInfo'.  Cause: java.lang.ClassNotFoundException: Cannot find class: UserInfo

分析: 這是因為找不到UserInfo類導致的,如果parameterType是UserInfo,原則上使用小寫開頭的就不會報錯,如果報錯的話需要將其路徑寫完整,即包名加類名com.lomtom.mybatis.entity.UserInfo

    <insert id="addUserInfo" parameterType="UserInfo">
        insert into user_info(userName, passWord, regDate)
        values(#{userName},#{passWord}, #{regDate})
    </insert>

解決:修改parameterType參數

    <insert id="addUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
        insert into user_info(userName, passWord, regDate)
        values(#{userName},#{passWord}, #{regDate})
    </insert>

寫在最後

你的支援是作者最大的動力

關注公眾號:博奧思園 ,精彩內容不錯失

Tags: