目录
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
调用