MyBatis学习笔记(二)
Mapper XML文件配置
SQL映射文件几个的元素
1、cache 给定命名空间的缓存配置
2、cache-ref 其他命名空间缓存配置的引用
3、resultMap 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
4、parameterMap 已废弃,老式风格的参数映射。内联参数是首选。这个元素可能在将来被移除,这里不会记录。
5、sql 可被其他语句引用的可重用语句块
6、insert 映射插入语句
7、update 映射更新语句
8、delete 映射删除语句
9、select 映射查询语句
☆ Select查询语句
1、Select
注意:
这里paramterType是接受一个int类型的参数,resultType是返回一个Map类型的对象,其中的键是列名,值便是结果行中的对应值。
2、select的属性
(1)id:在命名空间中的唯一标识符,可以被用来引用这条语句。
(2)paramterType:将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为MyBatis可以通过TypeHandler 推断出具体传入语句的参数,默认值为unset。
(3)resultType:从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用resultType或 resultMap,但不能同时使用。
(4)resultMap:外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用。
(5)useCache:将其设置为true,将会导致本条语句的结果被二级缓存,默认值:对 select元素为true。
(6)flushCache:将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。
(7)statementType:STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
☆ Insert插入语句
1、简单的Insert
insert into user(code,name,password)
values(#{code},#{name},#{password})
注意:
这里useGeneratedKeys,(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键(MySQL数据库中的自动递增字段)默认值:false。 keyProperty,(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis会通过getGeneratedKeys的返回值或者通过insert语句的 selectKey子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
2、insert的属性
☆ update更新语句
1、简单的update
update user set
code=#{code},name=#{name},password=#{password},update_time=#{update_time}
where userId=#{userId}
2、update的属性
☆ delete删除语句
1、简单的delete
delete from user where
userId=#{userId}
2、delete的属性
insert、update、delete属性
(1)id:在命名空间中的唯一标识符,可以被用来引用这条语句
(2)paramterType:将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
(3)flushCache:将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false。
(4)statementType:STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
(5)keyProperty:仅对(insert和update有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
(6)keyColumn:(仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
(7)useGeneratedKeys:(仅对insert和update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。
(8)timeout:这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。
☆ resultMap
1、resultMap
注意点:(1)id:当前命名空间中的一个唯一标识,用于标识一个resultmap.
(2)type:类的完全限定名, 或者一个类型别名.
(3)autoMapping:如果设置这个属性,MyBatis将会为这个ResultMap开启或者关闭自动映射。这个属性会覆盖全局的属性 autoMappingBehavior。默认值为:unset。
2、resultMap概念视图
constructor 用于在实例化类时,注入结果到构造方法中
idArg ID参数;标记出作为ID的结果可以帮助提高整体性能
arg 将被注入到构造方法的一个普通结果
id 一个ID结果;标记出作为ID的结果可以帮助提高整体性能
result 注入到字段或JavaBean属性的普通结果
association 一个复杂类型的关联;许多结果将包装成这种类型
嵌套结果映射 关联可以指定为一个resultMap元素,或者引用一个
collection 一个复杂类型的集合
嵌套结果映射集合可以指定为一个resultMap元素,或者引用一个
discriminator 使用结果值来决定使用哪个resultMap
case 基于某些值的结果映射
嵌套结果映射一个case也是一个映射它本身的结果,因此可以包含很多相 同的元素,或者它可以参照一个外部的 resultMap。
3、两个元素id、result都有的一些属性
property 映射到列结果的字段或属性。如果用来匹配的JavaBeans存在给定名字的属性,那么它将会被使用。否则 MyBatis 将会寻找给定名称 property 的字段。无论是哪一种情形,你都可以使用通常的点式分隔形式进行复杂属性导航。比如,你可以这样映射一些简单的东西: “username” ,或者映射到一些复杂的东西: “address.street.number” 。
column 数据库中的列名,或者是列的别名。一般情况下,这和传递给resultSet.getString(columnName) 方法的参数一样。
javaType 一个Java 类的完全限定名,或一个类型别名(参考上面内建类型别名的列表) 。如果你映射到一个 JavaBean,MyBatis 通常可以断定类型。 然而,如果你映射到的是 HashMap,那么你应该明确地指定javaType来保证期望的行为。
jdbcType JDBC类型,所支持的JDBC类型参见这个表格之后的“支持的JDBC 类型”。 只需要在可能执行插入、更新和删除的允许空值的列上指定JDBC类型。这是JDBC的要求而非MyBatis的要求。如果你直接面向JDBC编程,你需要对可能为null的值指定这个类型。
typeHandler 我们在前面讨论过的默认类型处理器。使用这个属性,你可以覆盖默 认的类型处理器。这个属性值是一个类型处理 器实现类的完全限定名,或者是类型别名。
数据库
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`userId` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(16) NOT NULL DEFAULT '',
`name` varchar(16) NOT NULL DEFAULT '',
`password` varchar(32) NOT NULL DEFAULT '123456',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'UC138', 'UN345', 'UP123', '2018-03-19 15:15:45', '2018-03-19 15:15:45');
INSERT INTO `user` VALUES ('2', 'UC120', 'UN983', 'UP430', '2018-03-19 15:15:54', '2018-03-19 15:15:54');
INSERT INTO `user` VALUES ('3', 'UC18', 'UN21', 'UP71', '2018-03-19 15:16:19', '2018-03-19 15:16:19');
INSERT INTO `user` VALUES ('4', 'UC41', 'UN76', 'UP13', '2018-03-19 15:16:34', '2018-03-19 15:16:34');