MyBatis_01
A.概述
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身
而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程
MyBatis能支持普通SQL查询,存储过程和高级映射的优秀持久层框架
MyBatis消除了几乎所有的JDBC代码参数的手工设置以及对结果集的检索
MyBatis通过xml或注解的方式将要执行的各种statement配置起来
并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句
最后由mybatis框架执行sql并将结果映射为java对象并返回
B.一个简单的环境
1.添加相关jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.wpf</groupId> <artifactId>mybatis</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>mybatis Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> </properties> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> </dependencies> <build> <finalName>mybatis</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
2.配置核心文件
核心配置文件中主要配置3方面内容:数据库连接、运行时常量和注册映射元文件
核心配置文件名称没有具体规范,一般可以使用classpath:mybatis-config.xml
xml文件对应的dtd文件位于mybatis.jar下
/org/apache/ibatis/builder/xml/mybatis-3-config.dtd对应核心配置文件
/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd对应映射元文件
<?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用于设置默认生效的环境配置 --> <environments default="wpf"> <!-- 一个具体的环境配置,每个environment元素定义的环境Id, 其中包括数据库连接的具体配置信息 一个环境配置中主要包括两种方法:数据源配置和事务相关配置 --> <environment id="wpf"> <!-- 事务管理器的配置,type可以使用2个值.一般针对于分布式应用可以使用MANAGED,非分布式应用一律为JDBC JDBC – 这个配置直接简单使用了JDBC的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。 MANAGED – 让容器来管理事务的整个生命周期 --> <transactionManager type="JDBC" /> <!-- 数据源的配置,type中可以使用3个常量之一: UNPOOLED – 这个数据源的实现是每次被请求时简单打开和关闭连接。连接没有复用,效率低。一般用于环境的测试 POOLED – 这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。这 是一种当前Web应用程序用来快速响应请求很流行的方法。 JNDI – 这个数据源的实现是由容器集中或在外部配置数据源,然后放置一个JNDI上下文的引用。可以用于生产环境中 --> <dataSource type="POOLED"> <!-- 建立连接所需要参数:驱动串driver连接串url用户名username口令password --> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql:///test" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <!-- 用户注册映射元文件,目前xml和注解都有使用,所以两种方法都需要掌握 --> <mappers> <mapper resource="org/wpf/mapper/UserBeanMapper.xml" /> </mappers> </configuration>
3.定义对应的表结构
create table t_users( id bigint primary key auto_increment, username varchar(20) not null, password varchar(20) not null )engine=innodb default charset utf8;
4.定义映射元文件
一般建议名称和实体类的名称一致,例如UserBean.class对应UserBeanMapper.xml
<?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"> <!-- mapper用于定义映射信息,这里主要定义对应的CRUD操作的SQL语句.MyBatis是以SQL语句的工作量为代价换取高灵活性。 namespace用于定义名空间,避免应用SQL语句时的名称冲突,常见的定义方式有2种:一种定义为对应实体类的全名,另外一种采用 对应接口的全名 --> <mapper namespace="org.wpf.entity.UserBean"> <!-- 在映射文件中有4个最基本的标签,对应CRUD操作 :select insert update delete,需要执行哪个操作,就使用对应的标签进行定义 id是引用时的名称,在当前文件中不能重复。parameterType用于定义调用时需要传入的参数类型.resultType用于定义执行后返回值的 类型 --> <insert id="insert" parameterType="org.wpf.entity.UserBean"> <!-- 定义所需要执行的SQL语句,其中可以通过#{属性名}的方式,应用参数中的特定属性值 --> insert into t_users(username,password) values(#{username},#{password}); </insert> </mapper>
5.定义实体类
package org.wpf.entity; import java.io.Serializable; public class UserBean implements Serializable { private static final long serialVersionUID = 9048922400114421289L; private Long id; private String username; private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
6.测试
package org.wpf.test; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.wpf.entity.UserBean; public class Test { public static void main(String[] args) throws IOException { // 读取配置文件 Reader r = Resources.getResourceAsReader("mybatis-config.xml"); // 获取工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(r); // 获取session SqlSession session = factory.openSession(); // 创建对象 UserBean user = new UserBean(); user.setUsername("zhangsan"); user.setPassword("123456"); // 执行 int len = session.insert("org.wpf.entity.UserBean.insert", user); session.commit(); session.close(); if (len > 0) { System.out.println("插入数据成功!"); } } }
C.特点
1.简单易学
本身就很小且简单
2.灵活
mybatis不会对应用程序或者数据库的现有设计强加任何影响
sql写在xml里,便于统一管理和优化
通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能
3.接触sql与程序代码的耦合
通过提供DAL层,将业务逻辑和数据访问逻辑分离
使系统的设计更清晰,更易维护,更易单元测试
sql和代码的分离,提高了可维护性
4.提供映射标签,支持对象与数据库的orm字段关系映射
5.提供对象关系映射标签,支持对象关系组建维护
6.提供xml标签,持编写动态sql
D.MyBatis框架的优点
1. 与JDBC相比,减少了50%以上的代码量
2. MyBatis是最简单的持久化框架,小巧并且简单易学
3. MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用
4. 提供XML标签,支持编写动态SQL语句
5. 提供映射标签,支持对象与数据库的ORM字段关系映射
E.MyBatis框架的缺点
1. SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求
2. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
F.MyBatis框架适用场合
MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案
对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择
G.MyBatis发展历史
MyBatis本是apache的一个开源项目iBatis,
2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis
2013年11月迁移到Github
H.hibernate和mybatis对比
共性:
采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作
区别:
Hibernate是自动化的ORM类型工具,自动生成SQL语句,但是具有过度封装的嫌疑,扩展不方便,但是编码效率高,具备比较好的缓存支持;
MyBatis是半自动化的ORM类型工具,以编写SQL语句的工作量为代价换取了高灵活,但是SQL编码工作量大,缓存支持较差些
一般MyBatis在互联网应用开发中使用较多;传统的大型项目中Hibernate使用较多