一. 什么是Mybatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
MyBatis参考资料官网:https://mybatis.github.io/mybatis-3/zh/index.html。
官网对Mybatis的介绍更加具有权威性:
- MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。
- MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。
- MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis优点:
1)、简单易学
mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
2)、灵活
mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
3)、解除sql与程序代码的耦合
通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。对开发人员而言,核心sql还是需要自己优化:sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据。
4)、提供映射标签,支持对象与数据库的orm字段关系映射。
5)、提供对象关系映射标签,支持对象关系组建维护。
6)、提供xml标签,支持编写动态sql。
MyBatis缺点:
1)、编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
2)、SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
3)、框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
MyBatis与JDBC比较:
SQL夹在Java代码块里,耦合度高导致硬编码内伤,维护不易且实际开发需求中sql是有变化,频繁修改的情况多见。
MyBatis与Hibernate和JPA比较:
长难复杂SQL,对于Hibernate而言处理也不容易,内部自动生产的SQL,不容易做特殊优化。基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。
MyBatis与iBatis比较:
MyBatis是iBatis的升级版,用法有很多的相似之处,但是MyBatis进行了重要的改进。
1)、Mybatis实现了接口绑定,使用更加方便。
在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便。
2)、对象关系映射的改进,效率更高。
3)、MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。
二. 开发第一个Mybatis查询
1.新建一个java工程
2.添加jar包,如下图:
3.新建包,管理代码
4.建库,建表
DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `t_id` int(11) NOT NULL AUTO_INCREMENT, `t_username` varchar(20) NOT NULL, `t_password` varchar(8) NOT NULL, PRIMARY KEY (`t_id`) ) -- ---------------------------- -- Records of t_user -- ---------------------------- INSERT INTO `t_user` (t_username,t_password) VALUES ( 'lisi', '123456'); INSERT INTO `t_user` (t_username,t_password) VALUES ( 'wanger', '654321'); INSERT INTO `t_user` (t_username,t_password) VALUES ( '李四', '123123'); INSERT INTO `t_user` (t_username,t_password) VALUES ( '王二', '321321');
5.在src目录下添加全局配置文件config.xml和log4j.xml文件
<?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> <!-- default="development" 开发环境 default="work" 发布环境 --> <environments default="development"> <environment id="development"> <!-- 配置事物 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.61.22:3306/test" /> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> </configuration>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="Encoding" value="UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /> </layout> </appender> <logger name="java.sql"> <level value="debug" /> </logger> <logger name="org.apache.ibatis"> <level value="info" /> </logger> <root> <level value="debug" /> <appender-ref ref="STDOUT" /> </root> </log4j:configuration>
6.编写java实体类,生成set,get方法
public class User { private Integer id; private String username; private String password; }
7.编写sql映射文件---------------mapper文件
<?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" > <!-- 配置SQL语句,与实体类操作的对应关系。 --> <!-- 保证唯一性 --> <mapper namespace="com.softjx.model.UserMapper"> <!-- 将返回的数据 与对象对应。将返回的数据,按照配置组装成对应的对象。 --> <select id="selectAll" resultType="com.softjx.model.User"> select t_id as id,t_username as username,t_password password from t_user </select> <select id="selectById" resultType="com.softjx.model.User"> select t_id as id,t_username as username,t_password password from t_user where t_id=#{id}; </select> </mapper>
8.在全局配置文件中添加mapper文件的位置
<!-- 导入映射文件 --> <mappers> <mapper resource="com/softjx/model/UserMapper.xml" /> </mappers>