前言
MyBatis 是一款优良的长久层框架,一个半 ORM(对象关系映射)框架,它反对定制化 SQL、存储过程以及高级映`射。MyBatis 防止了简直所有的 JDBC 代码和手动设置参数以及获取后果集。MyBatis 能够应用简略的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,一般老式 Java 对象)为数据库中的记录。
MyBatis的作用
MyBatis作用是在长久层也就是拜访数据库的操作,以前咱们拜访数据库是用JDBC来拜访数据库,JDBC拜访数据库须要写很多反复的代码,如果数据库拜访很多还须要对数据库连贯进行不停的关上连贯和敞开连贯,很耗费零碎性能
MyBatis封装了JDBC底层拜访数据库的代码,让咱们程序猿只须要关怀如何去写好SQL就好,不在须要去写JDBC底层的代码
MyBatis的优缺点
长处
- MyBatis封装了JBDC底层拜访数据库的细节,使咱们程序猿不须要与JDBC API打交道,就能够拜访数据库
- MyBatis简略易学,程序猿间接编写SQL语句,适宜于对SQL语句性能要求比拟高的我的项目
- SQL语句封装在配置文件中,便于对立治理与保护,升高了程序的耦合度
- SQL代码从程序代码中彻底分离出来,可重用
- 提供了动静SQL标签,反对编写动静SQL
- 提供映射标签,反对对象与数据库的ORM字段关系映射
毛病
- 过于依赖数据库SQL语句,导致数据库移植性差,更换数据库,如果SQL语句有差别,SQL语句工作量大
- 因为xml里标签id必须惟一,导致DAO中办法不反对办法重载
MyBatis的配置文件
properties元素
properties元素形容的都是内部化,可代替的属性
个别用来配置连贯数据源,咱们能够应用property子节点来配置也能够应用资源门路援用
应用property子节点来配置
<properties> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </properties>
应用资源门路援用
<properties resource="jdbcConfig.properties"/>
jdbcConfig.properties外面的属性
driver=com.mysql.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3306/testusername=rootpassword=123456
连贯数据源的配置
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>
如果应用property子节点来配置和应用资源门路援用都用了,这个时候MyBatis会调用哪个勒?MyBatis会调用资源门路援用的属性值,因为资源门路援用的优先级高于property子节点的优先级
settings元素
settings是 MyBatis 中极为重要的调整设置,它们会扭转 MyBatis 的运行时行为
<settings> <!-- 全局映射器启用缓存 --> <setting name="cacheEnabled" value="true"/> <!-- 查问时,敞开关联对象即时加载以进步性能 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 设置关联对象加载的状态,此处为按需加载字段 (加载字段由 SQL指 定 ),不会加载关联表的所有字段,以进步性能 --> <setting name="aggressiveLazyLoading" value="false"/> <!-- 对于未知的 SQL查问,容许返回不同的后果集以达到通用的成果 --> <setting name="multipleResultSetsEnabled" value="true"/> <!-- 容许应用列标签代替列名 --> <setting name="useColumnLabel" value="true"/> <!-- 容许应用自定义的主键值 (比方由程序生成的 UUID 32位编码作为键值 ),数据表的 PK生成策略将被笼罩 --> <setting name="useGeneratedKeys" value="true"/> <!-- 给予被嵌套的 resultMap以字段 -属性的映射反对 --> <setting name="autoMappingBehavior" value="FULL"/> <!-- 对于批量更新操作缓存 SQL以进步性能 --> <setting name="defaultExecutorType" value="BATCH"/> <!-- 数据库超过 25000秒仍未响应则超时 --> <setting name="defaultStatementTimeout" value="25000"/> </settings>
typeAliases元素
typeAliases元素的作用是给JavaBean取别名,不便咱们在mappeer配置文件中应用
当咱们没有给JavaBean取别名,mapper配置文件中获取JavaBean的时候,咱们就须要获取JavaBean所在我的项目外面的全门路
<!--省略局部代码--> <select id="login" resultType="cn.friday.pojo.DevUser"> SELECT * FROM dev_user WHERE devCode=#{devCode} AND devPassword=#{devPassword} </select>
接下来咱们就来给JavaBean取别名
<typeAliases> <typeAlias type="cn.friday.pojo.DevUser" alias="devUser"/> <typeAlias type="cn.friday.pojo.AppInfo" alias="appInfo"/> </typeAliases>
给每个JavaBean去取一个指定的别名,这样是有缺点的,万一我的项目中有很多个POJO那么工作量就大了,不过还有一种办法给指定的包外面所有的JavaBean都取一个别名,MyBatis会主动扫描所指定的包下的JavaBean并且给一个默认的别名,默认的别名为JavaBean的名称,请看上面
<typeAliases> <package name="cn.friday.pojo"/> </typeAliases>
mapper外面的配置文件就能够失常应用JavaBean取的别名了,不须要再去获取JavaBean的全门路了
<!--省略局部代码--> <select id="login" resultType="DevUser"> SELECT * FROM dev_user WHERE devCode=#{devCode} AND devPassword=#{devPassword} </select>
environments元素
MyBatis能够配置多种环境,如开发环境、测试环境、生产环境等,咱们能够灵便抉择不同的配置,从而将SQL映射利用到不同的数据库环境上.这些不同的运行环境咱们就能够用environments元素来配置实现
environments元素元素的配置
<!--开发环境--> <!--default属性示意在默认的状况下咱们将启用的数据源--> <environments default="development"> <!--id属性用来标识一个数据源的,不便在MyBatis中应用 --> <environment id="development"> <!-- 应用jdbc事务管理 --> <transactionManager type="JDBC"/> <!-- 配置数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> <!--咱们在来配置一个测试环境--> <environment id="test"> <!-- 应用jdbc事务管理 --> <transactionManager type="JDBC"/> <!-- 配置数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/test1"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments>
如果咱们想从开发环境变成测试环境只须要批改environments元素外面的default属性即可
<environments default="test"> <!--省略局部代码--> </environments>
mappers元素
mappers映射器,说简略点就是通知MyBatis去哪里找到SQL语句映射文件,咱们能够应用类资源门路或者是URL等
用类资源门路获取映射文件
<mappers> <mapper resource="cn/friday/dao/developer/DevUserMapper.xml"/> <mapper resource="cn/friday/dao/developer/AppInfoMapper.xml"/> </mappers>
用URL获取映射文件
<mappers> <mapper url="file:///D:/mappers/DevUserMapper.xml"/> <mapper url="file:///D:/mappers/AppInfoMapper.xml"/> </mappers>
如何实现MyBatis
先给大家看一下我的我的项目构造
第一步 导入依赖
我的是maven我的项目所以只须要在pox.xml配置文件中增加对于MyBatis的依赖即可
<?xml version="1.0" encoding="UTF-8"?><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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>MyBatis</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.4</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java/</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build></project>
第二步 创立MyBatis配置文件
这些配置文件下面也用讲的过这里就不做过多的解释了
<?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> <properties resource="jdbc-config.properties"/> <typeAliases> <package name="com.friday.pojo"/> </typeAliases> <environments default="test"> <environment id="test"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/friday/dao/UserMapper.xml"></mapper> </mappers></configuration>
jdbc-config.properties外面的属性
driver=com.mysql.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTCusername=rootpassword=123456
第三步 创立接口以及映射文件
接口,一般的java接口
package com.friday.dao;import com.friday.pojo.User;import org.apache.ibatis.annotations.Param;public interface UserMapper {//@Param绝对应给String userCode取了一个别名叫做userPassword,咱们到写映射SQL语句的时候只有#{注解名称}即可,如#{userPassword} public User login(@Param("userCode") String userCode,@Param("userPassword") String pwd);}
映射文件
<?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 namespace="com.friday.dao.UserMapper"> <select id="login" resultType="User" parameterType="string"> SELECT * FROM smbms_user WHERE userCode=#{userCode} AND userPassword=#{userPassword} </select></mapper>
mapper 文件外面的属性
- namespace属性 指定绝对应的接口
- id属性 接口外面具体的办法名
- resultType 返回值的类型
- resultType 传进来的参数的类型
第四步 测试
package com.friday.test;import com.friday.dao.UserMapper;import com.friday.pojo.User;import org.apache.ibatis.annotations.Param;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 java.io.IOException;import java.io.InputStream;public class MyBatisTest { public static void main(String[] args) throws IOException { //读取mybatis配置文件 String resource = "mybatis-config.xml"; //获取mybatis配置文件的输出流 InputStream is = Resources.getResourceAsStream(resource); //创立SqlSessionFactory对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); //关上sqlSession对象 SqlSession sqlSession = factory.openSession(); //获取对应的Mapper,让映射器通过命名空间和办法名称找到对应的SQL,发送给数据库执行后返回后果。 User user = sqlSession.getMapper(UserMapper.class).login("zhanghua","userPassword"); //看一下是否能够查到数据 if (user != null) { System.out.println("登录胜利"); } else { System.out.println("登录失败"); } //敞开sqlSession对象 sqlSession.close(); }}
最初
大家看完有什么不懂的能够在下方留言探讨,也能够关注我私信问我,我看到后都会答复的。也欢送大家关注我的公众号:前程有光,马上金九银十跳槽面试季,整顿了1000多道将近500多页pdf文档的Java面试题材料放在外面,助你圆梦BAT!文章都会在外面更新,整顿的材料也会放在外面。谢谢你的观看,感觉文章对你有帮忙的话记得关注我点个赞反对一下!