初识mybatis
Posted 打杂工程师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识mybatis相关的知识,希望对你有一定的参考价值。
初次学习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>
优点:
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的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段