初识mybatis
2016-03-29 20:11
246 查看
初次学习myBatis,以前就知道它和Hibernate差不多都是数据持久层的框架。之所以称之为框架,就是因为其将java工程和数据库的连接部分做了充分的封装。以至于我们不需要再去配置jdbc哪些比较底层的复杂的东西了。相反我们需要做的就是在java项目中简单的引用几个jar包,然后在xml配置文件中简单的配置一下就可以轻松的实现和数据库的连接了。
接下来就详细的记录一下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>
以上是通过实践来认识mybatis,不难看出这个东东是非常容易学习的,当然也有它自己的优缺点:
优点:
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是一个比较常用的技术,当然使用的情况也是局限的,我们只有对其优缺点有了足够的认识,才能使用的得心应手。
接下来就详细的记录一下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>
以上是通过实践来认识mybatis,不难看出这个东东是非常容易学习的,当然也有它自己的优缺点:
优点:
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是一个比较常用的技术,当然使用的情况也是局限的,我们只有对其优缺点有了足够的认识,才能使用的得心应手。
相关文章推荐
- TCP/IP为什么要进行三次握手?
- c++之 引用&参数传递
- 窗体 dialog 弹出时动画效果
- Atitit. Js 冒泡事件阻止 事件捕获 事件传递 事件代理
- Atitit. Js 冒泡事件阻止 事件捕获 事件传递 事件代理
- 【Raspberry Pi系列】2. 多种传输方式的比较
- 公众平台测试帐号开发全流程第4篇-自定义菜单
- Android OkHttp完全解析
- Math
- 第四周项目5--用递归方法求解(3)
- 查看Hadoop源代码
- 创建二维码
- 转载知乎一篇关于大数据生态技术的文章
- 第五周上机实践项目2(2):游戏中的角色类
- 宜信笔试题 把m升水倒入n个杯子
- poj-1062-昂贵的聘礼
- Android 属性动画学习
- 贪心1013
- Atitit。监听键盘上下左右方向键事件java js jquery c#.net
- 禁用iOS中的电话号码自动识别