前言

感觉学习进度还是比较慢啊,一整天的学习效率不是很高,一会看电视,一会喝茶,对自己的要求不严格...今天就说说关联表数据的插入以及别名的使用。

正文

1.关联插入

  之前,我在数据库中已经创建了一张users表,现在我新增了一张手机表cellphone,用来记录用户手机的信息,结构如下所示:

  其中cellphone对应的实体类为:

package org.tonny.entity;

public class Cellphone
{
private int id; private int userId; private String number; private String city; public int getId()
{
return id;
} public void setId(int id)
{
this.id = id;
} public int getUserId()
{
return userId;
} public void setUserId(int userId)
{
this.userId = userId;
} public String getNumber()
{
return number;
} public void setNumber(String number)
{
this.number = number;
} public String getCity()
{
return city;
} public void setCity(String city)
{
this.city = city;
} @Override
public String toString()
{
return "Cellphone [id=" + id + ", userId=" + userId + ", number=" + number + ", city=" + city + "]";
} }

  cellphone中的字段user_id是外键,对应于users表的主键id。那现在我需要插入用户信息,同时包含他的手机信息该如何操作呢?思路是这样,先向users表中插入记录,然后再向cellphone中插入相关的记录,可是user_id如何获取成了一个难题。同样MyBatis为我们提供了解决方案,通过配置文件实现,配置信息如下:

