Mybatis和hibernate本质区别
Hibernate:是一个标准的对象关系映射框架,入门门槛高的,不需要程序员写SQL,SQL语句自动生成了。对SQL语句进行优化,修改比较困难。
应用环境:适用于需求变化不多的中小型项目,比如后台管理系统,ERP,OA等。
Mybatis:专注于SQL语句,需要程序员自己编写SQL语句,比较灵活。
应用环境:适用于需求变化比较多的大型项目,比如互联网项目。
原始dao开发方法(程序员需要写dao接口和dao实现类)
思路:程序员需要写dao接口和dao实现类,需要向dao实现类中注入SqlSessionFactory ,在方法体内通过SqlSessionFactory创建SqlSession。
Dao接口:
package com.neusoft.dao;
import com.neusoft.vo.Users;
public interface IUsersDao {
//根据id查询用户信息
publicUsers findUsersById(int id) throws Exception;
//添加用户信息
publicvoid insertUsers(Users users) throws Exception;
//删除用户信息
publicvoid deleteUsers(int id) throws Exception;
}
DAO实现类:
package com.neusoft.dao;
importorg.apache.ibatis.session.SqlSession;
importorg.apache.ibatis.session.SqlSessionFactory;
import com.neusoft.vo.Users;
public class UserDaoImpl implementsIUsersDao {
//因为没有整合spring,所以这里采用构造方法来创建sqlSessionFactory
privateSqlSessionFactory sqlSessionFactory;
publicUserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory= sqlSessionFactory;
}
publicvoid deleteUsers(int id) throws Exception {
SqlSessionsqlSession = sqlSessionFactory.openSession();
sqlSession.delete("test.deleteUsers",id);
sqlSession.commit();
sqlSession.close();
}
publicUsers findUsersById(int id) throws Exception {
SqlSessionsqlSession = sqlSessionFactory.openSession();
Usersusers = sqlSession.selectOne("test.findUserById",id);
sqlSession.close();
returnusers;
}
publicvoid insertUsers(Users users) throws Exception {
SqlSessionsqlSession = sqlSessionFactory.openSession();
sqlSession.insert("test.insertUsers",users);
sqlSession.commit();
sqlSession.close();
}
}
原始方法出现的问题:
1.dao实现类存在大量的模板代码,产生大量代码冗余。
2.调用sqlSession方法将调用方法的id硬编码。
Mapper代理方法
思路:
程序员还需要编写mapper.xml映射文件。
程序员编写mapper接口需要遵循一些开发规范。
Mybatis可以自动生成mapper接口实现类代理对象。
开发规范:
1.在xml中namespace等于dao接口的地址。
<!--
namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理开发,namespace就有特殊的作用
namespace就是mapper的接口地址
-->
<mapper namespace="com.neusoft.mapper.IUsersDao"></mapper>
2.在dao接口中的方法名与xml中id一致。
3.dao接口中的输入和输出参数类型与xml中的输入和输出参数类型一致。
综上:其实就是实现类不再手动写,还是通过xml和dao接口来自动生成。
一些问题的总结:
1.代理对象内部调用selectOne和selectList
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
如果mapper方法返回集合对象,代理对象内部通过selectList查询数据。
即我在dao接口中写方法的时候,如果返回的是集合对象,返回值类型就是List<Users>。
2.mapper接口方法参数只能有一个,是否影响系统开发
在系统框架中,dao层的代码是被业务层公用的。
即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。