1.使用@Select注解书写简单sql
/**
* 使用Select注解
* @param id
* @return
*/
@Select("SELECT code from user where id = #{id}")
String selectCodeById(String id);
我们看下控制台的执行
2019-08-02 10:29:58.248 DEBUG 228 --- [nio-8080-exec-5] c.e.d.mapper.UserMapper.selectCodeById : ==> Preparing: SELECT code from user where id = ?
2019-08-02 10:29:58.248 DEBUG 228 --- [nio-8080-exec-5] c.e.d.mapper.UserMapper.selectCodeById : ==> Parameters: 1(String)
2019-08-02 10:29:58.249 DEBUG 228 --- [nio-8080-exec-5] c.e.d.mapper.UserMapper.selectCodeById : <== Total: 1
2.使用常见类型的类型别名
接口
/**
* 测试基础类型别名
* @param id
* @return
*/
int selectAgeById(String id);
xml文件
<select id="selectAgeById" resultType="_int">
select age from user where id = #{id}
</select>
下面是常见可以使用别名的类型 (注意基本类型名称重复导致的特殊处理)
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | Arraylist |
collection | Collection |
iterator | Iterator |
3.使用resultMap封装对象
我们在数据库关系中经常会出现一对一和一对多的关系,在有的时候需要同时查出,这时候通过对resultMap的封装就可以一次性从数据库取出了。
先看数据模型
现有user用户表,department部门表,user_linkman用户联系人表。
其中关系为每个用户只会归属于一个部门,每个用户会有多个联系人。
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(2) unsigned DEFAULT NULL,
`departmen_id` int(11) NOT NULL COMMENT '部门id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '部门id',
`department_name` varchar(255) DEFAULT NULL COMMENT '部门名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='部门表';
CREATE TABLE `user_linkman` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户联系人表主键id',
`user_id` int(11) DEFAULT NULL COMMENT '用户id',
`linkman_id` varchar(255) DEFAULT NULL COMMENT '联系人id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='用户联系人表';
用户表的实体类结构如下,因为我们使用了@Data注解,所以不需要再写getter和setter这些方法了。
package com.example.demo.entity;
import lombok.Data;
import java.util.List;
@Data
public class User {
private String id;
private String code;
private String name;
private int age;
/**
* 部门
*/
private Department department;
/**
* 联系人集合
*/
private List<UserLinkman> linkmenList;
}
现有业务需求通过用户id查出用户的所有信息
我们可以这么设置
<resultMap id="userResultMap" type="User">
<id property="id" column="id" />
<result property="code" column="code" />
<result property="name" column="name" />
<result property="age" column="age" />
<association property="department" column="departmen_id" javaType="Department" select="selectDepartMentById" />
<association property="linkmenList" column="id" javaType="list" select="selectLinkmanListByUserId" />
</resultMap>
<select id="selectDepartMentById" resultType="Department">
select id , department_name departmentName from department where id = #{id}
</select>
<select id="selectLinkmanListByUserId" resultType="UserLinkman">
select id ,user_id userId, linkman_id linkmanId from user_linkman where user_id = #{id}
</select>
<select id="Sel" resultMap="userResultMap">
select * from user where id = #{id}
</select>
在查询中我们通过selectDepartMentById查询出用户所属的部门将部门的所有信息封装在department这个字段,通过selectLinkmanListByUserId把用户联系人封装在linkmenList这个字段了,注意这里的javaType为list因为联系人是多个就不能只用UserLinkman来封装了。
这里还可以使用另外一个封装集合的语句,和刚才的结果是一样的。
<resultMap id="userResultMap" type="User">
<id property="id" column="id" />
<result property="code" column="code" />
<result property="name" column="name" />
<result property="age" column="age" />
<association property="department" column="departmen_id" javaType="Department" select="selectDepartMentById" />
<collection property="linkmenList" javaType="list" column="id" ofType="UserLinkman" select="selectLinkmanListByUserId" />
</resultMap>
<select id="selectDepartMentById" resultType="Department">
select id , department_name departmentName from department where id = #{id}
</select>
<select id="selectLinkmanListByUserId" resultType="UserLinkman">
select id ,user_id userId, linkman_id linkmanId from user_linkman where user_id = #{id}
</select>
<select id="Sel" resultMap="userResultMap">
select * from user where id = #{id}
</select>