MyBatis持久层框架

1、MyBatis是一个基于Java的持久层框架,而持久化是指数据从瞬时状态变为持久状态,持久层是完成持久化工作的代码块-Dao层。即,MyBatis帮助开发人员将数据存入数据库中和从数据库中取数据。通过框架可以减少重复代码,提高开发效率。MyBatis是一个半自动化的ORM框架。

2、MyBatis使用

>导包:

核心包:mybatis-3.2.7.jar

依赖包:

MyBatis持久层框架_第1张图片

数据库驱动包:

>编写MyBatis的核心配置文件


  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

 
   
   
   
 
 
   
     
     
     
     
       
       
       
       
     

   

 
 
 
      
   
 

>创建sqlSessionFactory

import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {
    /*
     * 通过配置文件 创建SqlSessionFactory 是一个SqlSession的工厂类
     */
    public static SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis.cfg.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        return sqlSessionFactory;
    }
    /*
     * SqlSession通过映射执行sql语句( 通过id找到对应的sql语句,执行sql语句)
     */
    public static SqlSession getSession() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        return sqlSessionFactory.openSession();
    }
}

>创建实体类

package com.myBatis.entity;

public class Tea {
    private int id ; //饮品编号
    private String gname ; //饮品名称
    private double gprice ; //饮品价格
    
    public Tea() {}
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getGname() {
        return gname;
    }
    public void setGname(String gname) {
        this.gname = gname;
    }
    public double getGprice() {
        return gprice;
    }
    public void setGprice(double gprice) {
        this.gprice = gprice;
    }
    public Tea(int id, String gname, double gprice) {
        super();
        this.id = id;
        this.gname = gname;
        this.gprice = gprice;
    }
    @Override
    public String toString() {
        return "TeaBean [id=" + id + ", gname=" + gname + ", gprice=" + gprice + "]";
    }
}

>编写sql语句的映射文件


  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
 
      
      
 

>测试类

package com.myBatis.test;

import java.io.IOException;
import org.apache.ibatis.session.SqlSession;
import com.myBatis.entity.Tea;
import com.myBatis.util.MyBatisUtil;

public class Test {
    public static void main(String[] args) throws IOException {
        SqlSession session = MyBatisUtil.getSession() ;
        Tea tea = session.selectOne("com.myBatis.entity.TeaMapper.selectTea",27) ;
        System.out.println(tea.getGname());
        session.close();
    }
}

3、解决实体类中属性名(password)与数据库列名( pwd)不一致的问题

不一致出现的问题:不一致的属性查询的内容为null

不一致的原因在于:mabatis会根据查询的列名调用其setter方法进行设值(在mapper映射文件中定义)

解决办法一:为列名指定别名,别名和java实体类的属性名一致

解决方法:

type="Tea" id="TeaMap">
      主键
      数据库中表的列名和java实体类中的属性名
 

4、分页的实现

>limit约束实现

mapper映射中定义:

     
      

Dao层方法:

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import com.myBatis.entity.Tea;
import com.myBatis.util.MyBatisUtil;

public class TeaDao {
    //分页查询
    public List getAll(int currentPage,int pageSize) throws IOException {
        SqlSession session = MyBatisUtil.getSession() ;
        Map map = new HashMap();
        map.put("startIndex",(currentPage-1)*pageSize); //当前页第一条记录的下标
        map.put("pageSize", pageSize);
        List list = session.selectList("com.myBatis.entity.TeaMapper.selectAll", map);
        session.close();
        return list;
    }
}

>通过RowBounds实现

在mapper映射中直接查询所有:

     

在Dao层方法中通过RowBounds实现查询指定条数的分页数据:

//参数index是下标,size是数据

RowBounds rowBounds = new RowBounds((currentPage-1)*pageSize,pageSize);
List list = session.selectList("com.myBatis.entity.TeaMapper.selectTea", null, rowBounds)

5、使用注解(本质通过接口)开发映射mapper语句

//编写Dao接口
public interface UserDao {
    @Select("select * from user")
    public List getList(); 
    @Insert("insert into user(name,pwd) value(#{name},#{pwd})")
    public int insert(User user);
}
//mapper映射

    

//调用
UserDao userDao = session.getMapper(UserDao.class);
//调用userDao中方法……
会通过动态代理生成该接口的实现类,在测试类调用接口中定义的方法时,其实是调用其实现类中的方法
6、数据库表多对一处理


    
    
    
    
        
        
        
        
            
            
        

    

    ————————————————————————————————————————————————————————
    
    
    
        
        
        

    

    
        select * from teacher where id=#{id}
    

7、表中一对多处理


    
    
        
        
        
            
            
        

    

 ————————————————————————————————————————————————————————
    
    
        
        
    

    

8、动态sql

动态sql指根据不同的查询条件,生成不同的sql语句
Mapper文件

    

注:mybatis中like查询要使用CONCAT字符连接

你可能感兴趣的:(MyBatis)