MyBatis——MyBatis開發流程


創建項目(IDEA中)

  在IDEA中創建 MyBatis項目,詳細流程如下:

  這里有一點需要注意,我們創建的是Maven項目,如果大家以前沒有配置過Maven環境的話,在創建完項目之后,需要配置一下Maven環境,否則就無法成功導入相關的依賴包。

  創建完成后的項目是這個樣子的:

項目概述:

  ★ src目錄就是我們項目的開發目錄,里面有兩個目錄:main和test。

  ➷ main目錄是我們開發項目的目錄,里面是項目的幾乎所有信息,包括Java的類文件、一些properties配置文件和MyBatis配置文件等。

  ✈ main目錄下有兩個文件夾:Java和resources,顧名思義,Java目錄下肯定就是Java類文件了;resources目錄下放的的是配置文件。

  ➷ test目錄是我們項目開發的測試目錄,我們在這個目錄下來寫我們的測試類,來測試我們所寫的功能是否能夠正常運作。

  ✄ 還有一個pom.xml文件,這個文件是我們所創建的Maven項目的依賴導入配置文件,我們在這個配置文件中寫上項目所需要依賴的包的相關信息,Maven會替我們自動導入項目,不用我們主動下載並添加依賴包,這樣能極大的減輕我們的工作量。

  其他文件我們不用過多關注,都是一些項目配置信息,一般很少用到。

 


導入依賴(配置pom文件)

我們需要導入的項目依賴主要由以下幾個:

  ① MyBatis核心依賴

  ② MySql驅動依賴

  ③ 日志依賴:Log4J

  ④ 測試依賴:junit

  ⑤ 連接池依賴

  這些都是項目基礎的依賴配置,后面根據項目需求可添加其他的依賴項,比如:分頁組件依賴等。

  我們是在pom.xml文件中配置的,在pom.xml文件中的project標簽中加入下面的信息:

<!-- 導入依賴 -->
<dependencies>
    <!--MyBatis核心依賴-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>

    <!--MySql驅動依賴-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.25</version>
    </dependency>

    <!-- 日志依賴:Log4J -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <!-- 測試依賴:junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    <!-- 連接池依賴:阿里的druid(可選其他,目前這個是比較好的) -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.16</version>
    </dependency>

</dependencies>

  我這里選用的連接池是阿里的druid連接池,目前來說應該是比較好的連接池了,大家可根據自己的需求自行調整,更換其他的連接池。

  依賴的版本之間可能存在沖突現象,大家可選擇普遍都用的版本,可參考Maven存儲庫

 


創建並編寫MyBatis配置文件(mybatis-config.xml)

  在resources目錄下創建『mybatis-config.xml』配置文件,這個文件就是我們MyBatis項目的配置文件,之后我們也要通過它來創建SqlSessionFactory對象,因一步來創建SqlSession對象。

『mybatis-config.xml』初始模板:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!--配置標簽的順序:(properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)-->


</configuration>

  我們是在configuration標簽中添加我們的配置項的,配置項是有順序的,必須依照官方給的順序從上往下依次放置,否則會導致一些問題,比如配置失效等。

數據庫配置信息(jdbc.properties)

  MyBatis要和數據庫打交道,那肯定需要連接數據庫了,所以,我們現在要配置的就是數據庫信息。

  首先,在resources目錄下創建『jdbc.properties』配置文件,這個是數據庫配置文件,在里面添加如下信息:

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/{數據庫名}?useUnicode=true&characterEncoding=utf-8
jdbc.username={用戶名} jdbc.password={密碼}

  大家根據自己的信息,替換配置中的{XXX}。上面這個是MySQL的連接配置,如果大家連接的是其他數據庫的話,可更該此配置中的信息。

  然后,我們需要『mybatis-config.xml』的configuration標簽中配置相關信息:

<configuration>

    <!-- 導入外部的參數 -->
    <properties resource="jdbc.properties"></properties>

    <!--核心配置信息-->
    <environments default="ss_config">
        <!--數據庫相關配置-->
        <environment id="ss_config">
            <!--事務控制類型-->
            <transactionManager type="jdbc"></transactionManager>
            <!--數據庫連接配置-->
            <dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory">
                <property name="driver" value="${jdbc.driver}"/>
                <!-- &轉義&amp; -->
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

