Mybatis笔记

Mybatis笔记

  1. 概念

    • mybatis是一个持久层框架,实现了对JDBC的封装,与数据库的连接为TCP连接。

    • 其基本思想是通过动态代理接口的方法创建一个dao层的对象,该对象通过配置文件或者注解中sql语句与方法的对应实现数据库的增删改查。

    • 基本原理:通过读取核心配置文件(配置数据库连接信息,mapper配置文件路径等)创建sqlsession对象,sqlsession对象中即封装了连接池,获得与数据库的连接;通过mapper配置文件获得接口方法的返回值及sql语句。通过sqlSession对象获取mapper的代理对象即可实现对数据库的增删改查。

2.基于配置文件实现

  • 核心配置文件:SqlMapConfig.xml,设置别名在这里

    
    
    
    
    
    
    
     
    
        
        
            
            
            
            
        
    
    
    
    
    
    
    
    
  • mapper接口代码:

    public interface UserMapper {
    public List selectByVoif(QueryVo vo);
    }
    
  • UserMapper.xml文件配置(注意文件名需与mapper接口相同)resultType为返回值类型,parameterType为传入参数类型

    `
    
    
    `
    
  • 运行代码:

    public class Demo {
    private InputStream is;
    private SqlSessionFactory factory;
    private SqlSession sqlSession;
    private UserMapper mapper;
    
     @Before //在test方法前执行
    public void init(){
    try{
        //获取输入流对象
        is = Resources.getResourceAsStream("mybatis.xml");
        //获取factory对象
        factory = new SqlSessionFactoryBuilder().build(is);
        //创建sqlsession对象
        sqlSession = factory.openSession();
        //创建代理对象
        mapper = sqlSession.getMapper(UserMapper.class);
    }catch (Exception e){
        e.printStackTrace();
    }
    
    }
    
    @Test
     public void testSelectByVoif(){
    QueryVo vo = new QueryVo();
    User user = new User();
    user.setUsername("王");
    vo.setUser(user);
    List users = mapper.selectByVoif(vo);
    for (User u : users) {
        System.out.println(u);
    }
    }
    
    
     @After      //在test方法后执行
    public void destory(){
    //提交事务
    sqlSession.commit();
    try {
        sqlSession.close();
        is.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
    

3.基于注解实现

  • 核心配置文件:同上

  • mapper接口代码:

    `public interface AccountMapper {
     @Select("select * from account")
     @Results(value = {
        @Result(property = "user" ,column = "uid",one = @One(select = "com.mybatis.mapper.UserMapper.findById",fetchType = FetchType.LAZY))
     })
     List findAll();
    
     @Select("select * from account where uid = #{uid}")
     List FindByUid(Integer uid);
    }`
    
  • 运行代码:

     private InputStream is;
    private SqlSessionFactory factory;
     private SqlSession sqlSession;
     private AccountMapper mapper;
     @Before //在test方法前执行
     public void init(){
     try{
        //获取输入流对象
        is = Resources.getResourceAsStream("mybatis.xml");
        //获取factory对象
        factory = new SqlSessionFactoryBuilder().build(is);
        //创建sqlsession对象
        sqlSession = factory.openSession();
        //创建代理对象
        mapper = sqlSession.getMapper(AccountMapper.class);
     }catch (Exception e){
        e.printStackTrace();
     }
    }
      @Test
    public void testFindAll(){
    List accounts = mapper.findAll();
    for (Account account : accounts) {
        System.out.println(account.getMoney());
        System.out.println(account.getUser());
    }
    }
    

    补充:上面的配置中已经配置了事务,默认的提交方式即为手动提交,也就是每次执行完语句后需要手动提交sqlSession.commit();也可以设置为自动提交: 方法一:factory.openSession(true)
    方法二:sqlsession.setAutoCommit(true)

4.动态sql语句

mybatis提供了一系列的动态sql语句用于实现复杂sql语句的查询。

  • if
 

  • where

  • set
    

    UPDATE USER
      
        
            username=#{username},
        
        
            sex=#{sex},
        
            birthday=#{birthday},
        
        
            address=#{address},
        
      
    WHERE id=#{id}

  • foreach

collection:表示要遍历的集合元素 
ids为javaBean中的元素
open:代表语句的开始部分 
close:代表结束部分 
item:代表遍历集合的每个元素
sperator:代表分隔符
  • choose


5.多表查询

  • 一对一查询
 



    
    
    
    
        
        
    


    




    
    
    
    

  • 一对多查询
   

    
    
    
    
    
    
    
        
        
        
    

    findUserAccountList



 
    
    
    
    
    
    
    





当然,多表查询的前提是在实体类中建立实体类之间的对应关系。

5.延迟加载

  • 所谓延迟加载就是在需要用到数据时才进行加载,不需要数据时就不加载数据,也成为懒加载。可以提高数据库的查询性能。
  • 实现懒加载的前提条件查询语句为是 4)中提到的方案二,即第二次查询由第一次查询的resultMap中的或者标签中的select指定。
  • 开启延迟加载策略
    • 1.核心配置文件配置如下内容:






  • 注解实现懒加载:见3)中注解@Results中的fetchType = FetchType.LAZY。

补充:注解说明

@Results:代替标签
>
属性介绍:
id : 标记
value : @Result[]

@Result:代替标签和:其中将属性id设为true即为id
>
属性介绍:
column:代表数据库中的查询列
property:javaBean中的属性名
one:需要使用@One注解
many:需要使用@Many注解

@ResultMap

属性
引用添加的Results

@One注解: (一对一)

代替了标签
属性:
select : 指定用来查询的sqlmapper方法
fetchType :  会覆盖全局配置参数lazyLoadingEnabled 

@Many注解 : (一对多)

代替了
属性 :
select : 指定用来查询的sqlmapper方法
fetchType :  会覆盖全局配置参数lazyLoadingEnabled 

你可能感兴趣的:(Mybatis笔记)