1. 程式人生 > >mybatis 基礎詳解

mybatis 基礎詳解

batis 添加用戶 主鍵 actor cor @override iba 基本功 ide

轉 https://www.cnblogs.com/Mr-Kenson/p/8124680.html

mybatis 是一個開源的 用於對數據庫操作的框架, 讀者基本都大體了解其基本功能, 我就不多解釋了 直接上demo吧。

我用的是maven管理包, 如下

技術分享圖片
<dependencies>
        <dependency>
            <groupId>org.springFramework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.7</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>3.3.1</version>
        </dependency>
    </dependencies>
技術分享圖片

如果不是用的maven管理包, 也可以找下列包進行導入, 一下是javaWeb項目的目錄結構,在這裏我主要是用maven來做,其實都一樣的。

技術分享圖片

導好包之後呢,我們就要開始做mybatis項目了。

-- 1:在src下寫入配置文件sqlMapConfig.xml,可以參照下方 

技術分享圖片
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!-- 屬性定義
    加載一個properties文件
    在 properties標簽 中配置屬性值
     -->
    <properties resource="db.properties">
        <!-- <property name="" value=""/> -->
    </properties>
    
    <!-- 定義 別名 -->
    <typeAliases>
        <!--
        單個別名的定義
        alias:別名,type:別名映射的類型  -->
        <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
        <!-- 批量別名定義
        指定包路徑,自動掃描包下邊的pojo,定義別名,別名默認為類名(首字母小寫或大寫)
         -->
        <package name="cn.itcast.mybatis.po"/>
        
    </typeAliases>
    
    <!-- 和spring整合後 environments配置將廢除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事務管理-->
            <transactionManager type="JDBC" />
        <!-- 數據庫連接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    
    <!--加載mapper映射
    如果將和spring整合後,可以使用整合包中提供的mapper掃描器,此處的mappers不用配置了。
     -->
    <mappers>
        <!-- 通過resource引用mapper的映射文件 -->
        <mapper resource="sqlmap/User.xml" />
        <!-- <mapper resource="mapper/UserMapper.xml" /> -->
        <!-- 通過class引用mapper接口 
        class:配置mapper接口全限定名
        要求:需要mapper.xml和mapper.java同名並且在一個目錄 中
        -->
        <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->
        <!-- 批量mapper配置 
        通過package進行自動掃描包下邊的mapper接口,
        要求:需要mapper.xml和mapper.java同名並且在一個目錄 中
        
        -->
        <package name="cn.itcast.mybatis.mapper"/>
        
        
    </mappers>
    
    
</configuration>
技術分享圖片

-- 2: 配置完sqlMapConfig之後我們就先把實體類弄好吧。 src下創建一個實體類

技術分享圖片
import java.util.Date;

public class User {
    private Integer id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    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 String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
                + address + "]";
    }
    
    
}
技術分享圖片

-- 3: 然後我們就開始寫映射文件了

