1. 程式人生 > 實用技巧 >MyBatis入門01

MyBatis入門01

MyBatis入門

一、下載地址

GitHub:
https://github.com/mybatis/mybatis-3/releases
Maven:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version
> </dependency>

二、入門級別程式案例

1、建立Java工程,匯入mybatis基本jar包與資料庫驅動

asm-7.1.jar
cglib-3.3.0.jar
commons-logging-1.2.jar
javassist-3.27.0-GA.jar
log4j-1.2.17.jar
log4j-api-2.13.3.jar
log4j-core-2.13.3.jar
mybatis-3.5.5.jar
mysql-connector-java-8.0.16.jar
ognl-3.2.14.jar
slf4j-api-1.7.30.jar
slf4j-log4j12-1.7.30.jar

2、src下建立sqlMapConfig.xml配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC 
"-//mybatis.org//DTD Config 3.0//EN" 
"mybatis-3-config.dtd" >
<configuration>
    <!-- 和spring整合後 environments配置將廢除 -->
    <environments default="development">
        <environment 
id="development"> <!-- 使用jdbc事務管理 --> <transactionManager type="JDBC" /> <!-- 資料庫連線池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&amp;useUnicode=true&amp;useSSL=false&amp;serverTimezone=UTC" /> <property name="username" value="root" /> <property name="password" value="1234" /> </dataSource> </environment> </environments> <!-- 引入實體對應的對映檔案 --> <mappers> <mapper resource="entity/User.xml"/> </mappers> </configuration>

log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# 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

資料表

對應的實體類

package entity;

import java.util.Date;

//mybatis使用得POJO實體類
public class User {

    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    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 Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getAddress() {
        return Address;
    }
    public void setAddress(String address) {
        Address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", Address="
                + Address + "]";
    }
    
    
}

Mabatis與實體類對應的配置檔案

