MyBatis連接數據庫實現增刪改查

一、MyBatis簡介

MyBatis是一種基於SQL語法的開源項目,它能夠將SQL語句封裝在配置文件中,便於統一的管理和維護,能夠降低代碼的耦合度,且方便的代碼調試。下面直接進入MyBatis的環境搭建。

二、MyBatis環境搭建

打開idea後,首先要配置jar文件,我們所需要的jar文件有如下幾個,將其添加到Modules中的Dependencies中。添加完後不要忘記將Problems的提示Fix掉。
在這裏插入圖片描述
添加完jar文件,再把Tomcat配置一下。
在這裏插入圖片描述
配置完成後下面進入文件的配置。

三、配置Mybatis文件

首先建兩個文件夾,一個是resources,將其類型設置成Resources,裏面放一些配置文件;另一個是test文件夾,將其類型設置成Tests,裏面放一些測試類。如圖所示,在Modules中設置。

在這裏插入圖片描述
在resources文件夾中需要建三個文件,一個是db.propertites,裏面是連接數據庫的地址和用戶名密碼,和jdbc的數據庫配置文件一樣(這裏可以不進行配置,可以在mybatis文件夾中配置也是可以的);一個是log4j.properties文件,用於保存日誌;還有一個是mybatis.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="db.properties">
    </properties>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <typeAliases>
        <typeAlias type="cn.kgc.entity.Provider" alias="provider"/>
        <typeAlias type="cn.kgc.entity.User" alias="user"/>
    </typeAliases>
    <environments default="dev">
    <environment id="dev">
        <transactionManager type="JDBC"></transactionManager>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${user}"/>
            <property name="password" value="${pwd}"/>
        </dataSource>
    </environment>
</environments>
<mappers>
    <mapper resource="cn/kgc/dao/ProviderMapper.xml"/>
    <mapper resource="cn/kgc/dao/UserMapper.xml"/>
</mappers>
</configuration>

xml頭基本上都是一致的;
properties裏放置的是數據庫配置文件;
settings中設置的是log4j日誌;
typeAliases中是取別名,便於後面導入類名的時候提供方便;
environment中前四行都是一致的,下面的數據庫配置中name的參數是固定的,value的值與db.properties保持一致;
mappers中是引入的DAO層-SQL層的映射文件,這個文件要在會放在dao層進行配置,下面會提到映射文件的配置。
這樣MyBatis配置文件就設置ok了。

四、實現DAO層與SQL層連接

在src文件夾中新建UserMapper接口和UserMapper.xml文件放在dao文件中;UserMapper接口中放要實現的功能方法,這裏直接上較爲複雜的多個參數的方法;
我們先從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">

這個文件頭和mybatis.xml不同之處是將mybatis.xml中的config及configuration替換成mapper;

<!--namespace指定關聯的接口-->
<mapper namespace="cn.kgc.dao.UserMapper">
    <select id="getUserCNT" resultType="int">
    <!--id對應接口的方法名-->
    select count(1) from tb_user_info;
</select>
</mapper>

下面重點提兩個比較複雜的;
一個是帶有兩個相同數據類型的參數的方法;
下面這個是.xml文件中的語句:

<select id="queryUserByNameAndPwd" resultType="user" parameterType="java.lang.String">
    select * from tb_user_info where uname=#{name} and password=#{pwd};
</select>

這裏的id是UserMapper中的方法名,resultType是之前使用typeAliases取的別名就等於是 cn.kgc.dao.UserMapper,paramterType是參數的類型;
下面是UserMapper中的方法名:

User queryUserByNameAndPwd(@Param("name") String name,@Param("pwd") String pwd);

由於方法的參數是兩個String類型,所以參數必須要用@Param註解來聲明參數,然後sql語句的引用要用#{}的形式;
還有一個是不同數據類型參數的方法;
下面這個是.xml文件中的語句:

<select id="queryTest" resultType="user" parameterMap="idAndName">
select * from tb_user_info where uname=#{name} and uid=#{id};
</select>
<parameterMap id="idAndName" type="Object">
    <parameter property="id" javaType="int"/>
    <parameter property="name" javaType="string"/>
</parameterMap>

下面是UserMapper中的方法名:

User queryTest(@Param("name") String name,@Param("id") int id);

不同參數類型,.xml文件中要用parameterMap來取一個數據類型的別名,然後在對此進行分別設置,type類型選擇Object;

五、測試類Test

在進行使用Junit進行測試之前,爲了防止代碼的耦合,爲mybatis中讀取配置文件創建SqlSession對象的方便調用,這裏直接採用提取方法的方式;先建一個util包,裏面建一個工具類MapperConfig類;

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 java.io.IOException;
import java.io.InputStream;
public class MapperConfig {
    private static SqlSessionFactory factory;
    static {
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        try {
            InputStream is= Resources.getResourceAsStream("mybatis-cfg.xml");
            factory=builder.build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSession(){
        //非事務情況下,開啓自動提交
        return  factory.openSession(true);
    }
    public static void closeSession(SqlSession session){
        if(session!=null){
            session.close();
        }
    }
}

爲了防止多個線程同時對系統同時操作,這裏採用單例模式,使用靜態代碼塊來創建工廠;
每一個類的導入要正確
主要有兩個方法:一個是獲取SqlSession的session對象,還有一個就是關閉session;
接下來就可以直接使用Junit進行測試:

import cn.kgc.entity.User;
import cn.kgc.util.MapperConfig;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;
import java.io.IOException;
public class UserMapperTest {
    Logger logger=Logger.getLogger(UserMapperTest.class);
@Test
public void queryUserByNameAndPwd() {
    SqlSession session=MapperConfig.getSession();
    User user=session.getMapper(UserMapper.class).queryUserByNameAndPwd("admin","admin");
    logger.info(user);
    MapperConfig.closeSession(session);
}
}

這裏面使用Logger來打印信息,同時保存日誌;

六、結束語

這裏只走了一遍流程,只實現了一個簡單的查詢功能,下面的增刪改應該都難不倒小夥伴們吧;後面搭配上Tomcat與web進行連接和使用jdbc連接基本一致,這裏就不多做介紹,相信你們jdbc已經練習的滾瓜爛熟了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章