MyBatis简介
MyBatis是一个优良的长久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只须要关注SQL自身,而不须要破费精力去解决例如注册驱动、创立connection、创立statement、手动设置参数、后果集检索等jdbc繁冗的过程代码。
Mybatis通过xml或注解的形式将要执行的各statement(statement、preparedStatemnt)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最初由mybatis框架执行sql并将后果映射成java对象并返回。
总之,Mybatis对JDBC拜访数据库的过程进行了封装,简化了JDBC代码,解决JDBC将后果集封装为Java对象的麻烦。
MyBatis的劣势
1.应用传统形式拜访数据库
(1)应用JDBC拜访数据库有大量反复代码
(2)JDBC本身没有连接池,会繁琐的创立连贯和敞开连贯,效率低
(3)SQL是写死在程序中,一旦批改SQL,须要对类进行从新编译
(4)对查问SQL执行后返回的ResultSet对象,须要手动解决,有时会特地麻烦
2.应用MyBatis框架拜访数据库
(1)MyBatis对JDBC进行了封装,能够简化JDBC代码
(2)MyBatis本身反对连接池(也能够配置其余的连接池),因而能够进步程序的效率
(3)MyBatis是将SQL配置在mapper文件中,批改SQL只是批改配置文件,类不要编译
(4)对查问SQL执行后返回的ResultSet对象,MyBatis会帮咱们解决,转换成Java对象
总之,JDBC中的所有问题在MyBatis框架中简直失去了解决!
MyBatis架构图剖析
Mybatis架构图:
(1)mybatis-config.xml是MyBatis的外围配置文件,通过其中的配置能够生成SqlSessionFactory,也就是SqlSession工厂
(2)基于SqlSessionFactory能够生成SqlSession对象
(3)SqlSeesion是个既能够发送SQL去执行,并返回后果,相似于JDBC中的Connerction对象,也就是MyBatis中至关重要的一个对象
(4)Executor是SqlSession底层的对象,用于执行SQL语句
(5)MapperStatement对象也是SqlSession底层的对象那个,用于接管输出映射(SQL语句中的参数),以及做输入映射(即SQL查问的后果映射成相应的后果)
MyBatis配置文件剖析
mybatis-config.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">
<!-- MyBatis的全局配置文件 -->
<configuration >
<!-- 1.配置环境,可配置多个环境(比方:develop开发、test测试) --><environments default="develop"> <environment id="develop"> <!-- 1.1.配置事务管理形式:JDBC/MANAGED JDBC:将事务交给JDBC治理(举荐) MANAGED:本人治理事务 --> <transactionManager type="JDBC"></transactionManager> <!-- 1.2.配置数据源,即连接池 JNDI/POOLED/UNPOOLED JNDI:已过期 POOLED:应用连接池(举荐) UNPOOLED:不应用连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/yonghedb?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment></environments><!-- 2.导入Mapper配置文件,如果mapper文件有多个,能够通过多个mapper标签导入 --><mappers> <mapper resource="EmpMapper.xml"/></mappers>
</configuration>`
MyBatis中的占位符
在增删改查操作中,SQL语句中的值是写死在SQL语句中,而理论开发中,次处的值往往是用户提交过去的值,因而这里咱们须要将SQL中写死的值替换为占位符。
在mybatis中占位符有两个,别离是#{}占位符和${}占位符:
**#{}:相当于JDBC的问号(?)占位符,是为SQL语句中的参数进行占位,大部分状况都是应用#{}占位符;并且#{}占位符是为字符串或者日期类型的值进行占位时,在参数值传过来替换占位符的同时,会进行本义解决(在字符串或日期类型的值的两边加上单引号);
${}:**是为SQL片段(字符串)进行展位,将传过来的SQL片段间接拼接**在${}占位符所在的地位,不会进行任何的转移操作。(因为是间接将参数拼接在SQL语句中,因而可能会引发SQL注入攻打问题.
须要留神的是:应用${}占位符为SQL语句中的片段占位时,即便只有一个占位符,须要传的也只有一个参数,也须要将参数进行封装在传递!**
Mapper接口开发
(一)为什么要应用Mapper接口开发?
1.在测试用例中,在调用Session的办法时候,都会传入要调用的SQL的namespace+id名称,这不是必须的,能够只传入id即可。然而如果在Mybatis的环境中有多个雷同id的映射名称,就会报错,所以,个别状况下,调用办法最好还是应用namespace+id。
2.然而,namespace+id的应用形式很容易报错,因为String类型的,没有查看。所以mybatis提供了一种十分好的设计形式来防止这种问题,即Mapper接口。
**接口的开发标准:namespace的值=接口的包名+类名
留神:**
*1、包名+类名=xxxMapper.xml中的namespace的值
2、接口中办法名=mapper.xml中具体的SQL语句定义的值
3、办法的返回值和参数要和映射文件中统一(当数据库的字段名和对象的属性名统一时,能够简略属性resultType。然而数据库中的字段名称和对象中的属性名称不统一时,就须要resultMap属性)*
public List<User> all(); //这是接口中的办法
(二)MyBatis怎么做的?
@Test public void testMapper(){ SqlSession session = MyBatisUtil.openSession(); try{ UserMapper mapper = session.getMapper(UserMapper.class); System.out.println(mapper.getClass().getName()); }finally{ session.close(); } }
打印后果:$Proxy4
很简略,mybatis为接口做了一个动静代理。在执行UserMapper接口下面的办法时,参考接口的群路径名,即可找到对应的UserMapper.xml,在执行接口下面的每一个参数的时候,实际上就是执行namespace+id,mybatis在依据定义的办法的元素,抉择调用适合的session的办法来执行,并传入参数就能够。
应用Mapper接口的形式,在Spring+MyBatis也十分不便。因为咱们能够间接把Mapper接口看成dao接口了。
(三)接口开发的三个特点
1、Mapper接口的办法名和mapper.xml中定义sql的id值雷同
2、Mapper接口的办法接口的参数类型和mapper.xml定义的sql的parameterType类型雷同
3、Mapper接口办法的返回值类型和mapper.xml中定义的sql的resultType的类型雷同