mybatis入门篇:Mapper接口/关联查询/新增数据
1、数据准备

2、编写实体类
package com.forest.owl.entity;
import java.util.Date;
public class User {
private Long id;
private String userName;
private String userPassword;
private String userPhone;
private String userEmail;
private byte[] headImg;
private Date createTime;
private Date updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserPhone() {
return userPhone;
}
public void setUserPhone(String userPhone) {
this.userPhone = userPhone;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
public byte[] getHeadImg() {
return headImg;
}
public void setHeadImg(byte[] headImg) {
this.headImg = headImg;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
3、编写相对应的Mapper接口
package com.forest.owl.mapper;
import com.forest.owl.entity.User;
import java.util.List;
public interface UserMapper {
User selectUserById(Long id);
List<User> selectAllUser();
}
4、编写UserMapper.xml
在resources中加入文件夹com/forest/owl/mapper,在此文件夹中添加UserMapper文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.forest.owl.mapper.UserMapper">
<resultMap id="userMap" type="com.forest.owl.entity.User">
<id property="id" column="id" />
<result property="userName" column="user_name" />
<result property="userPassword" column="user_password" />
<result property="userPhone" column="user_phone" />
<result property="userEmail" column="user_email" />
<result property="headImg" column="head_img" jdbcType="BLOB" />
<result property="createTime" column="create_time" jdbcType="TIMESTAMP" />
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP" />
</resultMap>
<select id="selectUserById" resultMap="userMap">
SELECT * FROM user WHERE id=#{id}
</select>
<select id="selectAllUser" resultType="com.forest.owl.entity.User">
SELECT id, user_name, user_password, user_phone, user_email, head_img, create_time, update_time
FROM user
</select>
</mapper>
5、修改mybatis-config.xml文件
<?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>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.forest.owl.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/forest?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.forest.owl.mapper"/>
</mappers>
</configuration>
6、编写测试代码
package com.forest.owl;
import com.forest.owl.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import java.io.IOException;
import java.io.Reader;
public class BaseMapperTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init(){
try {
Reader reader = Resources.getResourceAsReader("mybatis.config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
package com.forest.owl;
import com.forest.owl.entity.User;
import com.forest.owl.mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MapperTest extends BaseMapperTest{
@Test
public void UserMapperTest(){
SqlSession sqlSession = getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.selectUserById((long) 3);
System.out.println(user.getUserName());
List<User> userList = userMapper.selectAllUser();
userList.stream().forEach(i -> System.out.println(i.getUserName()));
}
}
7、关联查询
假设在用户信息查询的基础上,我还想查询用户的角色与权限,该如何?
首先定义角色与权限的实体类
package com.forest.owl.entity;
import java.util.Date;
public class Role {
private Long id;
private String roleName;
private int enabled;
private Long createBy;
private Date createTime;
private Long updateBy;
private Date updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public int getEnabled() {
return enabled;
}
public void setEnabled(int enabled) {
this.enabled = enabled;
}
public Long getCreateBy() {
return createBy;
}
public void setCreateBy(Long createBy) {
this.createBy = createBy;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Long getUpdateBy() {
return updateBy;
}
public void setUpdateBy(Long updateBy) {
this.updateBy = updateBy;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
package com.forest.owl.entity;
import java.util.Date;
public class Privilege {
private Long id;
private String privilegeName;
private String privilegeUrl;
private Long createBy;
private Date createTime;
private Long updateBy;
private Date updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPrivilegeName() {
return privilegeName;
}
public void setPrivilegeName(String privilegeName) {
this.privilegeName = privilegeName;
}
public String getPrivilegeUrl() {
return privilegeUrl;
}
public void setPrivilegeUrl(String privilegeUrl) {
this.privilegeUrl = privilegeUrl;
}
public Long getCreateBy() {
return createBy;
}
public void setCreateBy(Long createBy) {
this.createBy = createBy;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Long getUpdateBy() {
return updateBy;
}
public void setUpdateBy(Long updateBy) {
this.updateBy = updateBy;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
在User实体类中添加Role与Privilege属性
private Role role;
private Privilege privilege;
public Role getRole() { return role; }
public void setRole(Role role) { this.role = role; }
public Privilege getPrivilege() { return privilege; }
public void setPrivilege(Privilege privilege) { this.privilege = privilege; }
修改UserMapper.xml文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.forest.owl.mapper.UserMapper">
<resultMap id="userMap" type="com.forest.owl.entity.User">
<id property="id" column="id" />
<result property="userName" column="user_name" />
<result property="userPassword" column="user_password" />
<result property="userPhone" column="user_phone" />
<result property="userEmail" column="user_email" />
<result property="headImg" column="head_img" jdbcType="BLOB" />
<result property="createTime" column="create_time" jdbcType="TIMESTAMP" />
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP" />
<association property="role">
<result property="roleName" column="role_name" />
</association>
<association property="privilege">
<result property="privilegeName" column="privilege_name" />
<result property="privilegeUrl" column="privilege_url" />
</association>
</resultMap>
<select id="selectUserById" resultMap="userMap">
SELECT u.*,
r.role_name,
p.privilege_name,
p.privilege_url
FROM user u
INNER JOIN user_role ur on ur.user_id=u.id
INNER JOIN role r on r.id=ur.role_id
INNER JOIN role_privilege rp on rp.role_id=r.id
INNER JOIN privilege p on p.id=rp.privilege_id
WHERE u.id=#{id}
</select>
<select id="selectAllUser" resultType="com.forest.owl.entity.User">
SELECT u.id,
u.user_name,
u.user_password,
u.user_phone,
u.user_email,
u.head_img,
u.create_time,
u.update_time,
r.role_name as "role.roleName",
p.privilege_name as "privilege.privilegeName",
p.privilege_url as "privilege.privilegeUrl"
FROM user u
INNER JOIN user_role ur on ur.user_id=u.id
INNER JOIN role r on r.id=ur.role_id
INNER JOIN role_privilege rp on rp.role_id=r.id
INNER JOIN privilege p on p.id=rp.privilege_id
</select>
</mapper>
编写测试类
@Test
public void UserMapperTest(){
SqlSession sqlSession = getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.selectUserById((long) 3);
System.out.println(user.getUserName());
System.out.println(user.getRole().getRoleName());
System.out.println(user.getPrivilege().getPrivilegeName());
System.out.println(user.getPrivilege().getPrivilegeUrl());
List<User> userList = userMapper.selectAllUser();
userList.stream().forEach(i -> {
System.out.println(i.getUserName());
System.out.println(i.getRole().getRoleName());
System.out.println(i.getPrivilege().getPrivilegeName());
System.out.println(i.getPrivilege().getPrivilegeUrl());
});
}
8、新增数据
在UserMapper接口中新增方法
int insertUser(User user);
UserMapper.xml
<insert id="insertUser">
INSERT INTO user (user_name, user_password, user_phone, user_email, head_img, create_time, update_time)
VALUES( #{userName}, #{userPassword}, #{userPhone}, #{userEmail}, #{headImg}, #{createTime}, #{updateTime} )
</insert>
测试代码
@Test
public void UserMapperTest(){
SqlSession sqlSession = getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUserName("新用户名");
user.setUserPassword("密码");
user.setUserPhone("手机号");
user.setUserEmail("邮箱号");
int result = userMapper.insertUser(user);
System.out.println(result);
sqlSession.commit();
}
因为SqlSessionFactory.openSession()是不自动提交的,故此处需要手动提交,否则无效。
对于想要得到插入数据的主键,可以设置mybatis-config.xml的配置项useGeneratedKeys为true
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="useGeneratedKeys" value="true"/>
</settings>
然后在<insert />配置中添加keyProperty="id",在数据插入成功后,mybatis会将主键回写至id里,届时使用user.getId()获取即可。
<insert id="insertUser" keyProperty="id">
INSERT INTO user (user_name, user_password, user_phone, user_email, head_img, create_time, update_time)
VALUES( #{userName}, #{userPassword}, #{userPhone}, #{userEmail}, #{headImg}, #{createTime}, #{updateTime} )
</insert>
mybatis入门篇:Mapper接口/关联查询/新增数据的更多相关文章
- mybatis入门篇:通过SqlSession.selectList进行数据查询
作为一个java菜鸟,早就从慕课网中学到一些基本的mybatis的用法,但是一直不成体系,懵懵懂懂,既然正式入了java这个坑,就打算好好学学,所以买了本<MyBatis从入门到精通>,在 ...
- Mybatis学习总结四(关联查询)
一.一对一查询 实例:查询所有订单信息,关联查询下单用户信息. Method1:使用resultType,定义订单信息po类,此po类中包括了订单信息和用户信息. public class Order ...
- mybatis如何根据mapper接口生成其实现类
SpringBoot集成mybatis mybatis的statement的解析与加载 mybatis如何根据mapper接口生成其实现类 mybatis的mapper返回map结果集 mybatis ...
- idea插件(mybatis框架下mapper接口快速跳转对应xml文件)亲测好用!
我相信目前在绝大部分公司里,主要使用的框架是S(spring)S(spring MVC)M(mybatis),其中mybatis总体架构是编写mapper接口,框架扫描其对应的mapper.xml文件 ...
- mybatis入门篇:Mybatis高级查询
1.ResultMap的association与collection association与collection功能类似,区别是一对一与一对多,这里以association为例. 首先说明一下需求: ...
- MyBatis入门学习教程-实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- Mybatis入门篇之结果映射,你射准了吗?
目录 前言 什么是结果映射? 如何映射? 别名映射 驼峰映射 配置文件开启驼峰映射 配置类中开启驼峰映射 resultMap映射 总结 高级结果映射 关联(association) 例子 关联的嵌套 ...
- MyBatis入门篇
一.什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改 ...
- mybatis入门篇:Mybatis注解方式的基本用法
@Select 1.mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <! ...
随机推荐
- c函数创建文件和路径
bool NewFileName(const char* filename) { size_t len; < (len = strlen(filename))) { char* tmpbuf, ...
- NFS服务与crond服务
NFS服务:用于linux系统之间,基于TCP/IP协议层,可以将远程的计算机磁盘挂载到本地,像本地磁盘一样操作. ------------------------------------------ ...
- echarts.init 使用jq获取初始化对象
var myChart = echarts.init($('#main')[0]);// 或者var myChart = echarts.init($('#main').get(0));
- IIS 8.5详细错误
把网站部署到IIS后报错,我错的原因是文件夹内没有设置默认文档,计算机不知道运行哪一个文件,所以报错. 方法:(1)在IIS目录下找到默认文档,双击,点击添加,手写 自己的 启动文件 (2)启动自己的 ...
- FreeSWITCH与FreeSWITCH对接
(主机A ---> 主机B)192.168.100.A主机:修改/usr/local/freeswitch/conf/dialplan/default.xml 10 <ex ...
- h5页面 内嵌h5页面遇到的问题
1.input框无法获取焦点输入内容 input { -webkit-user-select: auto; } 2.div里面放img标签有3px的距离 div { font-size: 0; } i ...
- 【Linux常用命令】
1. ps aux | grep nginx 使用场景:是想查看nginx的打印日志,又不知道nginx的日志路径. ps :是查看进程的命令.使用该命令 可以确定有哪些进程正在运行和运行的状态.进程 ...
- CART-GBRT-GBDT
CART:分类回归树 分类树和回归树的区别:分裂节点时使用的节点非纯度量(最小化准则.特征选择)不一样,修剪树的准则不一样 回归树: 节点非纯度量:平方误差和 区域估计值:均值(在给定的划分下,均值带 ...
- CCF-权限查询-201612-3
这道题,开始只有10分.....原因是将false 写成了 flase 我要吐血而亡....关键是还debug了半天,以为是逻辑错了 不过亮点是代码很简洁,网上140+的代码看着真复杂 核心: 做题之 ...
- 谈一谈Crsf和XSS攻击
crsf 和 XSS CRFS攻击全称是一种利用cookie的漏洞进行的一种跨域请求伪造: 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一 ...