mybatis(3)mybatis的mapper代理方法

2022-08-15 10:28:21

目录

mybatis和hibernate的本质区别和应用场景

总结原始 dao开发问题

思路(mapper代理开发规范)

调用步骤


mybatis和hibernate的本质区别和应用场景

hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。

对sql语句进行优化、修改比较困难的。

应用场景:

         适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。

应用场景:

         适用与需求变化较多的项目,比如:互联网项目。

企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。

总结原始 dao开发问题

需要写dao接口和实现类

1、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

2、调用sqlsession方法时将statement的id硬编码了

3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

mapper代理方法(程序员只需要mapper接口(相当 于dao接口))

思路(mapper代理开发规范)

程序员还需要编写mapper.xml映射文件

程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

开发规范:

1、在mapper.xml中namespace等于mapper接口地址

2、mapper.java接口中的方法名和mapper.xml中statement的id一致

3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

代码

com.pro.dao.UserMapper

/mybatis318_1/src/com/pro/dao/UserMapper.xml

在SqlMapConfig.xml中加载mapper.xml

测试

调用步骤

        //1.通过工厂获得sqlsession
        SqlSession session = sf.openSession();
        //2.创建usermapper对象,mybatis自动创建mapper代理对象
        UserMapper userMapper = session.getMapper(UserMapper.class)
        //3.调用usermapper中的方法
        List<User> list = userMapper.findUserByUsername("小明");

package com.pro.UI;

import java.io.IOException;
import java.io.InputStream;
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 org.junit.Test;

import com.pro.dao.User;
import com.pro.dao.UserMapper;

public class MybatisTest {
	public static SqlSessionFactory sf =null;
	static {
		String resource = "SqlMapConfig.xml";
		InputStream ins;
		try {
			ins = Resources.getResourceAsStream(resource);
			sf = new SqlSessionFactoryBuilder().build(ins);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	@Test
	public void test1() throws IOException{
		
		//通过工厂获得sqlsession
		SqlSession session = sf.openSession();
		
		//创建usermapper对象,mybatis自动创建mapper代理对象
		UserMapper userMapper = session.getMapper(UserMapper.class);
		
		
		//调用usermapper中的方法
		User user = userMapper.findUserById(1);
		
		System.out.println(user);
		
		session.close();
	}
	
	@Test
	public void test2() throws IOException{
		
		//通过工厂获得sqlsession
		SqlSession session = sf.openSession();
		
		//创建usermapper对象,mybatis自动创建mapper代理对象
		UserMapper userMapper = session.getMapper(UserMapper.class);
		
		
		//调用usermapper中的方法
		List<User> list = userMapper.findUserByUsername("小明");
		for (int i=0;i<list.size();i++){
			
			System.out.println(list.get(i));
		}
		
		session.close();
	}
}

一些问题总结

代理对象内部调用selectOne或selectList

如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。

如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。

mapper接口方法参数只能有一个是否影响系统

开发mapper接口方法参数只能有一个,系统是否不利于扩展维护。

系统 框架中,dao层的代码是被业务层公用的。

即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。

多个参数的传递可使用map或者对象传入

传递对象

userMapper.xml

调用

 使用map传递多个参数

 xml

调用

  • 作者:puppycuty
  • 原文链接:https://blog.csdn.net/qq_38125626/article/details/88642753
    更新时间:2022-08-15 10:28:21