MyBatis简单使用实例-成都快上网建站

MyBatis简单使用实例

这篇文章主要介绍“MyBatis简单使用实例”,在日常操作中,相信很多人在MyBatis简单使用实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyBatis简单使用实例”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目前创新互联公司已为上千多家的企业提供了网站建设、域名、虚拟空间、网站运营、企业网站设计、都兰网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

MyBatis简单使用

使用MyBatis可以分以下几个关键点

  • 引入MyBatis依赖

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

  • 创建数据库实体类与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数据库连接配置

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

初始化数据,用于后边的单元测试。

## 部门表
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. 数据库实体类与mapper配置

/**
  * 业务实体对象
  */
@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调用接口,方法名要到Mapper.xml文件中的配置的Id相同,否则无法映射成功。

public interface UserMapper {


    /**
     * 根据主键查询
     * @param id
     * @return
     */
    public User byId(Long id);

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

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

    /**
     * 多表关联查询
     * @param id
     * @return
     */
    public UserAndDepartment getUserAndDepartmentById(Long id);

    /**
     * 关联查询,有N + 1问题
     * @param id
     * @return
     */
    public UserAndDepartment getUserAndDepartmentById1(Long id);


    /**
     * 关联查询,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包装直接使用接口调用
     */
    @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();
        }
    }

    /**
     * 多表关联查询
     */
    @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();
        }
    }

    /**
     * 关联查询,有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();
        }
    }

    /**
     * 关联查询,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();
        }
    }
}

使用以上例子,就可以运行起来MyBatis。看单元测试中的使用方法,分别描述了几种常见方式。

  • 使用传统硬编码直接通过Mapper映射器中配置的ID访问

  • 使用一个空接口实现方法调用(无实现类),使用sqlSession.getMapper(UserMapper.class);方式获取实例执行

  • 对象关联性查询一对多、一对一形式

核心对象

在单元测试类中我们看到了MyBatis里面的几个核心对象:

  • SqlSessionFactoryBuiler

  • SqlSessionFactory

  • SqlSession

  • Mpper

这几个核心对象在MyBatis的整个工作流程里面的不同环节发挥作用。如果我们不用容器,自己去管理这些对象的话,我们必须考虑一个问题:什么时候创建和销毁这些对象?

在一些分布式应用里,多线程高并发场景中,如果要写出高效的代码,就必须了解这四个对象的生命周期。

SqlSessionFactoryBuiler

它是用来构建SqlSessionFactory与解析mybatis-config等配置的,而SqlSessionFactory只需要一个,所以只要构建了一个SqlSessionFactory之后它的使命就完成了,也就没有存在的必要了。所以它的生命周期只存在于方法的局部

SqlSessionFactory

SqlSessionFactory是用来创建SqlSession的,每次访问数据库都需要创建一个回话。因为我们一直有创建会话的需要,所以SqlSessionFactory应该存在于应用的整个生命周期中(作用域是应用作用域)。创建SqlSession只需要一个实例来做这件事就可以了,否则会造成混乱和资源浪费。所以我们应该采用单例模式。

一般工厂类在都应该是单例模式。

SqlSession

SqlSession是一个会话,因为它不是线程安全的,不能在线程间共享。所以我们在请求开始的时候创建一个SqlSession对象,在请求结束时要及时关闭它。也可以把它理解成Jdbc 的Connection连接。

Mapper

实际是Mapper是一个代理对象,是从SqlSession中获取的。

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

它的作用是发送Sql来操作数据库的数据。它应该在一个SqlSession事务方法之内。

对象作用域
SqlSessionFactoryBuilder方法局部(method)
SqlSessionFactory应用级别(application)
SqlSession请求和操作(request、method)
Mapper方法(method)

以上就是四个核心对象的生命周期。

到此,关于“MyBatis简单使用实例”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


文章名称:MyBatis简单使用实例
文章转载:http://kswjz.com/article/gejdoi.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流