MyBatis
MyBatis与JDBC编程的比较
1.JDBC:数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可以解决此问题。
MyBatis:在mybatis配置文件中配置数据连接池,使用连接池管理数据库连接。
2.JDBC:Sql语句在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变Java代码。
MyBatis:将Sql语句配置在Xxxmapper.xml文件中与java代码分离。
3.JDBC:向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多页可能少,占位符需要和参数对应。
MyBatis:mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4.JDBC:对结构集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历;
MyBatis:mybatis自动将sql执行结构映射至java对象,通过statement中的resultType定义输出结构的类型。
parameterType 配置参数使用说明之前已经介绍了 SQL 语句传参,使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型( POJO 类)。基本类型和 String 我们可以直接写类型称 ,也可以使用全限定名的方式,例如:java.lang.String 。实体类类型,目前我们只能使用全限定类名。究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的实体类并没有注册别名,所以必须写全限定类名。
举例几个支持的默认别名如:
registerAlias("string", String.class);registerAlias("byte", Byte.class);
registerAlias("char", Character.class);
registerAlias("character", Character.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("char[]", Character[].class);
registerAlias("character[]", Character[].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("_char", char.class);
registerAlias("_character", char.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("_char[]", char[].class);
registerAlias("_character[]", char[].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);
resultType配置结构类型:
resultMap结构类型:
<!--
定义 resultMap,定义结果集映射规则
id 当前 resultMap 标识, 给定一个唯一标识,
type 映射的类型,指定实体类的全限定类名
-->
<resultMap id="userinfo" type="UserInfo">
<!-- 将结果集的 id 列的值映射到 UserinfoModel 的 id 属性中 -->
<id column="id" property="id" />
<!-- result 标签就是具体的结果集映射规则, 列 到 字段的映射关系 -->
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="name" property="name"/>
<result column="gender" property="gender"/>
<result column="birthday" property="birthday"/>
<result column="phone" property="phone"/>
<result column="email" property="email"/>
<result column="qq" property="qq"/>
<result column="img" property="img"/>
<result column="create_date" property="createDate"/>
<result column="update_date" property="updateDate"/>
<result column="state" property="state"/>
<result column="is_del" property="isDel"/>
</resultMap> id标签:用于指定主键字段
result标签:用于指定非主键字段
culumn属性:用于指定数据库表列名
property属性:指定实体类属性名称(别名)
resultMap和resultType区别:
rusuleMap如果查询出来的结果的列名和实体属性不一致,可以自定义别名来映射
rusultType查询结果显示的列名和实体的属性名必须一致,才能成功映射
Mybatis配置文件:
-properties(属性)--property
-settings(全局配置参数)--setting
- typeAliases(类型别名)-- typeAliase-- package @Alias
-typeHandlers(类型处理器)
-objectFactory(对象工厂)
-plugins(插件)
-environments(环境集合属性对象)--environment(环境子属性对象)---transactionManager(事务管理)---dataSource(数据源)
-mappers(映射器)--mapper--package
<properties><property name = "driver" value = "com.mysql.cj.jdbc.Driver" /><property name = "url" value = "jdbc:mysql://localhost:3306/kfm" /><property name = "username" value = "root" /><property name = "password" value = "" /></properties>
注:在之后我们可以使用 ${driver} 这样的表达式来去对应的 value 值
第二种:
driver = com.mysql.cj.jdbc.Driverurl = jdbc : mysql : //127.0.0.1 : 3306/kfmusername = rootpassword =
properties 标签配置
<!--配置连接数据库的信息resource 属性:用于指定 properties 配置文件的位置,要求配置文件必须在类路径下url 属性:指定的路径示例: url="file://D:/db.properties"--><!-- 读取配置文件 --><properties resource = "db.properties" />
此时dataSource标签就变成了引用上面的配置 如下:
<!-- 配置连接数据库的信息:用的是数据源(连接池) --><dataSource type = "POOLED" ><property name = "driver" value = "${driver}" /><property name = "url" value = "${url}" /><property name = "username" value = "${username}" /><property name = "password" value = "${password}" /></dataSource>
settings(全局配置):
<!-- settings 是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 --><settings><!--该配置影响的所有映射器中配置的缓存的全局开关。默认值true--><setting name = "cacheEnabled" value = "true" /><!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。默认值false--><setting name = "lazyLoadingEnabled" value = "true" /><!--是否允许单一语句返回多结果集(需要兼容驱动)。默认值true--><setting name = "multipleResultSetsEnabled" value = "true" /><!--使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。默认值true--><setting name = "useColumnLabel" value = "true" /><!--允许JDBC支持自动生成主键,需要驱动兼容。为true则这个设置使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作。默认值false--><setting name = "useGeneratedKeys" value = "false" /><!--指定MyBatis应如何自动映射列到字段或属性。NONE表示取消自动映射;PARTIAL只会自动映射没有定义嵌套结果集映射的结果集。FULL会自动映射任意复杂的结果集(无论是否嵌套)。默认值 PARTIAL--><setting name = "autoMappingBehavior" value = "PARTIAL" /><!--配置默认的执行器。SIMPLE就是普通的执行器;REUSE执行器会重用预处理语句(prepared statements );BATCH执行器将重用语句并执行批量更新。默认SIMPLE--><setting name = "defaultExecutorType" value = "SIMPLE" /><!-- 设置超时时间,它决定驱动等待数据库响应的秒数。--><setting name = "defaultStatementTimeout" value = "25" /><!--允许在嵌套语句中使用分页(RowBounds)默认值 false-><setting name = "safeRowBoundsEnabled" value = "false" /><!--是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN到经典 Java 属性名 aColumn 的类似映射。默认false--><setting name = "mapUnderscoreToCamelCase" value = "false" /><!--MyBatis利用本地缓存机制(Local Cache )防止循环引用( circular references )和加速重复嵌套查询。默认值为SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为statement,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。--><setting name = "localCacheScope" value = "SESSION" /><!--当没有为参数提供特定的JDBC类型时,为空值指定 JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,比如NULL、 VARCHAR 或 OTHER 。--><setting name = "jdbcTypeForNull" value = "OTHER" /><!-- 指定对象的哪个方法触发一次延迟加载。 --><setting name = "lazyLoadTriggerMethods"value = "equals,clone,hashCode,toString" /></settings>
在 mybatis-config.xml 中配置:
<typeAliases><!-- 单个别名定义 --><typeAlias type = "com.kfm.model.UserInfo" alias = "UserInfo" /><!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) --><package name = "com.kfm.model" /></typeAliases>
mappers(映射器)
resource:使用相对类路径的资源
<mapper resource = "com/kfm/dao.UserInfoDao.xml" />
class:使用mapper接口的类路径
<mapper class="com.kfm.mapper.UserInfoMapper"/>
url:使用绝对路径
<mapper url="file://D:/UserInfoMapper.xml"/>
package 标签:注册指定包下的所有 mapper 接口
<package name = "com.kfm.mapper" />