<insert id="addUserBeforeCellphone" parameterType="org.tonny.entity.User">
<!-- 使用selectKey标签,用于主键返回
keyProperty:接受返回主键的属性,本例对应到实体类User的id属性
order:insert语句生成主键的时机,mysql在执行操作之后(即AFTER),oracle是在执行操作之前
resultType:返回给实体类User的Id属性的数据类型
SQL语句:生成主键值的sql语句:SELECT LAST_INSERT_ID()-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO users(name,age)
VALUES(#{name},#{age})
</insert> <insert id="addCellphone4User" parameterType="org.tonny.entity.Cellphone">
INSERT INTO cellphone(user_id, number, city)
VALUES(#{userId},#{number},#{city})
</insert>

我在增加user的时候,使用了selectKey标签,这个标签的作用就是用来返回数据插入users返回的主键值,其子标签内容也比较详细,不再赘述。同样的,我加入增加cellphone的语句。接着就是Java测试代码了:

public void addUserAndCellphone()
{
SqlSession sqlSession = sqlSessionFactory.openSession(); //插入User表
String sql = "org.tonny.mapper.UsersMapper.addUserBeforeCellphone";// 映射sql的标识字符串
User user = new User();
user.setName("Jerry Chien");
user.setAge(-2);
int result = sqlSession.insert(sql, user);
System.out.println("插入user执行结果:" + result); //插入手机号码
Cellphone cellphone = new Cellphone();
cellphone.setUserId(user.getId());
cellphone.setNumber("18915892672");
cellphone.setCity("nj");
sql = "org.tonny.mapper.UsersMapper.addCellphone4User";
result = sqlSession.insert(sql, cellphone);
System.out.println("插入cellphone执行结果:" + result); sqlSession.commit();
sqlSession.close();
}

  就是先插入users表,执行int result = sqlSession.insert(sql, user);后,MyBatis就会给user的id赋值,可以通过user.getId()取出来。然后再执行另外一条语句即可。

执行结果:

2.别名使用

  使用别名可以简化名字的使用。在mybatis.xml中增加配置信息,如下:

<!-- 定义别名 -->
<typeAliases>
<!-- type:源类型名称 alias:目标别名 下面的意思就是把"org.tonny.entity.User" 别名为 "user" -->
<typeAlias type="org.tonny.entity.User" alias="aliasUser" />
</typeAliases>

  我在这里定义了别名,将类型org.tonny.entity.User简化为user。这个标签要注意顺序,在properties之后,在enviroments之前,否则会报下面的错误。

  完整内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
<!-- 指定数据库信息文件 -->
<properties resource="db.properties"></properties> <!-- 定义别名 -->
<typeAliases>
<!-- type:源类型名称 alias:目标别名 下面的意思就是把"org.tonny.entity.User" 别名为 "user" -->
<typeAlias type="org.tonny.entity.User" alias="user" />
</typeAliases> <!-- 数据库环境配置如果和spring整合就不需要配置了,完全交给spring -->
<!-- environments中可以配置多个数据库,但是同一时间只能使用一个。
default标识当前默认使用的数据库,当前默认使用mysql
-->
<environments default="mysql">
<environment id="mysql">
<!-- 事务管理器,当前只使用了mybatis框架,所以使用jdbc事务管理器。
如果与spring集成的话,可以使用spring的事务管理器 -->
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息,使用数据库连接池(POOLED)方式连接 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${name}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments> <!-- 管理每张表的映射文件 -->
<mappers>
<!-- 需要将每张表的配置文件加载进来,使用resource引入 -->
<mapper resource="org/tonny/mapper/UsersMapper.xml" />
<mapper resource="org/tonny/mapper/PersonMapper.xml" />
</mappers>
</configuration>

这样就可以使用了,下面代码配置了通过别名的方式来查询数据。

<select id="getUserByMapUsingAlias" parameterType="java.util.Map" resultType="user">
SELECT *
FROM users WHERE id=#{id} and name like #{name}
</select>

测试代码如下:

@Test
public void getUserByMapUsingAlias()
{
SqlSession sqlSession = sqlSessionFactory.openSession();
// 映射sql的标识字符串
String sql = "org.tonny.mapper.UsersMapper.getUserByMapUsingAlias";
Map<String, Object> param = new HashMap<String, Object>();
param.put("id", 1);
param.put("name", "%Chien%");
List<User> userList = sqlSession.selectList(sql, param);
sqlSession.close();
System.out.println(userList);
}

执行结果:

后记

  今天记录下来的内容比较少,明天继续....

MyBatis学习(三)的更多相关文章

  1. MyBatis学习(三)---MyBatis和Spring整合

    想要了解MyBatis基础的朋友可以通过传送门: MyBatis学习(一)---配置文件,Mapper接口和动态SQL http://www.cnblogs.com/ghq120/p/8322302. ...

  2. mybatis学习三

    Mybatis与pageHelper分页:    分页分为假分页和真分页对应的专业术语叫做逻辑分页和物理分页    逻辑分页:将所有的数据从数据库查询出来,根据需求截取符合要求的数据返回,方便统一但效 ...

  3. mybatis 学习三 关键文件解析

    1:  mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...

  4. mybatis 学习三 mapper xml 配置信息

    mapper xml 映射文件 1,select 标签      简单是用就这样,其中resultType 代表从这条语句中返回的期望类型的类的完全限定名或别名.也可以使用resultMap对应的id ...

  5. mybatis学习三 数据库连接池技术

    1.在内存中开辟一块空间,存放多个数据库连接对象.就是Connection的多个实例2. 连接池技术有很多,c3p0,dbcp,druid,以及JDBC Tomcat Pool, JDBC Tomca ...

  6. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  7. MyBatis学习 之 三、动态SQL语句

    目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...

  8. 【转】MyBatis学习总结(三)——优化MyBatis配置文件中的配置

    [转]MyBatis学习总结(三)——优化MyBatis配置文件中的配置 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的con ...

  9. MyBatis学习总结(三)——多表关联查询与动态SQL

    在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...

随机推荐

  1. Swift语言学习(四)字符串与Array等集合的使用

    Swift 提供了C和Objective-C基础类型的自己一套版本,包括用于整型的Int,用于浮点值的Double和Float,用于布尔值的Boolean,和用于文本数据的String.Swift还提 ...

  2. codeforces 460A Vasya and Socks 解题报告

    题目链接:http://codeforces.com/problemset/problem/460/A 题目意思:有一个人有 n 对袜子,每天早上会穿一对,然后当天的晚上就会扔掉,不过他会在 m 的倍 ...

  3. hadoop Namenode因硬盘写满无法启动

    当写元数据的分区写满,可能导致namenode挂掉从而导致及时清理出大块的空间也无法启动namenode,那此时系统namenode会报错 org.apache.hadoop.hdfs.server. ...

  4. 自定义UITabBarController

    用的时候直接拷贝代码即可. 1.在AppDelegate设置跟控制器为:PQTabBarController #import "PQTabBarController.h" @int ...

  5. javascript之存储数据-cookie,localStorage,sessionStorage

    cookie: 存储一些简单的数据,以文本形式放到本地,大小4kb 存储:document.cookie='name=value' 取值:document.cookie(字符串) 期限:expires ...

  6. 聊聊Spring的核心组件

    Spring的核心是IOC容器,它本质上是一个bean关系集合.而要实现它也是有beans,context,core三个模块完成的. beans包主要是负责bean的定义,创建和解析工作,里面用到了简 ...

  7. CMake 手册详解(二十)

    SirDigit CMake 手册详解(二十) CMD#51: list 列表操作命令. list(LENGTH <list> <output variable>) list( ...

  8. Codeforces - 1114B - Yet Another Array Partitioning Task - 构造 - 排序

    https://codeforces.com/contest/1114/problem/B 一开始叫我做,我是不会做的,我没发现这个性质. 其实应该很好想才对,至少要选m个元素,其中m个作为最大值,从 ...

  9. 洛谷 - P2602 - 数字计数 - 数位dp

    https://www.luogu.org/problemnew/show/P2602 第二道数位dp,因为“数位dp都是模板题”(误),所以是从第一道的基础上面改的. 核心思想就是分类讨论,分不同情 ...

  10. python 之 random 模块、 shutil 模块、shelve模块、 xml模块

    6.12 random 模块 print(random.random()) (0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3)) [1,3] 大 ...