MyBatis從入門到不放棄(一)

在這裏插入圖片描述
MyBatis是目前java中使用最廣泛的持久層框架,之前一直使用hibernate,但是它是全自動的,對於我們來說,有些sql語句還是要自己寫的,所以MyBatis是半自動化的持久層框架。接下來,通過一篇文章來學會如何使用這個框架(還是那句話,學框架先不管什麼原理,先把它跑起來再說,然後去學習,有代碼的基礎上去理解,這樣會更加有效 個人建議,勿噴)
首先不管學習什麼框架,要先準備好配置文件、jar包。可以去官網下載mybatis框架,裏面就會一些必須的jar包,以及配置文件。下面先通過一個簡單的案例使用MyBatis連接數據庫。
配置文件如下:
SqlMappingConfig.xml(放在src下)

<?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>

    <!--配置sql打印-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!-- spring整合後 environments配置將廢除 使用spring中的連接池 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務管理 -->
            <transactionManager type="JDBC" />
            <!-- 數據庫連接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                          value="jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!--加載映射文件  這裏就是將和你實體類在一起的配置文件加載進來-->
    <mappers>
        <mapper resource="com/yxc/domain/student.xml"></mapper>
    </mappers>
</configuration>

Student.java

package com.yxc.domain;

import lombok.Getter;
import lombok.Setter;

/**
 * 有了這個註解以後就不需要手動添加getter和setter方法了
 */
@Setter@Getter
public class Student {
    private int id;
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

student.xml(文件放在和student實例類同一目錄下)

<?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="myTest1">
	<!--查詢所有
     id:去一個標識符,後面會使用
     resultTYpe:返回的是什麼類型的數據
     -->
	<select id="queryAll" resultType="com.yxc.domain.Student">
		select * from stu
	</select>
</mapper>

測試代碼

package com.yxc.test;

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;
import java.util.List;
/**
 * 測試類
 */
public class MyTest1 {
    public static void main(String[] args) throws IOException {
        //獲取一個SqlSessionFactoryBuilder對象,用來獲取SqlSessionFactory
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //加載配置文件
        InputStream in = Resources.getResourceAsStream("SqlMappingConfig.xml");
        //獲取sqlSessionFactory
        SqlSessionFactory  sqlSessionFactory= sqlSessionFactoryBuilder.build(in);
        //最終目的獲取一個數據庫操作對象sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        System.out.println(sqlSession);
        List<Object> students = sqlSession.selectList("queryByName1");//這裏的名字就是剛剛配置文件中id
        System.out.println(students);
        //關閉資源
        sqlSession.close();
    }

    }

執行結果就是將表中的所有學生信息打印出來。
我們可以發現其實基本原理還是和hibernate差不多的額,只是在少數地方變換了一下,hibernate是Session,而這邊是sqlSession。關於兩個框架的不同之處我們後面再說。學完以後再來總結一下所有的不同之處
在實體類中我們使用了@Setter@Getter,這樣我們就不需要自己寫get和set方法了,只要我們添加屬性,它就會幫我們自動生成方法,使用這個主機首先要導入jar包(lombok.jar),在Idea中開發注意一定要將工程開啓註解,否則工程是不會支持註解的,那麼這個方法也就不會起到任何作用了,在Eclipse中開發,要安裝一個插件以後導入jar包纔可以使用。如果學過hibernate那麼上面的代碼肯定一看就可以理解,當然如果沒有那麼先不急着往後看,先理清一下代碼,看看程序是怎麼個執行流程。
下面通過我們老套路,使用MyBatis實現一個用戶的增刪查改的功能。
提示一下,所有數據庫的操作第一步請把數據庫的表建立好。
實體類

package com.yxc.domain;

import lombok.Getter;
import lombok.Setter;

/**
 * 一個用戶類
 */
@Setter@Getter
public class User {
    private int id;
    private String username;
    private String password;
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

實體類對應的配置文件

<?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="CRUDByMyDatis">
    <!--在這裏面配置各種sql語句-->

