MyBatis(一)

一、主流持久层框架

框架特点:

JDBC:开启关闭连接步骤重复且使用繁琐,不过除此之外中间代码比较灵活

Hibernate:省去了JDBC连接开启关闭的繁琐,有自己的HQL语言简化使用,但随着版本迭代框架越来越重,在编写复杂的SQL语句时不够灵活

MyBatis:继承了JDBC和Hibernate的优点,即灵活又简化使用

1)JDBC的使用

tb_user
tb_message 
先开第一扇门,再开第二扇第三扇门;关闭的时候从后往前先先关第三扇门,再关第二扇第一扇门

2)Hibernate的使用——代码感觉不是在操作数据库

hibernate.cfg.xml
 User.hbm.xml
会话开启相当于打开连接,连接打开后才能输入语句

3)Mybatis的使用

3.1)数据库连接信息

mybatis-config.xml
jdbc.properties
mybatis-config.xml
mybatis-config.xml
mybatis-config.xml
mybatis-config.xml

3.2)数据库table信息——包含映射方式,编写SQL,是否开启缓存,级联查询

UserMapper.xml
UserMapper.xml
UserMapper.xml
读取配置文件建立会话
获取Mapper
UserMapper.class已经在读取配置文件时跟UserMapper.xml建立好了映射
查询方式和Hibernate一样,同时可以自己编写SQL具备灵活性

MyBatis优点:

1.可以配置

2.可以

3.支持

4.支持,在注意命名规则的基础上,(比如驼峰映射,大多数框架采用约定大于限制,限制增加框架重量不灵活)

5.MyBatis提供接口编程的映射器,只需要一个接口和映射文件便可以运行(\color{red}接\color{red}口\color{red}和\color{red}映\color{red}射\color{red}文\color{red}件\color{red}联\color{red}系\color{red}是\color{red}通\color{red}过\color{red}代\color{red}理

6.(数据库连接信息——jdbc.properties,对表所有操作的信息——UserMapper.xml)甚至UserMapper.xml都可以删除,只需要一个实现类实现UserMapper接口即可,不会影响上层代码

二、如何使用MyBatis

1)Select

映射关系:

1.自动映射:mybatis-config.xml的标签中配置mapUnderscoreToCamelCase的值为true开启驼峰映射

2.手动映射:在Mapper.xml中添加标签手动设置POJO字段和数据库字段之间的映射

查询入参:基本类型;注解方式(入参小于等于5建议使用注解方式);Map类型(入参大于5可以使用Map,很少用);Pojo对象

使用举例:基本类型(getUserById(long id)),注解类型(getUserById(@Param("id")long id)),Map类型(getUserByMap(Map params)),Pojo对象(getUserByUser(User user)) 

基本类型
注解方式
注解方式:arg0、arg1表示参数一、参数二;param1、param2表示参数一、参数二
map类型
Pojo对象

2)Insert

3)Update

4)Delete

5)入参和结果集

${}与#{}的区别?

${}采用的方式构建SQL

#{}采用的方式构建SQL

结果集为map类型:不管是返回值为map还是入参为map,都是以数据为导向而不是业务为导向。(所以使用map的场景一般以获取数据为主要目的,比如我们需要查出五张表的数据,分别每张表从中抽取部分数据拼装成一个新表,此时可以使用map作为返回值

查询返回map类型

结果集为Bean:大部分情况下都会采用此种返回值方式

查询返回Bean

6)级联

association
association
collection
collection
collection

7)缓存

一级缓存:也称为本地缓存,本地缓存默认开启且无法跨sqlSession(MySQL服务层的session)使用

二级缓存:二级缓存需要在Mapper.xml文件中配置标签,然后手动执行commit()方法,才能启动生效

8)动态SQL

8.1)if&test的使用

8.2)choose&when&otherwise组合标签的使用

8.3)where、trim、set的使用

where标签
trim标签

8.4)foreach的使用

8.5)bind、concat的使用

bind
concat

三、动态代理

1)反射

JDK动态代理以反射机制为基础进行实现

2)JDK动态代理

由JDK的java.lang.reflect.* 包提供支持。

实现步骤:

1 > 编写服务类和接口,在JDK动态代理中是必须的

2 > 实现接口

3 > 编写代理类,提供绑定和代理方法

特点:Java动态代理是利用生成一个实现被代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理

3)CGLIB字节码生成代理

由net.sf.cglib.proxy.* 包提供支持。

实现步骤:

1 > 实现接口

2 > 编写代理类,提供绑定和代理方法

特点:cglib动态代理利用asm开源包,将被代理对象类的class文件加载进来,通过修改其生成子类来处理

你可能感兴趣的:(MyBatis(一))