MyBatis学习(三)
前言
感觉学习进度还是比较慢啊,一整天的学习效率不是很高,一会看电视,一会喝茶,对自己的要求不严格...今天就说说关联表数据的插入以及别名的使用。
正文
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学习(三)的更多相关文章
- MyBatis学习(三)---MyBatis和Spring整合
想要了解MyBatis基础的朋友可以通过传送门: MyBatis学习(一)---配置文件,Mapper接口和动态SQL http://www.cnblogs.com/ghq120/p/8322302. ...
- mybatis学习三
Mybatis与pageHelper分页: 分页分为假分页和真分页对应的专业术语叫做逻辑分页和物理分页 逻辑分页:将所有的数据从数据库查询出来,根据需求截取符合要求的数据返回,方便统一但效 ...
- mybatis 学习三 关键文件解析
1: mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...
- mybatis 学习三 mapper xml 配置信息
mapper xml 映射文件 1,select 标签 简单是用就这样,其中resultType 代表从这条语句中返回的期望类型的类的完全限定名或别名.也可以使用resultMap对应的id ...
- mybatis学习三 数据库连接池技术
1.在内存中开辟一块空间,存放多个数据库连接对象.就是Connection的多个实例2. 连接池技术有很多,c3p0,dbcp,druid,以及JDBC Tomcat Pool, JDBC Tomca ...
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- MyBatis学习 之 三、动态SQL语句
目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...
- 【转】MyBatis学习总结(三)——优化MyBatis配置文件中的配置
[转]MyBatis学习总结(三)——优化MyBatis配置文件中的配置 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的con ...
- MyBatis学习总结(三)——多表关联查询与动态SQL
在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...
随机推荐
- springboot在eclipse实现热部署
eclipse使用spring-tool-suite插件创建springboot项目,项目创建完成后. 选中项目,右键 Spring Tools --> Add Boot Devtools 点 ...
- 使用masonry手写约束
在iOS开发过程中,手写contraints是非常痛苦的一件事情,往往那么一丢丢功能要写大量的代码,非常容易发生错误,并且非常不方便调试.所以只有在不得以的情况下才采用手工方式写contraints, ...
- 【POJ 1655】 Balancing Act
[题目链接] 点击打开链接 [算法] 树形DP求树的重心 [代码] #include <algorithm> #include <bitset> #include <cc ...
- 【Codeforces 582A】 GCD Table
[题目链接] 点击打开链接 [算法] G中最大的数一定也是a中最大的数. G中次大的数一定也是a中次大的数. 第三.第四可能是由最大和次大的gcd产生的 那么就不难想到下面的算法: ...
- bzoj1089严格n元树——DP+高精度
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1089 f[d]为深度小于等于d的树的个数: 从根节点出发,有n个子树,乘法原理可以得到 f[ ...
- Java多线程:线程状态以及wait(), notify(), notifyAll()
一. 线程状态类型1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运 ...
- Bootstrap-CL:下拉菜单
ylbtech-Bootstrap-CL:下拉菜单 1.返回顶部 1. Bootstrap 下拉菜单(Dropdowns) 本章将重点介绍 Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格 ...
- 架构:template
ylbtech-架构: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylbtech.cnbl ...
- centos查看CPU的数量
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...
- CodeForces 712C Memory and De-Evolution (贪心+暴力)
题意:现在有一个长度为 x 的正三角形,每次可以把一条边减小,然后用最少的时间变成长度为 y 的正三角形. 析:一开始,正着想,然后有一个问题,就是第一次减小多少才能最快呢?这个好像并不好确定,然后我 ...