初识MyBatis

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

<!--根据用户Id查询用户的所有信息-->
<select id="selectUserById" paramterType="int" resultType="map">
select * from user where userId=#{userId}
</select>


注意:
这里paramterType是接受一个int类型的参数,resultType是返回一个Map类型的对象,其中的键是列名,值便是结果行中的对应值。

2、select的属性

<select
 id="selectPerson"
 parameterType="int"
 parameterMap="deprecated"
 resultType="hashmap"
 resultMap="personResultMap"
 flushCache="false"
 useCache="true"
 timeout="10000"
 fetchSize="256"
 statementType="PREPARED"
 resultSetType="FORWARD_ONLY">

(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 id="insertUser" useGeneratedKeys="true" keyProperty="userId">
    insert into user(code,name,password)
    values(#{code},#{name},#{password})
</insert> 


注意:
这里useGeneratedKeys,(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键(MySQL数据库中的自动递增字段)默认值:false。 keyProperty,(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis会通过getGeneratedKeys的返回值或者通过insert语句的 selectKey子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

2、insert的属性

<insert
    id="insertUser"
    parameterType="User"
    flushCache="true"
    statementType="PREPARED"
    keyProperty="userId"
    keyColumn=""
    useGeneratedKeys=""
    timeout="20">

☆ update更新语句

1、简单的update

<update id="updateUser"> update user set
    code=#{code},name=#{name},password=#{password},update_time=#{update_time}
    where userId=#{userId}
</update>

2、update的属性

<update
    id="updateUSer"
    parameterType="User"
    flushCache="true"
    statementType="PREPARED"
    timeout="20">

☆ delete删除语句

1、简单的delete

<delete id="deleteUser" parameterType="int">
    delete from user where
    userId=#{userId}
</delete>

2、delete的属性

<delete
    id="deleteUser"
    parameterType="User"
    flushCache="true"
    statementType="PREPARED"
    timeout="20">

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

<resultMap id="UserResultMap" type="User">
    <id column="userId" property="userId" jdbcType="INTEGER" />
    <result property="code" column="code" javaType="java.lang.String"
        jdbcType="VARCHAR" />
    <result property="name" column="name" javaType="java.lang.String"
        jdbcType="VARCHAR" />
    <result property="password" column="password" javaType="java.lang.String"
        jdbcType="VARCHAR" />
    <result property="create_time" column="create_time" javaType="java.lang.String"
        jdbcType="VARCHAR" />
    <result property="update_time" column="update_time" javaType="java.lang.String"
        jdbcType="VARCHAR" />
</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');
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,500评论 0 4
  • MyBatis学习笔记(一) 1、什么是MyBatis2、安装3、第一个mybatis实例 前言 1、ORM:Ob...
    二十四小时爱你阅读 383评论 0 1
  • Java数据持久化之mybatis 一. mybatis简介 1.1 原始的JDBC操作: Java 通过 Jav...
    小Q逛逛阅读 4,910评论 0 16
  • 看到今天的晨读,脑子里马上出现两个好朋友,一个温文尔雅,一个蕙质兰心。 辉儿总是话不多,却在你困惑的时候温柔地给予...
    如意ylm阅读 169评论 0 2
  • 一年一度除夕时, 正是家人团圆日。 春风暖得人心醉, 笑语相逢新年好!
    红雲说口才阅读 162评论 0 0