Mybatis初體驗

概述

Mybatis是一款優秀的、基於SQL的持久層框架,封裝JDBC代碼,實現將參數映射到SQL語句並執行,最後將執行結果映射到JAVA對象並返回的功能,支持自定義SQL、存儲過程和高級映射。java

本系列文章是基於Mybatis 3.4.6 版本。mysql

建立項目

咱們使用maven來構建和管理項目,使用的IDEA開發工具來學習,這些都是目前很優秀的而且使用普遍的工具,流暢的開發體驗便於提升開發效率,按以下步驟進行:git

  • 在IDEA中點擊【file】-->【New】-->【Project...】,打開New Project窗口嚮導,以下圖:

  • 選擇Maven並勾選Create from archetype,最後選擇maven-archetype-quickstart,點擊【Next】,以下圖:

  • GroupId、ActifactId和Version是項目的maven座標,做用就是便於在maven倉庫中查找項目以供其餘項目使用。命名無要求,但應該有意義。點擊【Next】,以下圖:

  • 以上界面是對新建項目的描述信息,點擊【Next】,以下圖:

  • 注意此界面的Project Name,此處默認是上個界面定義的去掉'-'的ActifactId,此處能夠加上'-',最終以下圖:

點擊【Finish】,最終的項目結構以下:github

打開pom文件,添加相關依賴,代碼以下:sql

<!-- 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.38</version>
</dependency>

<!-- junit依賴 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<!-- log4j2依賴 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.0</version>
</dependency>

至此,項目已經建立完成,下一步開始編碼。數據庫

編碼實現

在開始編碼以前,須要先建立測試使用的表,mybatis自己是ORM框架,因此數據庫確定少不了,咱們使用的是mysql數據庫,可使用一個已有數據庫或者新建一個新庫,在此基礎上新建表,以下:apache

CREATE TABLE `sys_user` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `username` varchar(50) DEFAULT NULL COMMENT '用戶名',
  `password` varchar(50) DEFAULT NULL COMMENT '用戶密碼',
    `phone` varchar(20) DEFAULT NULL COMMENT '手機號',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用戶表';

建立完數據庫表後,咱們插入一些測試數據,以下:api

insert into sys_user(username,password,phone) 
values ('zhangsan','123456','13901234567'),
       ('lishi','123456','13901234567'),
       ('wangwu','123456','13901234567');

準備好數據庫表和測試數據後,開始編寫代碼。mybatis

  • 建立實體和映射文件

Mybatis是ORM映射框架,因此咱們須要對應建立java類,與數據庫表進行映射。app

在src/main/java下建立包:com.github.dalianghe.model,並在該包下建立數據庫sys_user表的映射類SysUser,代碼以下:

package com.github.daliang.model;

public class SysUser{
    private Long id;
    private String username;
    private String password;
    private String phone;

    // get/set

    // 重寫toString
    @Override
    public String toString() {
        return "User["+
                     "id="+this.getId()+"," +
                     "username="+this.getUsername()+
                     ",password="+this.getPassword()+
                     ",phone="+this.getPhone()
                  +"]";
    }
}

在src/mainresources下建立mappers目錄,並在其下建立SysUserMapper.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">

<mapper namespace="com.github.dalianghe.mapper.SysUserMapper">

    <select id="selectAll" resultType="SysUser">
        select id,username,password,phone from sys_user
    </select>
</mapper>

說明:

< mapper>:XML根元素,屬性namespace定義了當前XML命名空間

< select>標籤:定義select查詢sql,id屬性定義當前select查詢的惟一ID,resultType定義查詢返回類型或集合元素類型(此處使用了配置別名,詳細見Mybatis配置文件,若是不使用別名,此處應該制定類的全限定名即:com.github.dalianghe.model.SysUser)。標籤內容爲要執行的sql語句。

  • Mybatis配置文件

