真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MyBatis簡單使用實(shí)例

這篇文章主要介紹“MyBatis簡單使用實(shí)例”,在日常操作中,相信很多人在MyBatis簡單使用實(shí)例問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MyBatis簡單使用實(shí)例”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

目前創(chuàng)新互聯(lián)公司已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計、都蘭網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

MyBatis簡單使用

使用MyBatis可以分以下幾個關(guān)鍵點(diǎn)

  • 引入MyBatis依賴

  • 配置mybatis-config.xml配置文件

  • 創(chuàng)建數(shù)據(jù)庫實(shí)體類與Mapper映射文件

  • 通過SqlSessionFactoryBuilder加載配置并使用

以下按步驟寫一個單元測試:

  1. 引入依賴



	org.mybatis
	mybatis
	3.5.4




	mysql
	mysql-connector-java
	5.1.40




	org.projectlombok
	lombok
	1.16.6
  1. 編寫配置文件

mybatis-config.xml





    
    
        
        

        
        

        
        
        
        
        
        
        
        
        
    

    
        
        
        
        
    

    
    
            
    

    
        
            
        
        
    

    
        
            
            
                
                
                
                
            
        
    

    
        
        
        
    

db.properties數(shù)據(jù)庫連接配置

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/data_test?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true
jdbc.username=root
jdbc.password=123456

初始化數(shù)據(jù),用于后邊的單元測試。

## 部門表
CREATE TABLE `department` (
  `id` int(5) NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  `parent_id` int(5) NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;


## 員工表
CREATE TABLE `user_department` (
  `id` int(5) NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  `age` int(4) DEFAULT NULL,
  `default_department_id` int(5) NOT NULL,
  `all_department_id` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

## 初始化部門
insert into department values (1,'部門1',null);
insert into department values (2,'部門2',1);
insert into department values (3,'部門3',null);


## 初始化員工

insert into user_department values (1,'張三',18,1,'2,3');
insert into user_department values (2,'李4',18,2,'1,2');
insert into user_department values (3,'王5',18,3,'3');
insert into user_department values (4,'趙6',18,1,'1');
  1. 數(shù)據(jù)庫實(shí)體類與mapper配置

/**
  * 業(yè)務(wù)實(shí)體對象
  */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    /** 主鍵ID */
    private Long id;
    /** 姓名 */
    private String name;
    /** 年齡 */
    private Integer age;
}

UserMapper.xml 映射文件




    
    

    
    
    

    
        
        
        
    

    
    
        
        
        
        
            
            
        
    

    
    
        
        
        
        
        
    

    
    
        
        
        
        




        
    


    
        select * from user_department where id = #{id}
    


    
        insert into user_department (id,name,age)
        values (#{id},#{name},#{age})
    

    
        update user_department
        
            
                name = #{name}
            
            
                ,age = #{age}
            
        
        where id = #{id}
    


    
        select a.id,a.name,a.age,b.id as department_id,b.name as department_name
        from user_department a
        left join department b
        on a.default_department_id = b.id
        where a.id = #{id}
    


    
        select *
        from user_department a
        where a.id = #{id}
    

    
        select *
        from user_department a
        where a.id = #{id}
    

mapper調(diào)用接口,方法名要到Mapper.xml文件中的配置的Id相同,否則無法映射成功。

public interface UserMapper {


    /**
     * 根據(jù)主鍵查詢
     * @param id
     * @return
     */
    public User byId(Long id);

    /**
     * 新增
     * @param user
     * @return
     */
    public void save(User user);

    /**
     * 修改
     * @param user
     */
    public void update(User user);

    /**
     * 多表關(guān)聯(lián)查詢
     * @param id
     * @return
     */
    public UserAndDepartment getUserAndDepartmentById(Long id);

    /**
     * 關(guān)聯(lián)查詢,有N + 1問題
     * @param id
     * @return
     */
    public UserAndDepartment getUserAndDepartmentById1(Long id);


    /**
     * 關(guān)聯(lián)查詢,1對多
     * @param id
     * @return
     */
    public UserAndDepartment getUserAndDepartmentById2(Long id);
}
  1. 單元測試

package com.freecloud.plug.mybatis;

import com.freecloud.common.LoggerUtil;
import com.freecloud.plug.mybatis.dao.UserMapper;
import com.freecloud.plug.mybatis.entity.User;
import com.freecloud.plug.mybatis.entity.UserAndDepartment;
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 java.io.IOException;
import java.io.InputStream;

/**
 * @Author: maomao
 * @Date: 2021-04-08 11:36
 */
public class MyBatisTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void init() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 使用mybatis api 方式硬編碼方式
     */
    @Test
    public void testApiStatement(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            sqlSession.selectOne("com.freecloud.plug.mybatis.dao.UserMapper.byId",1);
        }finally {
            sqlSession.close();
        }
    }

    /**
     * 測試使用mapper包裝直接使用接口調(diào)用
     */
    @Test
    public void testMapperInterface(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = userMapper.byId(1L);
            LoggerUtil.printThread(user.toString());
        }finally {
            sqlSession.close();
        }
    }

    /**
     * 多表關(guān)聯(lián)查詢
     */
    @Test
    public void testUserAndDepartment(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            UserAndDepartment user = userMapper.getUserAndDepartmentById(1L);
            LoggerUtil.printThread(user.toString());
        }finally {
            sqlSession.close();
        }
    }

    /**
     * 關(guān)聯(lián)查詢,有N + 1問題
     */
    @Test
    public void testUserAndDepartment1(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            UserAndDepartment user = userMapper.getUserAndDepartmentById1(1L);
            LoggerUtil.printThread(user.toString());
        }finally {
            sqlSession.close();
        }
    }

    /**
     * 關(guān)聯(lián)查詢,1對多
     */
    @Test
    public void testUserAndDepartment2(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            UserAndDepartment user = userMapper.getUserAndDepartmentById2(1L);
            LoggerUtil.printThread(user.toString());
        }finally {
            sqlSession.close();
        }
    }
}