<?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="test">
    <select id="queryUserById" parameterType="int" resultType="entity.User">
        select * from user where id=#{id}
    </select>
    
    <select id="userList" parameterType="string" resultType="entity.User">
        select * from user where username like'%${value}%'
    </select>
    
    <insert id="addUser" parameterType="entity.User">
        <selectKey  keyProperty="id" resultType="int" order="AFTER"  >
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(username,birthday,sex,Address) 
        values(#{username},#{birthday},#{sex},#{Address})
    </insert>
    
    <update id="updateUser" parameterType="entity.User">
    update user set username=#{username} where id=#{id}
    </update>
    
    <delete id="rmUser" parameterType="int">
        delete from user where id=#{id}
    </delete>
</mapper>

junit測試類

import static org.junit.Assert.*;

import java.io.InputStream;
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.Test;

import entity.User;

public class MytaitsTest {

    //查詢單個結果
    @Test
    public void fun1() throws Exception {
        //讀取配置檔案
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //構建sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //開啟session
        SqlSession session = sqlSessionFactory.openSession();
        
        User user = session.selectOne("test.queryUserById", 10);
        
        System.out.println(user);
        
        //關閉session
        session.close();
    }
    
    //查詢多個結果
    @Test
    public void fun2() throws Exception {
        //讀取配置檔案
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //構建sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //開啟session
        SqlSession session = sqlSessionFactory.openSession();
        
        List<User> list = session.selectList("test.userList", "王");
        
        for (User user : list) {
            System.out.println(user);
        }
        
        //關閉session
        session.close();
    }
    
    //插入資料
    @Test
    public void fun3() throws Exception {
        //讀取配置檔案
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //構建sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //開啟session
        SqlSession session = sqlSessionFactory.openSession();
        
        User user = new User();
        user.setUsername("張三");
        user.setBirthday(new Date());
        user.setAddress("北京");
        user.setSex("男");
        int num = session.insert("test.addUser", user);
        if(num==1) {
            System.out.println("成功新增資料");
            System.out.println("新插入資料的ID:"+user.getId());
        }
        
        //如果不提交事務,則不會新增進資料庫
        session.commit();
        //關閉session
        session.close();
    }
    
        //修改資料
        @Test
        public void fun4() throws Exception {
            //讀取配置檔案
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //構建sqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //開啟session
            SqlSession session = sqlSessionFactory.openSession();
            
            User user = new User();
            user.setUsername("張1");
            user.setId(29);
            int num = session.update("test.updateUser", user);
            if(num==1) {
                System.out.println("修改成功");                
            }
            
            //如果不提交事務,則不會新增進資料庫
            session.commit();
            
            //關閉session
            session.close();
        }
        
        
        //刪除使用者
        @Test
        public void fun5() throws Exception {
            //讀取配置檔案
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //構建sqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //開啟session
            SqlSession session = sqlSessionFactory.openSession();
            
            
            
            int num = session.delete("test.rmUser", 25);
            if(num==1) {
                System.out.println("刪除成功");                
            }
            
            //如果不提交事務,則不會新增進資料庫
            session.commit();
            
            //關閉session
            session.close();
        }
}

說明

一、流程

  1、Mybatis核心sqlMapConfig.xml配置檔案的配置

  2、實體類的Mapper 及上面User.xml的建立

  3、在sqlMapConfig引入POJO類對應的XML對映檔案

核心基礎程式碼

引數說明:

  param1:配置檔案中的 namespace.id

  param2:sql語句需要的引數

 //讀取配置檔案
            InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            //構建sqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //開啟session
            SqlSession session = sqlSessionFactory.openSession();
            
            
            //此處操作DB
            //session.selectOne("test.queryUserById", 10);
            //session.selectList("test.userList", "王");
            //session.insert("test.addUser", user);
            //session.update("test.updateUser", user);
            //session.delete("test.rmUser", 25);
            
            //如果不提交事務,則不會新增進資料庫
            session.commit();
            
            //關閉session
            session.close();        

使用Mapper動態代理的方式

Mapper介面開發方法只需要程式設計師編寫Mapper介面(相當於Dao介面),
由Mybatis框架根據介面定義建立介面的動態代理物件,代理物件的方法體同上邊Dao介面實現類方法。 Mapper介面開發需要遵循以下規範:4個相同 1、 Mapper.xml檔案中的namespace與mapper介面的類路徑相同。 2、 Mapper介面方法名和Mapper.xml中定義的每個statement的id相同 3、 Mapper介面方法的輸入引數型別和mapper.xml中定義的每個sql 的parameterType的型別相同 4、 Mapper介面方法的輸出引數型別和mapper.xml中定義的每個sql的resultType的型別相同

UserMapper.xml

補充說明: #{}為插值表示式,${}為字串拼接

不同版本的Insert返回的ID有區別,有的是設定 keyColumn=”id‘’ 有的是設定resultType="int"

<?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要與介面的全路徑相同 -->
<mapper namespace="mapper.UserMapper">
    <select id="findUserById" parameterType="int" resultType="entity.User">
        select * from user where id=#{id}
    </select>
    
    <select id="findUserByStr" parameterType="string" resultType="entity.User">
        select * from user where username like "%"#{str}"%"
    </select>
    
    <insert id="addUser" parameterType="entity.User">
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(username,birthday,sex,address) 
        values(#{username},#{birthday},#{sex},#{address})
    </insert>
    
    <update id="updateUser" parameterType="entity.User">
        update user set username=#{username},address=#{address},sex=#{sex} where id=#{id}
    </update>
    
    <delete id="rmUser" parameterType="int" >
        delete from user where id=#{id}
    </delete>
</mapper>

UserMapper.java

package mapper;

import java.util.List;

import entity.User;

public interface UserMapper {
    
    /**
     *根據id獲取單個使用者
     * @param id
     * @return
     */
    public User findUserById(int id);
    
    
    /**
     * @param str 模糊查詢,輸入需要查詢的字元
     * @return 返回查詢的user集合
     */
    public List<User> findUserByStr(String str);
    
    /**
     * 會將加入的主鍵返回賦值給User物件
     * @param user 新增使用者物件
     * @return 返回新增筆數
     */
    public int addUser(User user);
    
    /**
     * @param user  更新的User物件
     * @return 返回更新的筆數
     */
    public int updateUser(User user);
    
    /**
     * 根據id刪除使用者
     * @param id
     * @return 刪除筆數
     */
    public int rmUser(int id);
}

測試類

package mapperTest;

import java.io.IOException;
import java.io.InputStream;
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 entity.User;
import mapper.UserMapper;

public class MapperTest {

    SqlSessionFactory sqlSessionFactory=null;
    //在測試前的準備項,初始化sqlSessionFactory
    @Before
    public void setMybatis() throws IOException {
        //獲取配置檔案
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //建立sessionFactory
        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);        
    }
    
    //測試查詢一個
    @Test
    public void func1() {
        
        //開啟session
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        //讓mabatis為我們建立介面的代理物件
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //執行查詢方法  方法名就是配置檔案中的id
        User user = mapper.findUserById(28);
        
        System.out.println(user);
        
        sqlSession.close();
    
    }
    
    /**
     * 測試模糊查詢多個使用者
     */
    @Test
    public void func2() {
        
        //開啟session
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        //讓mabatis為我們建立介面的代理物件
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //執行查詢方法  方法名就是配置檔案中的id
         List<User> list = mapper.findUserByStr("王");
        
        for (User user : list) {
            System.out.println(user);
        }
        
        sqlSession.close();
    
    }
    
    /**
     * 測試插入資料
     */
    @Test
    public void func3() {
        
        //開啟session
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        //讓mabatis為我們建立介面的代理物件
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //執行查詢方法  方法名就是配置檔案中的id
         User user = new User();
         user.setUsername("李四");
         user.setAddress("上海");
         user.setBirthday(new Date());
         user.setSex("男");
         int num = mapper.addUser(user);
        System.out.println("成功插入:"+num+"筆資料:------------");
        System.out.println("新插入的使用者的主鍵ID是:"+user.getId());
        
        //必須提交事務
        sqlSession.commit();
        sqlSession.close();
    
    }
    
    /**
     * 測試更新資料
     */
    @Test
    public void func4() {
        
        //開啟session
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        //讓mabatis為我們建立介面的代理物件
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //執行查詢方法  方法名就是配置檔案中的id
         User user = new User();
         user.setUsername("王五");
         user.setAddress("北京");
         user.setId(32);
         user.setSex("男");
         int num = mapper.updateUser(user);
        System.out.println("成功更新一筆資料:"+num+"筆資料:------------");
                
        //必須提交事務
        sqlSession.commit();
        sqlSession.close();
    
    }
    
    /**
     * 測試更新資料
     */
    @Test
    public void func5() {
        
        //開啟session
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        //讓mabatis為我們建立介面的代理物件
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        
        int rmNum = mapper.rmUser(16);
        
        System.out.println("刪除了:"+rmNum+"  筆資料");
        //必須提交事務
        sqlSession.commit();
        sqlSession.close();
    
    }
}

核心程式碼

  SqlSessionFactory sqlSessionFactory=null;
    //在測試前的準備項,初始化sqlSessionFactory
    @Before
    public void setMybatis() throws IOException {
        //獲取配置檔案
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //建立sessionFactory
        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);        
    }


    //開啟session
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        //讓mabatis為我們建立介面的代理物件
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //執行查詢方法  方法名就是配置檔案中的id

         User user = mapper.findUserById(28);
         List<User> list = mapper.findUserByStr("王");
        int num = mapper.addUser(user);
        int num = mapper.updateUser(user);
        int rmNum = mapper.rmUser(16);
        
                
        //必須提交事務
        sqlSession.commit();
        sqlSession.close();