</configuration>

  我們導入了jdbc的配置文件,然后在environments標簽項中配置相關信息,default屬性和id屬性可根據自己意願填寫(其實就是個名字而已),我們在這選用的是MyBatis默認的連接池,dataSource 標簽的type屬性就是,之后我們可選擇更改性能更好的連接池。

  其他的配置信息應和上述配置一致。

日志配置信息(log4j.properties)

  我們之前已經導入了Log4j日志框架的依賴,這個日志框架可以幫我們輸出日志信息,以便我們更好的調試可開發項目。我們還需要做的是編寫一個日志配置文件,填寫相關配置信息。

  在resources目錄下創建『log4j.properties』配置文件,注意名稱是全小寫的,在其內添加如下信息:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

  好了,日志配置已完成,MyBatis會自動檢索配置信息。

 


創建表(數據庫表)

  在剛才『jdbc.properties』配置文件中所填的數據庫中創建數據表,我們在這以users表為例:

CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `password` varchar(50) DEFAULT '12345', `sex` varchar(1) DEFAULT NULL, `birthday` datetime DEFAULT NULL, `registtime` datetime DEFAULT NULL, PRIMARY KEY (`id`) )DEFAULT CHARSET=utf8;

  創建成功后,在表中添加一些信息,如:

 


創建實體映射(entity實體)

  好了,我們需要創建一個實體,來對應數據庫中的表中的數據項。

  在java目錄下創建com.entity實體類包,在包中創建User實體類:

  User實體類的屬性要和數據表的字段對應,類型和名字要相同,最好使用駝峰命名法,因為當MyBatis從數據庫中得到數據后時進行set注入的,就是調用對應屬性名字的set方法進行賦值,如果屬性名字不一致,MyBatis就無法找到其set方法,其值會為默認值。

  當名字不一致時我們的解決方法是:Sql語句加別名 或者 添加關系映射(推薦使用)。

  例如下面的User實體的最后一個屬性名就和數據表的最后一個字段名不一致,我們在后面會進行處理。

User實體類如下:

