spring整合mybatis

一、mybatis如何执行数据增删改操作的

mybatis通过一个sqlSession类来执行增删改操作的,sqlSession类包含了所有执行SQL操作的方法如

session.selectList("findAll"); session.update("update"); 等

那如何得到sqlSession类呢?mybatis提供了SqlSessionFacotry 工厂类

SqlSessionFacotry :每一个MyBatis的应用程序都以一个SqlsessionFactory对象为核心,该对象负责创建SqlSession对象实例

SqlSessionFactoryBuild有提供了SqlSessionFacotry

SqlSessionFactoryBuild:该对象负责根据配置文件SqlMapConfig.xml构建SqlSessionFactory实例

所以我们要引入一个SqlMapConfig.xml文件


   
     
 

   
     
  
    
    
      
        
     
       
            
      
        
            
      
        
            
       
       
			
       
       
			
       
       
			
       
       
            
      
        
        
     
       
    
    
      
      
      
    
    
     
    
    

   
    





下面测试一下是否得到了sqlSession类了

package core.test;

import java.io.IOException;
import java.io.Reader;

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 MyBatisTest {
	public static void main(String[] args) throws IOException {
		SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
		Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactory sessionFactory =  builder.build(reader);
		SqlSession session = sessionFactory.openSession();
		System.out.println(session);
	}
}

二 、成功后我们来一个小练习

编写一个实体类Emp

package core.entity;