    <!--添加用戶-->
    <select id="addUser" parameterType="com.yxc.domain.User">
        insert into user values(#{id},#{username},#{password})
    </select>

    <!--根據id刪除一個用戶-->
    <select id="deleteUser" parameterType="int" >
        delete from user where id=#{id}
    </select>

    <!--更新數據-->
    <select id="updateUser" parameterType="com.yxc.domain.User">
        update user set username=#{username} where id=#{id}
    </select>

    <!--根據id查詢一條用戶信息-->
    <select id="selectUser" parameterType="int" resultType="com.yxc.domain.User">
        select * from user where id=#{id}
    </select>

    <!--查詢所有用戶信息-->
    <select id="selectAll" resultType="com.yxc.domain.User">
        select * from user
    </select>

    <!--模糊查詢-->
    <select id="selectByName" parameterType="String" resultType="com.yxc.domain.User">
        select * from user where username like '%${value}%'
    </select>

</mapper>



套路,對於數據庫操作我們都喜歡寫一個工具類 原因就是對於有些東西整個工程是共享的,所以我們只要在類加載的時候加載一次就可以了。提高效率

package com.yxc.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;

/**
 * 獲取SqlSession的工具類
 */
public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory=null;
    static{
        //創建一個SqlSessionFactoryBuilder對象,用來獲取SqlSessionFactory
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
        //加載配置文件
        InputStream in = null;
        try {
            in = Resources.getResourceAsStream("SqlMappingConfig.xml");
            sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 這個靜態方法直接獲取一個sqlsession對象
     * @return
     */
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

核心配置文件(我們可以發現其實核心配置文件每一次基本不需要修改什麼,如果數據庫的信息改了,那麼我們修改一下,然後實體類資源的引入修改一下)

<?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>

    <!--配置sql打印-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!-- spring整合後 environments配置將廢除 使用spring中的連接池 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務管理 -->
            <transactionManager type="JDBC" />
            <!-- 數據庫連接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                          value="jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="Y13627037792" />
            </dataSource>
        </environment>
    </environments>
    <!--加載映射文件-->
    <mappers>
        <mapper resource="com/yxc/domain/student.xml"></mapper>
        <mapper resource="com/yxc/domain/user.xml"></mapper>
    </mappers>
</configuration>

測試類
測試類中main方法都沒有怎麼測試,這裏我們使用之前就是用過的單元測試,當然還是需要導入jar包,之後直接在方法上面貼上@Test標籤,而且在IDEA中要開啓支持註解。要執行哪一個方法,就雙擊它,右擊然後執行就可以執行本方法了。

package com.yxc.test;

import com.yxc.domain.User;
import com.yxc.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * 通過Mybatis來完成數據中的增刪查改
 */
public class CRUDByMyDatis {
    //我們這裏都是用測試方法

    @Test
    /**新增一個用戶*/
    public void testAddUser(){
        //獲取一個sqlSession對象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //給定一個要添加的用戶對象
        User user=new User();
        user.setId(5);
       user.setUsername("yyy");
        user.setPassword("555");
        sqlSession.insert("addUser",user);
        //提交事務
        sqlSession.commit();
        //關閉資源
       sqlSession.close();
    }

    @Test
    /**根據id刪除一個用戶*/
    public void deleteUser(){
        //獲取sqlSession對象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        int result = sqlSession.delete("deleteUser", 5);
        //同樣的如果操作成功,返回1
        System.out.println(result);
        //提交事務然後關閉資源
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    /**跟新一個用戶信息*/
    public void updateUser(){
        //獲取sqlSession對象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        User user=new User();
        user.setId(1);
        user.setUsername("yxc");
        int result = sqlSession.update("updateUser", user);
        System.out.println(result);
        //提交事務然後關閉資源
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    /**根據id查詢一個用戶信息*/
    public void selectOneUser(){
        //獲取sqlSession對象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //查詢
        User user = sqlSession.selectOne("selectUser", 1);
        System.out.println(user);
        //對於查詢語句來說不需要提交事務
        sqlSession.close();
    }
    /**查詢所有用戶信息*/
    @Test
    public void selectAll(){
        //獲取sqlSession對象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //查詢所有
        List<User>  allUser = sqlSession.selectList("selectAll");
        System.out.println(allUser);
        //對於查詢語句來說不需要提交事務
        sqlSession.close();
    }

    /**模糊查詢 查詢用戶名中有字母x的用戶
     * 使用這個方法只是想讓我們瞭解一下#{}和${}的區別
     * #{}是一個佔位符,${}是字符串拼接
     * #{}裏面填的可以是value值,也可以是實體類中屬性 ${}裏面只能寫value
     * */
    @Test
    public void selectByName(){
        //獲取sqlSession對象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //模糊查詢所有
        List<User>  allUser = sqlSession.selectList("selectByName","x");
        System.out.println(allUser);
        //對於查詢語句來說不需要提交事務
        sqlSession.close();
    }
}

上面就是簡單的MyBatis入門,學會如果搭建好工程環境。這樣我們在學習後面的知識的時候纔可以很好的學習,多動手實現,是最好的檢驗學習的方法。

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