一.基础概念
mybatis是一个优秀的基于java持久层的半自动映射框架 ,MyBatis是一个开源的数据持久层框架,内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射。作为持久层框架,主要思想是将程序中的大量的SQL语句分离出来,配置在相应的配置文件中,这样可以在不修改代码的情况下,直接在配置文件中的修改SQL ,让开发者只需要关注SQL语句本身 ,使用了ORM思想实现了对结果集的封装 大大简化了程序员的开发.
目前在Maven pom.xml导入的版本如下 :
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
二.核心配置文件SqlMapConfig.xml各种标签详解
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 引入外部配置文件--> 7 <properties resource="jdbcConfig.properties"></properties> 8 <!--配置开启二级缓存--> 9 <settings> 10 <setting name="cacheEnabled" value="true"/> 11 </settings> 12 13 <!--配置别名--> 14 <typeAliases> 15 <package name="com.itheima.domain"></package> 16 </typeAliases> 17 <!-- 配置环境--> 18 <environments default="mysql"> 19 <environment id="mysql"> 20 <transactionManager type="JDBC"></transactionManager> 21 <dataSource type="POOLED"> 22 <property name="driver" value="${jdbc.driver}"></property> 23 <property name="url" value="${jdbc.url}"></property> 24 <property name="username" value="${jdbc.username}"></property> 25 <property name="password" value="${jdbc.password}"></property> 26 </dataSource> 27 </environment> 28 </environments> 29 <!-- 指定带有注解的dao接口所在位置 --> 30 <mappers> 31 <package name="com.ws.dao"></package> 32 </mappers> 33 </configuration>
configuration :配置文件的根节点 ;
Properties :从外部引入指定的properties属性文件 一般为数据库连接的配置信息 列入 在核心配置文件中插入的jdbcConfig.properties
1 jdbc.driver=com.mysql.jdbc.Driver 2 jdbc.url=jdbc:mysql:///mybatis 3 jdbc.username=% 4 jdbc.password=root
Settings :设置mybatis运行中的行为 如果此次设置的的日志文件是log4j 就要用log4j实现日志功能
log4j代码如下
1 # Global logging configuration 2 log4j.rootLogger=DEBUG, stdout 3 # Console output... 4 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 5 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 6 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
Environments:表示配置多个运行环境 ,映射到不同的数据库 ,该元素可以配置多个environment子元素节点 ,但是必须要通过default指定一个默认的运行环境 .如此配置文件中引入的就是mysql .
Mappers:作用是告诉mybatis去哪里找SQL映射文件
Mapper:具体指定SQL映射文件的路径 ,resource属性的值表示映射路径的位置i.
<mappers> <mapper resource="cn/bdqn/dao/IUserMapper.xml" /> </mappers>
<typeAlias type="com.ws.domain.User" alias="User">
//给类型取别名 之后就不用写包名了
resultMap 可以封装多个属性 ,在返回数据多的情况下 ,可以避免使用resultType="hashMap"返回不易识别的Map对象 ,而可以直接返回封装的对象 ,如User .
可以<include refid="Base_Column_List"/>来插入相关的sql语句
<sql id="Base_Column_List" >
id, phone, email, nickname, password, avatar, create_time, last_login_time, status
</sql>
resultType //返回的数据类型 ,当多个参数的时候建议使用resultMap
需要注意的是 resultType和resultMap两个只能存在一个
dataSource元素使用标准的JDBC数据源接口配置JDBC连接对象的资源。
1.UNPOOLED:为每一个数据库操作创建一个新的连接,并关闭它,该方式只适用于只有小规模数量并发用户的简单应用程序上。
2.POOLED:创建一个数据库连接池,池中的一个连接将会被用作数据库操作,一旦完成,会将此连接返回给连接池,经常使用此种方式。
3.JNDI:从在应用服务器配置好的JNDI数据源datasource获取数据库连接,在生产环境中,优先考虑此方式。
三 .编写测试类的步骤
//1.获取字节输入流
InputStream in= Resources.getResourceAsStream("xxxxx".xml);
//2.根据字节输入流创建SqlSessionfactory
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
//3.根据factory创建SqlSession
SqlSession session=factory.openSession();
//4.使用SqlSession获取dao的代理对象
接口名 接口名对象=session.getMapper(接口名.class);
//5.执行dao方法 查询
接口名对象.执行的方法(参数);
//6.关闭sqlsession对象
session.close();
in.close();
五.MyBatis优缺点以及其适用场合
优点:
1.与JDBC相比,代码量减少了50%以上。
2.最简单的持久层框架,小巧简单易学
3.SQL语句写在XML文件,从程序代码中彻底分离,便于统一管理和优化,并可重用。
4.提供XML标签,支持编写动态SQL语句。
5.提供映射文件,支持对象与数据库的ORM字段关系映射。
缺点:
1.SQL编写工作量较大,对开发人员编写SQL语句的功底有一定的要求。
2.SQL依赖于数据库,数据库的移植性差,不能随意更换数据库。
适应场合:
专注于SQL本身,一个灵活的DAO层的解决方案,对性能要求较高,或者需求变化较多的项目。