sqlMapConfig.xml配置說明

properties(屬性)
settings(全域性配置引數)
typeAliases(類型別名)
typeHandlers(型別處理器)
objectFactory(物件工廠)
plugins(外掛)
environments(環境集合屬性物件)
    environment(環境子屬性物件)
        transactionManager(事務管理)
            dataSource(資料來源)
mappers(對映器)
        

在sqlMapConfig.xml中使用  properties 檔案

<?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>
    <!-- 是用resource屬性載入外部配置檔案 -->
    <properties resource="db.properties">
        <!-- 在properties內部用property定義屬性 -->
        <!-- 如果外部配置檔案有該屬性,則內部定義屬性被外部屬性覆蓋 -->
        <property name="jdbc.username" value="root123" />
        <property name="jdbc.password" value="root123" />
    </properties>

    <!-- 和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>

    <!-- 載入對映檔案 -->
    <mappers>
        <mapper resource="sqlmap/User.xml" />
        <mapper resource="mapper/UserMapper.xml" />
    </mappers>
</configuration>
MyBatis 將按照下面的順序來載入屬性:
    在 properties 元素體內定義的屬性首先被讀取。 
    然後會讀取properties 元素中resource或 url 載入的屬性,它會覆蓋已讀取的同名屬性。

別名

 mybatis支援別名:
別名    對映的型別
_byte     byte 
_long     long 
_short    short 
_int      int 
_integer  int 
_double   double 
_float    float 
_boolean  boolean 
string    String 
byte      Byte 
long      Long 
short     Short 
int       Integer 
integer   Integer 
double    Double 
float     Float 
boolean   Boolean 
date      Date 
decimal   BigDecimal 
bigdecimal     BigDecimal 
map    Map

自定義類別名

<typeAliases>
        <!-- 單個別名定義 -->
        <typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />
        <!-- 批量別名定義,掃描整個包下的類,別名為類名(大小寫不敏感) -->
        <package name="cn.itcast.mybatis.pojo" />
        <package name="其它包" />
    </typeAliases>

mappers對映器

使用相對於類路徑的資源(現在的使用方式)
如:<mapper resource="sqlmap/User.xml" /><mapper class=" " />
使用mapper介面類路徑
如:<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
注意:此種方法要求mapper介面名稱和mapper對映檔名稱相同,且放在同一個目錄中。

<package name=""/>
註冊指定包下的所有mapper介面
如:<package name="cn.itcast.mybatis.mapper"/>
注意:此種方法要求mapper介面名稱和mapper對映檔名稱相同,且放在同一個目錄中。