接下来就详细的记录一下myBatis的使用:
1.首先就是为创建myBatis项目搭建环境。我本人用的是eclipse和tomcat,数据库是MySql。所以我们需要创建一个简单的web工程项目,和一个数据库,然后在数据库中建立一个用户表。这几个步骤很简单,在这里我就不一一详述了。
2.其次就是myBatis的配置。
1).引入jar包
2).在src中创建实体包和实体类。
3).创建Mapper文件,该文件和数据库中或者项目中的实体都是对应的,每一个实体或者数据表都需要创建一个Mapper文件。
在userMapper中配置如下:
<span style="font-size:24px;"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 注释: parameterType:为参数类型;id:方法名;resultType:返回值类型; -->
<mapper namespace="myBatis_Demo.mapping.userMapper">
<select id="getUser" parameterType="int"
resultType="myBatis_Demo.entity.User">
select * from user where id=#{id}
</select>
</mapper></span>
4).在src中创建配置文件confi:
然后配置数据库连接并且注入mybatis的mapper文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 注册userMapper.xml文件,
userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
<mapper resource="myBatis_Demo/mapping/userMapper.xml"/>
</mappers>
</configuration>
不难看出,每当我们新建一个Mapper文件的时候都需要在这里注册一下。
4).最后就是执行增删改查的一些操作了,在此仅提供了查询的方法,其他的方法于此并无差异。
<span style="font-size:24px;">package myBatis_Demo.test;
import java.io.IOException;
import java.io.InputStream;
import myBatis_Demo.entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class test1 {
public static void main(String[] args) throws IOException {
//mybatis的配置文件
String resource = "conf.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = test1.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
//Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
//SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
/**
* 映射sql的标识字符串,
* me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
* getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "myBatis_Demo.mapping.userMapper.getUser";//映射sql的标识字符串
//执行查询返回一个唯一user对象的sql
User user = session.selectOne(statement, 1);
System.out.println(user);
System.out.print("mybatis执行成功!!");
}
}</span>
优点:
1、简单易学
mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
2、灵活
mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
3、解除sql与程序代码的耦合
通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
4、提供映射标签,支持对象与数据库的orm字段关系映射
5、提供对象关系映射标签,支持对象关系组建维护
6、提供xml标签,支持编写动态sql。
缺点:
1. sql工作量很大,尤其是字段多、关联表多时,更是如此。
在之前的项目中有遇到过关联查询的情况,当时就是将B表中需要的字段信息都需要在A表的Mapper中注入。如果字段很多或者关联表比较多的话,这是非常糟糕的。
2. sql依赖于数据库,导致数据库移植性差。
在mapper中的sql语句已经决定了我们用的数据库类型,当然如果我们没有使用数据库特有的命令或者方法,这是可以实现移植的。
3. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
4. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)
5. DAO层过于简单,对象组装的工作量较大。
6. 不支持级联更新、级联删除。
7. 编写动态sql时,不方便调试,尤其逻辑复杂时。
8 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。
9. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
10. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)
11. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)
12. 缓存使用不当,容易产生脏数据。
总结:mybatis是一个比较常用的技术,当然使用的情况也是局限的,我们只有对其优缺点有了足够的认识,才能使用的得心应手。