package com.entity; import java.util.Date; public class User { private Integer id; private String name; private String password; private String sex; private Date birthday; private Date registTime; public User() {} public User(Integer id, String name, String password, String sex, Date birthday, Date registTime) { this.id = id; this.name = name; this.password = password; this.sex = sex; this.birthday = birthday; this.registTime = registTime; } @Override public String toString() { return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                ", registTime=" + registTime +
                '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public Date getRegistTime() { return registTime; } public void setRegistTime(Date registTime) { this.registTime = registTime; } }

定義別名

  我們還需要在MyBatis配置文件『mybatis-config.xml』中為我們的實體類定義別名,這樣我們就不用總帶着包名一起來書寫了,可以提高我們的書寫效率。

  定義別名有兩種方式,一般我們選擇第二種:

<!-- 實體類別名 -->
<typeAliases>
    <!-- 方式一:單獨定義-->
    <!--<typeAlias type="com.entity.User" alias="user_shine"/>-->
    
    <!-- 方式二:定義實體類所在的package,每個實體類都會自動注冊一個別名=類名 -->
    <package name="com.entity"/>
</typeAliases>

  在『mybatis-config.xml』的configuration標簽內的properties標簽后面添加上述配置信息。

 


創建Dao層

  接下來我們要編寫數據訪問層了,也就是DAO層。

  在java目錄下創建一個包:com.Dao。

創建xxDao接口文件

  在剛才所創建的包內創建User實體類所對應的Dao接口文件:UserDao.java。

  在這個接口文件中,定義我們要對數據進行的操作方法,如:

package com.Dao; import com.entity.User; import org.apache.ibatis.annotations.Param; import java.util.List; public interface UserDao { // 查詢全部
    public List<User> queryAll(); // 通過id查詢
    public User selectUserById(@Param("id") Integer id); // 模糊查詢
    public List<User> selectUserByKeyword(@Param("keyword") String keyword); // 插入
    public Integer insertUser(User user); // 刪除
    public Integer deleteUser(@Param("id") Integer id); // 修改
    public Integer updateUser(User user); }

  在上面的方法中涉及到參數的傳遞,也就是參數綁定方式,常見的參數綁定方式有:

    ➷ 序號參數綁定

    ➷ 注解參數綁定(推薦)

    ➷ Map參數綁定

    ➷ 對象參數綁定

  我們上面所用的就是注解參數綁定,因為篇幅考慮,就不做過多闡述了。

創建xxDaoMapper.xml配置文件

  創建了上面的這些方法,如何去實現它們呢?

  這就要靠我們的Mapper配置文件了,一個Dao接口文件對應一個Mapper配置文件。MyBatis替我們封裝了數據訪問的其他操作,我們只需要關注Sql語句本身就可以了,而Sql語句寫在哪呢?就是Mappe配置文件中。

  在com.Dao包中創建Mapper配置:UserDaoMapper.xml。

 


配置xxDaoMapper.xml

下面是Mapper文件的初始模板:

<?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="com.dao.UserDao">


</mapper>

  mapper標簽中的namespace屬性是我們這個Mapper文件所對應的Dao接口文件,mapper標簽中書寫Dao接口中每個方法所對應的Sql語句。

  上面的Dao接口所對應的完整Mapper配置如下:

<?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="com.Dao.UserDao">

<resultMap id="UserResultMap" type="com.entity.User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="password" column="password"/>
    <result property="sex" column="sex"/>
    <result property="birthday" column="birthday" />
    <result property="registTime" column="registtime" />
</resultMap>

<sql id="user_field"> select id, name, password,sex,birthday,registtime from s_user where </sql>

<select id="queryAll" resultType="User"> select * from s_user </select>

<select id="selectUserById" resultMap="UserResultMap">
    <include refid="user_field"/> id = #{id} </select>

<select id="selectUserByKeyword" resultMap="UserResultMap">
    <include refid="user_field"/> name like concat('%',#{keyword},'%') </select>

<insert id="insertUser" parameterType="User">
    <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> insert into s_user values(#{id},#{name},#{password},#{sex},#{birthday},#{registTime}) </insert>

<delete id="deleteUser" parameterType="int"> delete from s_user where id=#{id} </delete>

<update id="updateUser" parameterType="User"> update s_user set name=#{name},password=#{password},sex=#{sex},birthday=#{birthday}, registtime=#{registTime} where id=#{id} </update>


</mapper>

  resultMap 標簽就是我們上面提到的屬性關系映射,來解決字段名不一致的問題,當我們需要用的時候,將select標簽的resultType屬性改為resultMap就可以了。

  每種操作有對應的標簽,id就是其方法名,后面是傳遞的值類型。

注冊Mapper

  寫完Mapper后,是需要注冊的,在『mybatis-config.xml』的configuration標簽內添加如下信息:

<!-- 注冊mapper文件 -->
<mappers>
    <mapper resource="com/Dao/UserDaoMapper.xml"/>
</mappers>

  注冊成功后,MyBatis才會去尋找這個配置文件

配置編譯路徑

  此時這個配置文件,MyBatis是找不到的,為什么呢?因為MyBatis只會自動查找resources目錄下的配置文件,而我們的Mapper配置文件並不在resources目錄下。那如何解決呢?

  我們需要在pom.xml文件的project標簽中添加如下信息:

<build>
    <!-- 更改maven編譯規則 -->
    <resources>
        <resource>
            <!-- 資源目錄 -->
            <directory>src/main/java</directory>
            <includes>
                <include>*.xml</include><!-- 默認(新添加自定義則失效) -->
                <include>**/*.xml</include><!-- 新添加 */代表1級目錄 **/代表多級目錄 -->
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

  自此,Mapper配置才會生效。

 


編寫工具類

  MyBatis的核心是SqlSessionFactoryBuider、SqlSessionFactory和SqlSession對象,三者依次為創建關系,最終我們要得到的是SqlSession對象,通過SqlSession對象來進項數據的訪問,但每次訪問時都需要編寫創建SqlSession對象的這一系列過程,完成后又要反向依次關閉,使得代碼有很多的重復。

  因此,我們可以編寫一個工具類,幫我們同一來完成這些操作,每次訪問數據時調用工具類來獲取SqlSession對象,完成后用工具類統一來關閉對象。

  在java目錄下創建一個工具包:com.Utils。

  在包中創建工具類:MyBatisUtils.java。

MyBatisUtils.java 詳細信息如下:

package com.Utils; 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; /** * 1. 加載配置 * 2. 創建SqlSessionFactory * 3. 創建Session * 4. 事務管理 * 5. Mapper獲取 */
public class MyBatisUtils { // 獲取SqlSessionFactory
    private static SqlSessionFactory factory; //創建ThreadLocal綁定當前線程中的SqlSession對象
    private static final ThreadLocal<SqlSession> t1 = new ThreadLocal<SqlSession>(); //加載配置信息,並構建session工廠
    static{ try { InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); factory = new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { e.printStackTrace(); } } // 獲取連接(從 t1 中獲取當前線程SqlSession)
    private static SqlSession openSession(){ SqlSession session = t1.get(); if (session == null){ session = factory.openSession(); t1.set(session); } return session; } // 獲取連接(新創建的)
    public static SqlSession getSession(){ return factory.openSession(); } // 釋放連接(釋放當前線程中的SqlSession)
    public static void closeSession(){ SqlSession sqlSession = t1.get(); sqlSession.close(); } // 提交事務(提交當前線程中的SqlSession所管理的事務)
    public static void commit(){ SqlSession sqlSession = openSession(); sqlSession.commit(); closeSession(); } // 回滾事務(回滾當前線程中SqlSession所管理的事務)
    public static void rollback(){ SqlSession sqlSession = openSession(); sqlSession.rollback(); closeSession(); } // 獲取接口實現類對象
    public static <T> T getMapper(Class<T> mapper){ SqlSession sqlSession = openSession(); return sqlSession.getMapper(mapper); } }

 


編寫測試類

  在test目錄下的java目錄下創建測試類包:com.Test,並創建測試類test.java。

編寫測試類:

package com.Test; import com.Utils.MyBatisUtils; import com.Dao.UserDao; import com.entity.User; import org.junit.Before; import java.util.Date; import java.util.List; public class Test { UserDao userDao; @Before public void init(){ userDao = MyBatisUtils.getMapper(UserDao.class); } // 測試查詢全部
 @org.junit.Test public void TestQueryAll(){ List<User> users = userDao.queryAll(); for (User user : users) { System.out.println(user); } } // 測試通過id查詢
 @org.junit.Test public void TestselectUserById(){ User user = userDao.selectUserById(2); System.out.println(user); } // 測試模糊查詢
 @org.junit.Test public void TestselectUserByKeyword(){ List<User> users = userDao.selectUserByKeyword("明"); for (User user : users) { System.out.println(user); } } // 測試插入
 @org.junit.Test public void TestinsertUser(){ User user = new User(null, "辰東", "123472", "男", new Date(), new Date()); userDao.insertUser(user); MyBatisUtils.commit(); System.out.println("剛插入的用戶id為:" + user.getId()); } // 測試刪除
 @org.junit.Test public void TestdeleteUser(){ userDao.deleteUser(15); MyBatisUtils.commit(); } // 測試修改
 @org.junit.Test public void TestupdateUser(){ User user = new User(14, "辰南", "888888", "男", new Date(), new Date()); userDao.updateUser(user); MyBatisUtils.commit(); } }

運行TestQueryAll方法,結果如下:

  一個簡單的MyBatis項目搭建完畢。除了上述的這些點之外,還有許多的知識點,如緩存、動態SQL、注解、級聯等等,后面有時間了,我會進一步整理。

  感謝大家的耐心閱讀,如有不足,請多多指教!☺

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM