Mybatis简介
- Mybatis是一个持久层框架。
- 支持定制化SQL、存储过程以及高级映射
为什么使用Mybatis
- 与Hibernate的区别
- Mybatis相比较与Hibernate更加简单易学
- Mybatis没有任何第三方依赖,最简单的安装只需要两个Jar文件
- Mybatis的使用不会对应用程序或数据库的现有设计有任何影响,灵活性强
- SQL语句写在XML文件里,解除了SQL语程序代码的耦合,通过提供DAO层将业务逻辑与数据访问逻辑分离,程序可维护性高
- 支持动态编写SQL
运行流程(框架架构)
- 加载配置
- SQL解析
- SQL执行
- 结果映射
涉及Jar包
- 核心包
- mybatis-x.x.x.jar
- Maven坐标
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
- 数据库驱动包
- mysql-connector-java-x.x.x-bin.jar
- Maven坐标
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.7</version> </dependency>
具体使用以及配置
- 查询
- 加载配置
- 配置文件结构
- 依赖
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
- 具体SqlMapConfig配置
<configuration> <!-- 配置环境,设置使用的连接以及所使用的数据库,可以配置多个环境 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <!-- 驱动、连接地址、用户名、密码的配置--> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 配置映射,可以通过resource直接调用其他mapper文件 --> <mappers> <mapper resource="Map.xml"/> <mapper namespace=""> <select id="findAllUser" resultType="packagename.User"> select * from user </select> </mapper> </mappers> </configuration>
注意,使用驱动不同时,property的name可能也会不同
- Map.xml文件配置
- 主要结构就是一个mapper标签,namespace作为文件的标识
- mapper标签中,可以配置想要的语句,程序利用mapper的namespace+语句的id去定位要使用的SQL语句
- Map.xml文件配置
- 依赖
- 将配置文件加载
- 主要是为了开启SQLSession以执行对数据库的操作
//加载资源 InputStream inputStream = Reasources.getResourceAsStream("SqlMapConfig.xml"); //具体路径视情况修改 //创建SqlSessionFactory对象 SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream); //由SqlSessionFactory对象开启SqlSession SqlSession ss = ssf.openSession();
- 主要是为了开启SQLSession以执行对数据库的操作
- 配置文件结构
- 调用方法进行查询
ss.selectOne("语句"); //此处的语句为在Map.xml配置文件中配置的namespace+id,即可以执行对应标签中的SQL语句
- 常用的查询方法
Object selectOne("语句"); //查询一条数据,其类型为在Map.xml文件中定义的resultType List selectList("语句"); //查询多条数据
- 常用的查询方法
- 结果输出
- 资源回收
ss.close();
- 加载配置
- 增加记录
- Map.xml的标签为
- 调用SqlSession的insert方法
sqlSession.insert("语句",Object); //Object为要插入的pojo类,此时的Pojo类可以视为一个参数列表
- Map.xml的标签为
- 删除记录
- Map.xml的标签为
- 调用SqlSession的delete方法
sqlSession.delete("语句",Object); //Object为要删除的pojo类,此时的Pojo类依然视为一个参数列表
- Map.xml的标签为
- 修改记录
- Map.xml的标签为
- 调用SqlSession的update方法
sqlSession.update("语句",Object); //Object为要修改的pojo类,此时的Pojo类依然视为一个参数列表
- Map.xml的标签为
动态SQL
- 传递参数
- 主要意义
- 实现了程序对SQL语句的控制
- ${}与#{}的区别
- #{}可以实现参数的输入,即Java与jdbc的类型转换,可以防止SQL注入
- ${}只能起到字符串拼接的作用,而且括号中只能是value,无法防止SQL的注入问题
- 主要意义
- 动态SQL
- Mybatis支持动态的标签输入
- if
- if标签中test即为判断条件,条件为真则输出if标签内的语句
- 需要做多条件判断时连接符为and而不是&&
select * from tableName where 1=1 <if test="id!=null"> and id=#{id} </if>
- where
- where标签可以处理第一个and
select * from tableName <where> <if test="id!=null and id!=''"> and id=#{id} </if> <if test="username!=null and username!=''"> and username like '%${username}%' </if> </where>
- where标签可以处理第一个and
- foreach
- collection为迭代的集合
- item为迭代变量
- separator为变量之间的分隔符
- open描述输出位置
<foreach collection="ids" open=" and id in(" close=")" item="id" separator="," > #{id} </foreach>
- sql片段
- 实现SQL语句的封装,以供调用
- 其他部分调用封装的SQL语句时使用include标签,在refid中填入SQL标签的id即可
<include refid="SqlId"/>
与Spring整合相关
- 主要思路
- 让Spring管理SqlSessionFactory对象,使其在整个应用中作为单例存在
- SqlSession对象可以从Spring容器中获取,简化操作
- Mapper代理中,可以从Spring容器中获取Mapper的代理对象
- 数据库的连接以及数据库连接池事务管理都交由Spring管理,MyBatis只做数据库操作
单独使用mybatis是有很多限制的,比如无法实现跨越多个session的事务,而且很多业务系统本来就是使用spring来管理的事务,因此mybatis最好与spring集成起来使用