6、Mybatis 入门示例

一、IDEA 新建项目一个maven 项目

项目结构如下:


image.png

二、引入包

编辑pom.xml,引入如下的包

        
        
            org.mybatis
            mybatis
            3.5.0
        
        
        
            log4j
            log4j
            1.2.17
        
        
        
            mysql
            mysql-connector-java
            8.0.15
        

三、编写配置文件

1、resources目录下新增 db.properties文件

数据库连接配置如下

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.109.128:3306/test?serverTimezone=UTC 
jdbc.username=mysqluser
jdbc.password=root

2、resources目录下新增 log4j.properties文件

配置log4j日志的输出及格式

log4j.rootLogger=DEBUG , stdout 
log4j.logger.org.mybatis=DEBUG 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n

四、数据库建表

表名【role】


image.png

五、编写 Mapper

1、编写 POJO 类 Role

package Entity;

public class Role {

    private String id;
    private String roleName;
    private String note;

    public String getId(){return id;}
    public void setId(String id){this.id = id;}


    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

  
    public String toString(){
        return  "RoleBean{" +
                "id='" + id + '\'' +
                ",roleName='" + roleName + '\'' +
                ",note='" + note + '\'' +
                "}";
    }
}

2、编写 Mapper 类 RoleMapper

package Mapper;

import Entity.Role;

import java.util.List;

public interface RoleMapper {
  public int insertRole(Role role);
  public int deleteRole(String id) ;
  public int updateRole(Role role) ;
  public Role getRole( String id) ;
  public List findRoles(String roleName);
}

3、编写 Mapper 配置文件

resources目录下新增 RoleMapper.xml文件




    
       insert into role(id, RoleName, Note) values (#{id}, #{roleName}, #{note})
    
    
        DELETE from role where id = #{id}
    
    
        update role set RoleName = #{roleName) , note= #{note) where id= #{id)
    
    
    


注意,其中resultType需要使用完全限定的类名称,或使用下面config定义的别名
IDEA可以安装插件【MyBatis plugin】,具有检查及提示相关文档配置功能

4、编写 mybatis-config.xml

resources目录下新增 mybatis-config.xml文件




                               --读取 db.properties 的配置
    
                  --定义类型别名
    
    
        
            
            
                      --使用 properties 中配置的属性值
                
                
                
            
        
    
    
    
        
    

5、完成后的目录结构

image.png

六、编写类SqlSessionFactoryUtil

新增SqlSessionFactoryUtil类用于维护全局唯一的SqlSessionFactory,并提供方法返回一个可用的SqlSession对象

package 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;

public class SqlSessionFactoryUtil {
    private final static Class LOCK =  SqlSessionFactoryUtil.class ;
    
    private static SqlSessionFactory sqlSessionFactory = null;

    private SqlSessionFactoryUtil(){}

    public static SqlSessionFactory getSqlSessionFactory(){
        synchronized (LOCK){
            if(sqlSessionFactory != null){
                return sqlSessionFactory;
            }
            //配置文件
            String resource = "mybatis-config.xml";
            //配置文件流
            InputStream inputStream;
            try{
                 inputStream = Resources.getResourceAsStream(resource);
                //创建会话工厂
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
            return sqlSessionFactory;
        }
    }

    public static SqlSession openSqlSession(){
        if(sqlSessionFactory == null){
            getSqlSessionFactory();
        }
        return sqlSessionFactory.openSession();
    }
}

注:使用单例模式

七、编写测试类,插入表数据

新增Test类,main方法如下:

public static void main(String[] args){
        Logger log = Logger.getLogger(RoleTest.class);
        SqlSession sqlSession = null;
        try{
            sqlSession = SqlSessionFactoryUtil.openSqlSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            Role role = new Role();
            role.setId(UUIDUtil.newUUIDStrWithoutDash());
            role.setRoleName("第一个测试");
            role.setNote(DateUtil.getTimeStamp());
            //通过sqlSession操作数据库
            //sqlSession.insert("Mapper.RoleMapper.insertRole", role);
            // 通过 mapper 操作数据库, 更推荐这种方式
            roleMapper.insertRole(role);
            // 下面这个必须加上,否则不会提交更改到数据库
            sqlSession.commit();
            log.info(role);
        }  finally {
            if(sqlSession != null){
                sqlSession.close();
            }
        }
    }

注:

1、写入数据有以下两种方式

sqlSession.insert("Mapper.RoleMapper.insertRole", role);

 roleMapper.insertRole(role);

推荐使用第二种

2、默认的自动提交是disable的

image.png

所以后面需要加一句代码sqlSession.commit();才能真正写入数据到表中

3、sqlSession使用完需要调用close()方法释放资源

程序运行后,可以查看表中已有新增的数据:


image.png

八、完整代码

点击查看

九、TypeHandler 处理 Enum 转换

示例代码点击查看

十、高阶-实现一个用于分页的mybatis插件

完整代码参考这里

1、新增用于分页的参数POJI类PageParams

image.png

2、Mapper类新增查询方法,接收参数

public List findRolesPaged(@Param("pageParams") PageParams pageParams, @Param("roleName") String roleName);

3、Mapper.xml新增配置

    

4、编写插件类MySqlPageQueryPlugin,实现接口Interceptor

5、mybatis配置文件新增插件的使用配置

       
            
            
            
            
            
            
            
            
            
            
        

6、编写junit测试方法

    @Test
    public void roleMapPageSelect(){
        SqlSession sqlSession = SqlSessionFactoryUtil.openSqlSession();
        RoleMapper mapper = sqlSession.getMapper(RoleMapper.class);
        PageParams pageParams = new PageParams();
        pageParams.setPageSize(3);
        List roles = mapper.findRolesPaged(pageParams,"test");
        logger.warn("Page【1】 select result...............");
        for (Role r : roles){
            logger.info(r);
        }
        pageParams.setPageNo(2);
        // select mapper 需要同时设置【flushCache="true" useCache="false"】才能不缓存
        // 否则下面这个不会再调用数据库查询,而是直接返回上一次缓存的结果
        roles = mapper.findRolesPaged(pageParams,"test");
        logger.warn("Page【2】 select result...............");
        for (Role r : roles){
            logger.info(r);
        }
        sqlSession.close();
    }

你可能感兴趣的:(6、Mybatis 入门示例)