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的类型相同
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。