MyBatis
介绍
简介
- MyBatis 是一款优秀的持久层框架(也叫ORM框架)
- MyBatis 极大简化 JDBC 操作
- MyBatis 通过简单的XML或注解来操作数据源
Hibernate 和 MyBatis 的区别
截取于http://c.biancheng.net/view/4302.html
1)sql 优化方面
- Hibernate 不需要编写大量的 SQL,就可以完全映射,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)对 POJO 进行操作。但会多消耗性能。
- MyBatis 手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。工作量相对大些。
2)开发方面
- MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO、SQL 和映射关系。
- Hibernate 是一个全表映射的框架,只需提供 POJO 和映射关系即可。
3)Hibernate 优势
- Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis 需要维护 SQL 和结果映射。
- Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。
- Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不同 SQL。
- Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机制不佳。
4)Mybatis优势
- MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。
- MyBatis 容易掌握,而 Hibernate 门槛较高。
总的来说,MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。
第一个MyBatis(基于Spring)
过程不懂可以查看官方文档
结构图如下:
依赖
1. mybatis 依赖包 (mybatis框架)
2. mysql 依赖包(连接mysql使用)
3. log4j 依赖包(日志查看用)
4. junit 依赖包(做测试类用)
# 自行在maven仓库查找
https://mvnrepository.com/search?q=sharding-transaction-spring-boot-starter
配置文件
文件名称任意
<!--
配置jdbc连接 和 Mapper.xml(编写SQL的文件)
-->
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--JDBC连接语句对应的键值-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/word"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--声明(注册)Mapper.xml文件-->
<!-- resource 文件路径 -->
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
Mapper配置文件
编写SQL的文件,温馨提示
- 配置文件名建议和Dao接口名一样,如:Dao层有个接口是UserDao,那XML创建名也是UserDao.xml
- Mapper文件是可以创建多个的
- 编写完成需要到上方配置文件里进行注册
<?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">
<!--
namespace="对应Dao层接口的全类名"
-->
<mapper namespace="org.mybatis.example.BlogMapper">
<!--
select:查询语句
id:接口里对应的方法名
resultType:返回类型,基本类型除外需要全类名
parameterType:传入的参数类型,基本类型除外需要全类名
-->
<select id="getUser" resultType="String" parameterType="String">
select * from Blog where id = #{id}
</select>
</mapper>
Dao层
Dao层一般用来存放操作SQL相关的内容,可以自定义名称不过相关路径配置也要修改,问题不大
在Dao层里面创建UserDao接口
package dao;
public interface UserDao {
//@Param是为了规范,让逻辑更加严谨,《拓展》章节会讲,这里不加也可以
//不加@Param String getUser(Integer a);
String getUser(@Param("id") Integer a);
}
调用
原始的调用方法,到了springboot
就不用这样子了,实在是麻烦
public class test {
@Test
public void dome1 () throws IOException {
//配置文件(不是Mapper那个)读取到流中
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//根据配置文件创建工厂
SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
//通过工厂获取SqlSession
SqlSession session= sqlSessionFactory.openSession();
//执行sql第一种方法(反射机制实例化对象,调用对象方法)
UserDao ud = session.getMapper(UserDao.class);
ud.getUser(1000);
//执行sql第二种方法(调用session查询一条记录的方法)
String a= session.selectOne("dao.UserDao.getUser",1000);
//释放资源
session.close();
}}
配置文件说明
<?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="mybatis.properties"/>
<!-- 设置交互的环境
如:二级缓存、延迟加载、日志等等
(海量数据优化方法 1.SQL定义索引 2.使用缓存机制(redis数据库) 3.Elasticsearch与solr(针对电商))
-->
<settings>
<setting name="" value=""/>
</settings>
<!-- 别名:可以方便我们设置sql接受和返回类型时不用写全类名 -->
<typeAliases>
<!--自定义类型的别名 type:类型的全类名 alias:自定义的别名 (特别方便,但不宜记忆和操作次数太大)-->
<typeAlias type="domian.user" alias="u"/>
<!--自动起别名 name=要起别名的文件/指定文件夹下的全部文件 (方便)
自动别名的名称就是类名 如:com.xiao.domain.User 别名:User,其实不区分大小写 -->
<package name="domian"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--
JDBC连接语句对应的键值,不引用配置文件情况下
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/word"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
-->
<!--
引用配置文件情况下(推荐,框架整合后维护性高)
加上 <properties resource="配置文件名"/> 到刚刚上面写的 引用配置文件 那个位置
value = ${引用文件对应的键}
引用配置文件mybatis.properties,mybatis.properties的内容如下:4个键值对
url=jdbc:mysql://localhost:3306/word?useSSL=false&serverTimezone=UTC
driver=com.mysql.jdbc.Driver
password=root
username=root
-->
<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.xml文件,必须的
写文件的相对路径
-->
<mapper resource="src/main/java/dom/UserDao.xml"/>
<mapper resource="src/main/resources/mybatis-config.xml"/>
</mappers>
</configuration>
标签 | 作用 |
---|---|
引用配置文件设置连接 | |
自定义别名,返回或传递参数时填写别名即可,就不用填写全类名 | |
自动别名,指定包下自动别名 | |
设置交互的环境,里面有许多的配置,如:二级缓存、延迟加载、日志等等 |
动态SQL
什么是动态SQL
根据不同的条件生成不同的sql语句,由此就需要对条件进行判断等一系列操作
Spring
1)where(针对查询语法的自动解析)
自动解析where条件的语句,来达到SQL的正确表达式
如:为了防止if查询是 select * from u_user where and id = 1000 这种不合法的的结果
加上where标签就会变为 select * from u_user where id = 1000
2)If(判断条件是否满足)
<!--
复杂查询(满足要求拼接where条件)
当name为空age不为空,那么where=( age <(转义符<) #{age} )
当name和age都不为空,那么where=(name like '%' #{name} '%' and name like '%' #{age} '%')以此类推
-->
<select id="selectBlog5" resultType="User" >
select * from u_user;
<where>
<if test="name!=null and name!=''">
<!-- 模糊查询 %{0,n}个字符 _{0,1}个字符 -->
name like '%' #{name} '%'
</if>
<if test="age!=null and age!=''">
<!-- < <的转义符 -->
age < #{age}
</if>