public class Emp {
	private String empno;
	private String ename;
	private Double sal;
	public String getEmpno() {
		return empno;
	}
	public void setEmpno(String empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public Double getSal() {
		return sal;
	}
	public void setSal(Double sal) {
		this.sal = sal;
	}
}

然后添加一个sqlMap.xml定义Sql语句

    
      
 

    
    
	
     
     
      
      
		insert into emp(empno,ename,sal)values(#{empno},#{ename},#{sal})
		
     
     
	
     
     
  • select * from emp where empno=#{empno}
  • (这里的sqlMap.xml可以有多个,名字可以改变,和SqlMapConfig.xml中的对应就好)
    接下来可以使用sqlsession调用方法实现对应的怎删改查如

    package core.test;
    
    import java.io.IOException;
    import java.io.Reader;
    
    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 core.entity.Emp;
    
    public class MyBatisInsertTest {
    	public static void main(String[] args) throws IOException {
    		SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
    		Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
    		SqlSessionFactory sessionFactory =  builder.build(reader);
    		SqlSession session = sessionFactory.openSession();
    		Emp emp = new Emp();
    		emp.setEmpno("1001");
    		emp.setEname("zhangsan");
    		emp.setSal(10000.0);
    		session.insert("addEmp",emp);
    		session.commit();
    		session.close();
    	}
    }

    这样就是一个Mybatis的一个小例子

    三、接下来说说Mapper映射器   

    还是上面的例子,我们在项目中使用增删改一般会写成一个Dao

    package core.dao;
    
    import java.util.List;
    import core.entity.Emp;
    public interface EmpDao {
    	public void delete(Integer id);
    	public void addEmp(Emp emp);
    	public List
       
       
        
        findAll();
    	Emp findById(int empno);
    }
       
       
    还有一个实现类

    package core.dao;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.util.List;
    
    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 core.entity.Emp;
    
    public class EmpDaoIm implements EmpDao {
    	
    	@Override
    	public void addEmp(Emp emp) {
    		SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
    		Reader reader=null;
    		try {
    			reader = Resources.getResourceAsReader("SqlMapConfig.xml");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		SqlSessionFactory sessionFactory =  builder.build(reader);
    		SqlSession session = sessionFactory.openSession();
    		session.insert("addEmp",emp);
    		session.commit();
    		session.close();
    
    	}
    
    }
    
    这样比较麻烦,MyBatis给我们提供了Mapper映射器

    Mapper映射器是开发者创建绑定映射语句的接口,映射器接口的实例可以从SqlSession中获得

    所以我们只需要提供一个按照MyBtis规范的接口,MyBtis会自动为我们创建一个对应的实现类,当然这是个代理实现类,

    映射器接口的实例可以从SqlSession中获得

    如我们写了一个接口

    package core.dao;
    
    import java.util.List;
    import core.entity.Emp;
    public interface EmpDao {
    	public void delete(Integer id);
    	public void addEmp(Emp emp);
    	public List
       
       
        
        findAll();
    	Emp findById(int empno);
    }
       
       
    MyBtis会自动为我们创建一个类似

    package core.dao;
    
    import java.io.IOException;
    import java.io.Reader;
    import java.util.List;
    
    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 core.entity.Emp;
    
    public class EmpDaoIm implements EmpDao {
    	
    	@Override
    	public void addEmp(Emp emp) {
    		SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
    		Reader reader=null;
    		try {
    			reader = Resources.getResourceAsReader("SqlMapConfig.xml");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		SqlSessionFactory sessionFactory =  builder.build(reader);
    		SqlSession session = sessionFactory.openSession();
    		session.insert("addEmp",emp);
    		session.commit();
    		session.close();
    
    	}
    
    }
    
    这样一个实现类,这样就可以不用写实现类,通过接口调用方法就可以了

    package core.test;
    
    import java.io.IOException;
    import java.io.Reader;
    
    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 core.dao.EmpDao;
    import core.entity.Emp;
    
    public class EmpDaoTest {
    	public static void main(String[] args) throws IOException {
    		SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
    		Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
    		SqlSessionFactory sessionFactory =  builder.build(reader);
    		SqlSession session = sessionFactory.openSession();
    		EmpDao dao = session.getMapper(EmpDao.class);
    		Emp emp = new Emp();
    		emp.setEName("zs");
    		emp.setEmpno("1002");
    		emp.setSal(10000.0);
    		dao.addEmp(emp);
    		session.commit();
    		session.close();
    	}
    }
    

    四、如何实现spring整合mybatis

    第一步引入mybatis-spring.jar其提供了下面几个与整合相关的API

    1 SqlSessionFacoryBean

    为整合应用提供了SqlSession对象资源其相当于做了SqlSessionUtil 的工作即如下代码

           SqlSessionFactoryBuilder builder =new SqlSessionFactoryBuilder();
            Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
            SqlSessionFactory sessionFactory =  builder.build(reader);
            SqlSession session = sessionFactory.openSession();

    2 MapperFactoryBean(每一个Mapper接口都要配一个MapperFactoryBean

    根据指定Mapper接口生成Bean实例 其封装了原有session.getMapper()功能实现,即如下代码

           EmpDao dao = session.getMapper(EmpDao.class);

    3 MapperScannerConfigure(一个MapperScannerConfigure可以对应多个Mapper接口

    根据指定包批量扫描Mapper接口并生成实例,Dao实例名为接口名首字母小写

    MapperScannerConfigure一般取代了MapperFactoryBean

    第二步在applicationContext.xml中定义SqlSessionFacoryBean,和MapperScannerConfigure
    
       
       
    
       
       
    				
        
        
    					
         
         
    					
         
         
    					
         
         
    					
         
         
    				
        
        
    				
        
        
    					
         
         
    					
         
         
    				
        
        
    				
        
        
    					
         
         
    					
         
         
    				
        
        
    		
    		
        
        
    		
        
        
    		
        
        
    		
        
        
    			
         
         
    			
         
         
    		
        
        	
    
       
       
    
    此时已经可以不在需要sqlMapConfig.xml

    现在当我们想用dao的方法时,可以到spring容器中取,默认dao的名字为接口名首字母小写,或者自动装配到service中

    package core.service;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Component;
    
    import core.dao.EmpDao;
    import core.entity.Emp;
    
    @Component
    public class EmpService {
    	@Resource
    	private EmpDao dao;
    	public Emp getEmpInfo(){
    		Emp emp = dao.findById(1001);
    		return emp;
    	}
    }
    

    终于写完了~~

    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值