使用以上例子,就可以運(yùn)行起來MyBatis??磫卧獪y試中的使用方法,分別描述了幾種常見方式。

  • 使用傳統(tǒng)硬編碼直接通過Mapper映射器中配置的ID訪問

  • 使用一個空接口實(shí)現(xiàn)方法調(diào)用(無實(shí)現(xiàn)類),使用sqlSession.getMapper(UserMapper.class);方式獲取實(shí)例執(zhí)行

  • 對象關(guān)聯(lián)性查詢一對多、一對一形式

核心對象

在單元測試類中我們看到了MyBatis里面的幾個核心對象:

  • SqlSessionFactoryBuiler

  • SqlSessionFactory

  • SqlSession

  • Mpper

這幾個核心對象在MyBatis的整個工作流程里面的不同環(huán)節(jié)發(fā)揮作用。如果我們不用容器,自己去管理這些對象的話,我們必須考慮一個問題:什么時候創(chuàng)建和銷毀這些對象?

在一些分布式應(yīng)用里,多線程高并發(fā)場景中,如果要寫出高效的代碼,就必須了解這四個對象的生命周期。

SqlSessionFactoryBuiler

它是用來構(gòu)建SqlSessionFactory與解析mybatis-config等配置的,而SqlSessionFactory只需要一個,所以只要構(gòu)建了一個SqlSessionFactory之后它的使命就完成了,也就沒有存在的必要了。所以它的生命周期只存在于方法的局部

SqlSessionFactory

SqlSessionFactory是用來創(chuàng)建SqlSession的,每次訪問數(shù)據(jù)庫都需要創(chuàng)建一個回話。因?yàn)槲覀円恢庇袆?chuàng)建會話的需要,所以SqlSessionFactory應(yīng)該存在于應(yīng)用的整個生命周期中(作用域是應(yīng)用作用域)。創(chuàng)建SqlSession只需要一個實(shí)例來做這件事就可以了,否則會造成混亂和資源浪費(fèi)。所以我們應(yīng)該采用單例模式。

一般工廠類在都應(yīng)該是單例模式。

SqlSession

SqlSession是一個會話,因?yàn)樗皇蔷€程安全的,不能在線程間共享。所以我們在請求開始的時候創(chuàng)建一個SqlSession對象,在請求結(jié)束時要及時關(guān)閉它。也可以把它理解成Jdbc 的Connection連接。

Mapper

實(shí)際是Mapper是一個代理對象,是從SqlSession中獲取的。

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

它的作用是發(fā)送Sql來操作數(shù)據(jù)庫的數(shù)據(jù)。它應(yīng)該在一個SqlSession事務(wù)方法之內(nèi)。

對象作用域
SqlSessionFactoryBuilder方法局部(method)
SqlSessionFactory應(yīng)用級別(application)
SqlSession請求和操作(request、method)
Mapper方法(method)

以上就是四個核心對象的生命周期。

到此,關(guān)于“MyBatis簡單使用實(shí)例”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


網(wǎng)頁標(biāo)題:MyBatis簡單使用實(shí)例
分享路徑:http://weahome.cn/article/gejdoi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部