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); }
执行结果:
后记
今天记录下来的内容比较少,明天继续....