技術分享圖片
<?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 命名空間為了對sql進行隔離, 方便管理 後面 這個屬性值有其他的作用 -->
<mapper namespace="test">
    <!-- id 唯一標識 標識一個statement 我們將select、 insert... 稱為statement #{id} : 標識一個占位符 
        如果#{}要傳入一個簡單類型(基本類型), {}中的值 任意 parameterType : 是參數的類型 通過#{} 來接受ParamterType輸入參數 
        resultType: 結果類型: 指定映射的單條記錄 javabean 類型 -->
    <select id="findUserById" parameterType="int"
        resultType="com.weibang.mybatis.beans.User">
        SELECT * FROM user WHERE id=#{id}
    </select>

    <!-- 根據用戶名模糊稱來查詢數據 ${} 標識sql的的拼接, 通過這個東西修飾的, 會不加任何修飾拼接在sql中 -->
    <select id="findUserByName" parameterType="String"
        resultType="com.weibang.mybatis.beans.User">
        SELECT * FROM user WHERE username LIKE ‘%${value}%‘
    </select>

    <!-- 添加用戶 接受簡單參數(基本類型)的時候 名字隨意, 接受引用類型的時候,名字要與javabean類型一致 -->
    <insert id="InsertUser" parameterType="com.weibang.mybatis.beans.User">
        <!-- 需求: User 對象插入到數據中之後, 新記錄的主鍵要通過User對象返回,通過user獲取主鍵值 裏面定義了獲取主鍵的sql, 
            當 Insert語句執行完之後,就會執行selectKey中的東西,就能獲取自增的主鍵 order:用來確定什麽時候進行獲取主鍵 兩個值, 一個befer 
            一個after keyProperty: 要將主鍵值付給哪個屬性 resultType: SELECT LAST_INSERT_ID() 的結果類型 
            為int 所以填int就可以了 -->
        <selectKey keyProperty="id" order="AFTER" resultType="int">
            SELECT
            LAST_INSERT_ID()
        </selectKey>
        INSERT INTO user (username,birthday,sex,address)
        VALUES(#{username},#{birthday},#{sex},#{address})
    </insert>
    <!-- mysql 的UUID生成主鍵 <insert id="InsertUser" parameterType="com.weibang.mybatis.beans.User"> 
        <selectKey keyProperty="id" order="AFTER" resultType="String"> SELECT UUID() 
        </selectKey> INSERT INTO user (username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) 
        </insert> -->
    <!-- 用戶刪除 -->
    <delete id="deleteUser" parameterType="int">
        delete from user where id
        = #{id}
    </delete>
    <!-- 用戶更新 要求: 要求傳入的user中必須要包括一個id 如果沒有id 那麽就全部更新了 -->
    <update id="updateUser" parameterType="com.weibang.mybatis.beans.User">
        update user set
        username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
        where id = #{id}
    </update>
</mapper>
技術分享圖片

-- 4: 映射文件寫好了之後, 我們其實就可以進行測試了, 我們這裏用的是junit測試

技術分享圖片
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

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 org.junit.Before;
import org.junit.Test;

import com.weibang.mybatis.beans.User;

public class First_test {
    private SqlSessionFactory sqlsessionFactory;
     
    // 創建會話工廠
    @Before
    public void init() throws IOException {
        // 創建會話工廠
        // 配置文件(sqlMapConfig.xml)
        String resource = "SqlMapConfig.xml";
        // 將配置文件加載到輸入流中
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 創建會話工廠
        sqlsessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    
    @Test
    public void testFindById() {
        // 通過sqlsessionFactory來創建sqlsession
        SqlSession sqlsession = sqlsessionFactory.openSession();
        // 第一個參數: statement的位置,等於namespace+statement的ID
        // 第二個參數: 傳入的參數
        User user = null;
        try {
             user= sqlsession.selectOne("test.findUserById", 1);
            
        }catch(Exception e) {
            e.printStackTrace();
        } 
        finally {
            // 關閉sqlsession
            sqlsession.close();
        }
        System.out.println(user);
        
    }
    
    /**測試: 根據名字模糊查詢*/
    @Test
    public void testFindByName()throws Exception {
        SqlSession sqlsession = sqlsessionFactory.openSession();
        List<User> user = null;
        try {
            user = sqlsession.selectList("test.findUserByName", "小明");
        }catch(Exception e) {
            e.printStackTrace();
        } 
        finally {
            sqlsession.close();        
            }
        System.out.println(user);
    }
    
    /**
     * mybatis 插入 並且獲取插入的主鍵值
     */
    
    @Test
    public void testInsertUser() {
        SqlSession sqlsession = sqlsessionFactory.openSession();
        User user = new User();
        user.setUsername("kenson2");
        user.setBirthday(new Date());
        user.setSex("1");
        user.setAddress("江西南昌");
        int a = 0;
        try {
            a= sqlsession.insert("test.InsertUser", user);
            
        }catch(Exception e) {
            e.printStackTrace();
        } 
        finally {
            sqlsession.commit();
            sqlsession.close();        
            }
        System.out.println("受影響的行數:"+a);
        System.out.println("返回的主鍵值 "+user.getId());
    }
    /**
     * 測試  根據id刪除用戶
     */
    @Test
    public void testDelete() {
        SqlSession sqlsession = sqlsessionFactory.openSession();
        int row=0;
        try {
            row =sqlsession.delete("test.deleteUser", 31);
            sqlsession.commit();
        } catch (Exception e) {
            // TODO: handle exception
        }finally {
            sqlsession.close();
        }
        System.out.println("已經刪除的行數:"+row);
    }
    /**
     * 測試更新操作
     */
    @Test
    public void testUpdate() {
        SqlSession sqlsession = sqlsessionFactory.openSession();
        User user = new User();
        user.setId(32);
        user.setUsername("kangcheng");
        user.setBirthday(new Date());
        user.setSex("1");
        user.setAddress("福建");
        int row =0;
        try {
             row= sqlsession.update("test.updateUser", user);
             sqlsession.commit();
        } catch (Exception e) {
            // TODO: handle exception
        }finally {
            sqlsession.close();
        }
        System.out.println("已經更新了:"+row+"行");
    }
    
    
}
技術分享圖片

OK 到這裏 我們mybatis的簡單增刪查改就已經完成了, 對了 數據庫要自己建表哦。

mybatis 基礎詳解