mybatis入門概述

Mybatis框架

1.入門

1.1簡述mybatis

mybatis是一個持久成框架,簡化了我們與數據庫的交互。使我們只需要關注sql語句本身,而不需要花費精力取處理加載驅動、創建連接、創建statement等繁雜的過程。

1.2瞭解mybatis

  • mybatis通過xml或註解的方式將要執行的各種statement配置起來.
  • 通過對象和statement中的sql的動態參數進行映射生成最終的sql語句
  • mybatis框架執行sql並將結果映射爲java對象並返回。
  • 是通過ORM思想實現了結果集的封裝。

1.3回顧JDBC

  • 註冊驅動
  • 獲取數據庫連接對象
  • 定義Mysql語句
  • 獲取執行Mysql
  • 執行
  • 處理結果
  • 釋放資源
import java.sql.*;

/**
 *添加一條記錄
 */
public class JDBCdemo03 {

    public static void main(String[] args) {
        Connection conn =null;
        Statement statement=null;
        try {
            //註冊驅動
            Class.forName("com.mysql.cj.jdbc.Driver");
            //定義sql
            String sql = "insert into cat(name ,age ,id ) values ('湯姆',18,1003)";
            //獲取數據庫連接對象
            try {
                 conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/hello?serverTimezone=UTC", "root", "990801lxq");
                //獲取sql執行對象
                statement = conn.createStatement();
                //執行sql
                int i = statement.executeUpdate(sql);
                if(i>0){
                    System.out.println("添加成功"+"/t"+"共有"+i+"語句受到影響");
                }else {
                    System.out.println("添加失敗");
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(statement !=null){
                try {
                    statement.cancel();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


1.4搭建環境

  • 創建表
CREATE TABLE `user`  (
  `id` int(20) NOT NULL,
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `pwd` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '湯姆', '12354');
INSERT INTO `user` VALUES (2, '喬恩', '123');
INSERT INTO `user` VALUES (3, '張三', '123');
INSERT INTO `user` VALUES (5, '類鱷類', '12345');

  • 新建maven項目

  • 導入依賴

    • ​ 主要的依賴
    <!--        mysql依賴-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.6</version>
            </depe
    
    • 可以增加的依賴
    <!--        junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
            </dependency>
    
    <!--        log4j-->
            <!-- https://mvnrepository.com/artifact/log4j/log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    
    
    • 找不到配置文件的依賴
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
        </build>
       
    
  • 配置環境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核心配置文件-->
<configuration>
<!-- 	環境配置 環境可以有多套 default="環境id"-->
    <environments default="development">
        <environment id="development">
			<!-- 	配置事務類型-->
            <transactionManager type="JDBC"/>
            <!-- 	配置數據源-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="990801lxq"/>
            </dataSource>
        </environment>
    </environments>

</configuration>
  • 編寫pojo
package cn.guoke.pojo;

import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
    private String pwd;


}

這個是需要get set 方法的 爲了省事使用了lombok

lombok的座標

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <scope>provided</scope>
        </dependency>

  • 編寫UserMapper接口
package cn.guoke.dao;

import cn.guoke.pojo.User;

import java.util.List;

public interface UserMapper {
	
    //獲取所有的user
    List<User> getUserList();
}

  • 編寫對應的UserMapper.xml

    <?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.guoke.dao.UserMapper">
        <select id="getUserList" resultType="cn.guoke.pojo.User">
        select * from User where 1=1
      </select>
       
    </mapper>
    
    • namespace 對應UserMapper的接口
    • namespace對應接口中編寫的方法、
    • resultType返回值類型
  • 在編寫完UserMapper.xml後我們要在mybatis-config.xml對其經行映射

        <mappers>
            <mapper resource="cn/guoke/dao/UserMapper.xml"/>
        </mappers>
    

    有四種映射的方式:

    • resource:使用相對於類路徑的資源引用
    • url:使用完全限定資源定位符(URL
    • class:使用映射器接口實現類的完全限定類名
    • name:將包內的映射器接口實現全部註冊爲映射器

其他用法及注意點

這樣我們的環境就搭建完成了

2.CRUD

我們要使用mybatis需要一個SqlSessionFactory 實例。

每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的實例爲核心的。

SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得。

而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預先配置的 Configuration 實例來構建出 SqlSessionFactory 實例。

2.1直接獲取SqlSessionFactory

package cn.guoke.dao;


import cn.guoke.pojo.User;
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.Test;

import java.io.InputStream;
import java.util.List;


public class UserMapperTest {

    @Test
    public void test01() throws Exception {
        /**
         * 1.讀取配置文件
         * 2.創建SqlSessionFactory 工廠
         * 3.使用工廠產生SqlSession對象
         * 4.使用SqlSession創建Dao接口的代理對象
         * 5.使用代理對象執行方法
         * 6.釋放資源
         */

        //1.
        InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
        //2.
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(input);
        //3.
        SqlSession sqlSession = factory.openSession();
        //4
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //5.
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        //6.
        sqlSession.close();
        input.close();


    }
}

2.2編寫工具類

我們看到每次測試的時候我們都需要獲取一個SqlSession

我們可以編寫一個工具類,來方便測試

package cn.guoke.utils;

import cn.guoke.dao.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionException;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionUtils {
    private static SqlSessionFactory factory;
    static {

        try {
            InputStream  input = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            factory = builder.build(input);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static SqlSession getSqlSession(){
        return   factory.openSession();
    }

}

測試:

 @Test
    public void test2(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();

        for (User user : userList) {
            System.out.println(user);
        }

        sqlSession.close();

    }

2.3 CRUD使用xml實現

  • 在UserMapper中增加CRUD的方法
package cn.guoke.dao;

import cn.guoke.pojo.User;

import java.util.List;

public interface UserMapper {

    //獲取所有的user
    List<User> getUserList();

    //根據ID查詢用戶
    User getUserID(int id);

    //增加一個用戶
    int addUser(User user);

    //修改一個用戶
    int intoUser(int id);

    //刪除一個用戶
    int delUser(int id);
}

  • 編寫UserMapper.xml

    <?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.guoke.dao.UserMapper">
        <select id="getUserList" resultType="cn.guoke.pojo.User">
        select * from User where 1=1
      </select>
    
        <select id="getUserID" resultType="cn.guoke.pojo.User" parameterType="int">
            select  * from USER where id=#{id}
        </select>
    
        <insert id="addUser" parameterType="cn.guoke.pojo.User">
            insert into mybatis.user (id,name,pwd) value (#{id},#{name},#{pwd});
        </insert>
    
        <update id="intoUser" parameterType="cn.guoke.pojo.User">
            update user set name=#{name},pwd=#{pwd} where id=#{id};
        </update>
    
        <delete id="delUser" parameterType="int">
            delete from user where id = #{id}
        </delete>
    
    </mapper>
    
  • parameterType 傳遞參數的數據類型

    • #{id} 用來傳遞參數

2.4使用註解看配置

  • 配置mappers
    <mappers>
        <mapper class="guoke.dao.UserMapper"/>
    </mappers>
  • 使用註解
package guoke.dao;


import guoke.pojo.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserMapper {

    //獲取所有的user
    @Select("select * from User")
    List<User> getUserList();
}

2.5模糊查詢

  • 在接口中增加一個發法
    //模糊查詢
    List<User> getUserByName(String name);

  • 測試
    public void test4(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userByName = mapper.getUserByName("%張%");
        for (User user : userByName) {
            System.out.println(user);
        }
        sqlSession.close();
    }

除去上述方法,含可以在xml中配置

    <select id="getUserByName" resultType="cn.guoke.pojo.User" parameterType="String">
        select * from USER where name like  '%${value}%'
    </select>

2.6使用聚合函數

和上述一樣定義接口返回就可以了

3.mybatis參數

3.1parameterType

  • 傳遞簡單類型
  • 傳遞pojo對象
  • 傳遞pojo包裝對象

3.2resultType

  • 簡單類型
  • pojo對象
  • pojo列表

3.3resultMap

    <resultMap id="UserMap" type="cn.guoke.pojo.User">
<!--        主鍵使用id-->
        <id property="user" column="id"></id>
<!--        其他字段-->
        <result property="username" column="name"/>
    </resultMap>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章