什么是 MyBatis?
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
Hibernate 与mybatis的区别
1. hibernate是全自动,而mybatis是半自动。
hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。
2. hibernate数据库移植性远大于mybatis。
hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、MySQL等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。
3. hibernate拥有完整的日志系统,mybatis则欠缺一些。
hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多。
4. mybatis相比hibernate需要关心很多细节
hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。但也正因为mybatis使用简单,才导致它要比hibernate关心很多技术细节。mybatis由于不用考虑很多细节,开发模式上与传统jdbc区别很小,因此很容易上手并开发项目,但忽略细节会导致项目前期bug较多,因而开发出相对稳定的软件很慢,而开发出软件却很快。hibernate则正好与之相反。但是如果使用hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis。
5. sql直接优化上,mybatis要比hibernate方便很多
由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。而hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上hibernate不及mybatis。
6. hibernate是手动开启事务,而mybatis是自动开启事务。注意在增,删,改时需要提交事务
MyBatis配置步骤
一.三拷:
- MyBatis开发包(mybatis-3.0.5-SNAPSHOT.jar)
- log4j
- jdbc驱动
二.src目录的配置
1.总的配置文件:SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"mybatis-3-config.dtd">
<configuration>
<environments default="dev">
<environment id="MYSQL">
<!-- 事物 回滚 rollback savepoint commit-->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="UNPOOLED">
<property name="username" value="root"/>
<property name="password" value="admin"/>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1/test"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/pojo/DepMap.xml"/>
</mappers>
</configuration>
2.把pojo写好后,就写对应的_map.xml文件 (可以拷贝mybatis-3-mapper.dtd到需要配置_map.xml文件的同一个目录下,会有提示)
--以DepMap.xml配置为例,注意在总的配置文件注册一下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<mapper namespace="com.pojo">
<!-- 查询所有的部门 -->
<select id="getall" resultType="com.pojo.Dep">
select depid from dep
</select>
<!-- 主键查找 -->
<select id="findbyid" resultType="com.pojo.Dep" parameterType="int">
select depid, depname from dep where depid = #{depid}
</select>
<!-- 区间查找 -->
<select id="qujian" resultType="com.pojo.Dep" parameterType="map">
select depid , depname from dep where depid between #{x} and #{y}
</select>
<!-- 区间2 -->
<select id="qujian2" resultType="com.pojo.Dep" parameterType="map">
select depid , depname from dep where depid <![CDATA[<]]> #{x} and depid <![CDATA[>]]> #{y}
</select>
<!-- 模糊查询 concat():用于连接两个或者多个数组 -->
<select id="mohu" resultType="com.pojo.Dep">
select depid , depname from dep where depname like concat('%' , #{depname} )
</select>
<!--更新-->
<update id="updatedep" parameterType="com.pojo.Dep">
update dep set depname = #{depname} where depid = #{depid}
</update>
<!--插入-->
<insert id="insert" parameterType="com.pojo.Dep">
<selectKey resultType="int" order="AFTER" keyProperty="depid">
<!-- 为了解决insert数据库不支持主键自动生成问题 mysql after oracle before -->
select max(depid) from dep
</selectKey>
insert into dep(depid , depname) values(#{depid } , #{depname})
</insert>
<!--删除-->
<delete id="del" parameterType="com.pojo.Dep">
delete from dep where depid = #{depid}
</delete>
</mapper>
修改、删除、添加只有parameterType(参数类型),没有resultType(返回类型)
3.测试一下,写一个测试类
--每个增删改的,前面几个步骤是一样的
public static void main(String[] args) throws IOException {
//1.读取总的配置文件
Reader reader=Resources.getResourceAsReader("SqlMapConfig.xml");
//2.创建SessionFactory
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader,"MYSQL");
//3.创建session
SqlSession session=factory.openSession();
//这个是查询所有的功能
List<Dep> list=session.selectList("com.pojo.getall");
for (Dep dep : list) {
System.out.println(dep.getDepid()+"\t"+dep.getDepname());
}
-------------------------------------------
//这个是根据主键查询所有的功能
Dep dep = (Dep) session.selectOne("com.pojo.findbyid", 1);
System.out.println(dep.getDepid() + "\t" + dep.getDepname());
}
-------------------------------------------
//这个是根据区间查询的功能
Map map = new HashMap();
map.put("x", 1);
map.put("y", 3);
List<Dep> list = session.selectList("com.pojo.qujian", map);
for (Dep dep : list) {
System.out.println(dep.getDepid() + "\t" + dep.getDepname());
}
-------------------------------------------其他的就省略了
}