配置Mybatis有多種方法,本例使用XML方式進行配置,在classpass(src/main/resource)下建立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>
    <settings>
        <!-- logImpl屬性配置指定使用LOG4J輸出日誌 -->
        <setting name="logImpl" value="LOG4J2" />
    </settings>
    <!-- 別名配置,若是未配置在Mapper文件中使用是,須要使用類的全限類名 -->
    <typeAliases>
        <package name="com.github.dalianghe.model"/>
    </typeAliases>
    <!-- 配置環境,主要配置了數據庫鏈接 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC">
                <property name="" value=""/>
            </transactionManager>
            <dataSource type="UNPOOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置Mapper -->
    <mappers>
        <mapper resource="mappers/SysUserMapper.xml"/>
    </mappers>
</configuration>
  • 配置日誌

本例使用log4j2框架進行日誌輸出(所依賴的jar包已經在pom文件中進行了配置),便於咱們觀察Mybatis行爲,在classpath下新建log4j2.xml文件,並進行配置,代碼以下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
  • 編寫測試

以上代碼編寫完成,如今使用Juint編寫測試用例,代碼以下:

public class SysUserMapperTest {

    private static SqlSessionFactory sqlSessionFactory ;

    @BeforeClass
    public static void init(){
        try{
            //經過Resources工具類將mybatis配置文件讀入Reader
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            //經過SqlSessionFactoryBuilder構造類使用reader建立SqlSessionFactory對象
            //在建立SqlSessionFactory對象過程當中,首先解析mybatis-config.xml配置文件,並讀取mappers標籤配置的Mapper.xml進行解析。
            //解析以後,SqlSessionFactory包括了全部屬性和要執行的SQL
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            reader.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    @Test
    public void testSelectAll(){
        //獲取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            //經過sqlSession的selectList方法查找到id爲selectAll的方法執行sql
            //執行完後,mybatis將結果集映射爲returnType類型並返回
            List<SysUser> userList = sqlSession.selectList("selectAll");
            printUserList(userList);
        }finally {
            //關閉資源
            sqlSession.close();
        }
    }

    private void printUserList(List<SysUser> users){
        for(SysUser user : users){
            System.out.println(user.toString());
        }
    }

}

運行測試方法testSelectAll,如無問題將打印以下內容:

... ...
11:11:47.042 [main] DEBUG com.github.dalianghe.mapper.SysUserMapper.selectAll - ==>  Preparing: select id,username,password,phone from sys_user 
11:11:47.109 [main] DEBUG com.github.dalianghe.mapper.SysUserMapper.selectAll - ==> Parameters: 
11:11:47.130 [main] TRACE com.github.dalianghe.mapper.SysUserMapper.selectAll - <==    Columns: id, username, password, phone
11:11:47.130 [main] TRACE com.github.dalianghe.mapper.SysUserMapper.selectAll - <==        Row: 1, zhangsan, 123456, 13901234567
11:11:47.133 [main] TRACE com.github.dalianghe.mapper.SysUserMapper.selectAll - <==        Row: 2, lishi, 123456, 13901234567
11:11:47.133 [main] TRACE com.github.dalianghe.mapper.SysUserMapper.selectAll - <==        Row: 3, wangwu, 123456, 13901234567
11:11:47.133 [main] DEBUG com.github.dalianghe.mapper.SysUserMapper.selectAll - <==      Total: 3
User[id=1,username=zhangsan,password=123456,phone=13901234567]
User[id=2,username=lishi,password=123456,phone=13901234567]
User[id=3,username=wangwu,password=123456,phone=13901234567]
... ...

總結

本節是第一篇關於mybatis的學習,咱們體驗了下mybatis的查詢功能,後續繼續學習更多更強大的功能,本身努力、你們努力。

最後建立了qq羣方便你們交流,可掃描加入,同時也可加我qq:276420284,共同窗習、共同進步,謝謝!

相關文章
相關標籤/搜索