本文是Mybatis的初步了解。
Mybatis是为数不多的跟着官网学习,就能学明白的,建议多看看官方文档。传送门:Mybatis官网
什么是Mybatis
官网简介:
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
提取关键字:
- 持久层框架
sql拼接、动态sql、自定义sql- 自动映射(包括1、简单数据类型自动映射 2、实体类映射 3、结果集映射)
Xml配置
mybatis最牛逼的地方就是它的ORM(Object RelationShip Mapping)自动关系映射(半自动的,复杂对象需要我们手动配置映射关系)。使用
Xml配置sql语句,参数,结果集。使得java代码和sql语句分离,便于错误定位,和维护。
Xml里通过标签来定义sql语句,结构清晰。
关于持久化
将内存中的数据写入磁盘中的过程成为持久化。我们也可以自己通过io将数据写入本地磁盘,只不过数据库包含数据库引擎以及数据结构,无论是便利性还是性能都肯定优于我们自己写的io。
mybatis自定义sql
通过mybatis处理过的sql和我们在客户端执行的sql没有两样。
一般来说我们需要传入参数,根据参数来对我们的sql进行动态拼接。
mybatis提供的标签就可以控制sql的动态拼接,比如:标签,标签,甚至是自定义标签。
自动映射
看一下这个类
org.apache.ibatis.type.TypeAliasRegistry他会将所有的关系映射都放入TypeAliasRegistry这个类的tapeAliases的HashMap中。映射关系是别名(Alias)对应类class。包括简单类型、实体类类型和其他的,比如说数据源POOLED对应PooledDatasourceFactory.class。
private final Map<String, Class<?>> typeAliases = new HashMap<>();
public TypeAliasRegistry() {
registerAlias("string", String.class);
registerAlias("byte", Byte.class);
registerAlias("long", Long.class);
registerAlias("short", Short.class);
registerAlias("int", Integer.class);
registerAlias("integer", Integer.class);
registerAlias("double", Double.class);
registerAlias("float", Float.class);
registerAlias("boolean", Boolean.class);
registerAlias("byte[]", Byte[].class);
registerAlias("long[]", Long[].class);
registerAlias("short[]", Short[].class);
registerAlias("int[]", Integer[].class);
registerAlias("integer[]", Integer[].class);
registerAlias("double[]", Double[].class);
registerAlias("float[]", Float[].class);
registerAlias("boolean[]", Boolean[].class);
registerAlias("_byte", byte.class);
registerAlias("_long", long.class);
registerAlias("_short", short.class);
registerAlias("_int", int.class);
registerAlias("_integer", int.class);
registerAlias("_double", double.class);
registerAlias("_float", float.class);
registerAlias("_boolean", boolean.class);
registerAlias("_byte[]", byte[].class);
registerAlias("_long[]", long[].class);
registerAlias("_short[]", short[].class);
registerAlias("_int[]", int[].class);
registerAlias("_integer[]", int[].class);
registerAlias("_double[]", double[].class);
registerAlias("_float[]", float[].class);
registerAlias("_boolean[]", boolean[].class);
registerAlias("date", Date.class);
registerAlias("decimal", BigDecimal.class);
registerAlias("bigdecimal", BigDecimal.class);
registerAlias("biginteger", BigInteger.class);
registerAlias("object", Object.class);
registerAlias("date[]", Date[].class);
registerAlias("decimal[]", BigDecimal[].class);
registerAlias("bigdecimal[]", BigDecimal[].class);
registerAlias("biginteger[]", BigInteger[].class);
registerAlias("object[]", Object[].class);
registerAlias("map", Map.class);
registerAlias("hashmap", HashMap.class);
registerAlias("list", List.class);
registerAlias("arraylist", ArrayList.class);
registerAlias("collection", Collection.class);
registerAlias("iterator", Iterator.class);
registerAlias("ResultSet", ResultSet.class);
}