前言

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

正文

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. springboot在eclipse实现热部署

    eclipse使用spring-tool-suite插件创建springboot项目,项目创建完成后. 选中项目,右键 Spring Tools  --> Add Boot Devtools 点 ...

  2. 使用masonry手写约束

    在iOS开发过程中,手写contraints是非常痛苦的一件事情,往往那么一丢丢功能要写大量的代码,非常容易发生错误,并且非常不方便调试.所以只有在不得以的情况下才采用手工方式写contraints, ...

  3. 【POJ 1655】 Balancing Act

    [题目链接] 点击打开链接 [算法] 树形DP求树的重心 [代码] #include <algorithm> #include <bitset> #include <cc ...

  4. 【Codeforces 582A】 GCD Table

    [题目链接] 点击打开链接 [算法] G中最大的数一定也是a中最大的数.          G中次大的数一定也是a中次大的数. 第三.第四可能是由最大和次大的gcd产生的 那么就不难想到下面的算法: ...

  5. bzoj1089严格n元树——DP+高精度

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1089 f[d]为深度小于等于d的树的个数: 从根节点出发,有n个子树,乘法原理可以得到 f[ ...

  6. Java多线程:线程状态以及wait(), notify(), notifyAll()

    一. 线程状态类型1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运 ...

  7. Bootstrap-CL:下拉菜单

    ylbtech-Bootstrap-CL:下拉菜单 1.返回顶部 1. Bootstrap 下拉菜单(Dropdowns) 本章将重点介绍 Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格 ...

  8. 架构:template

    ylbtech-架构: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.cnbl ...

  9. centos查看CPU的数量

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  10. CodeForces 712C Memory and De-Evolution (贪心+暴力)

    题意:现在有一个长度为 x 的正三角形,每次可以把一条边减小,然后用最少的时间变成长度为 y 的正三角形. 析:一开始,正着想,然后有一个问题,就是第一次减小多少才能最快呢?这个好像并不好确定,然后我 ...