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" ?> <! ...
随机推荐
- 匿名函数lambda及面试题三道
# 函数名 = lambda 参数 :返回值. 匿名函数只是函数,如果要通过可迭代对象给匿名函数传参,就需要使用 map 或者 filter calc = lambda n:n**n calc(1)c ...
- .net core WebApi Mutex实现并发同步
Mutex,中文译为互斥体,在.net中也是作为一种线程或进程之间的互斥体存在.即在同一时刻,一个共享资源只允许被某一个线程或进程访问,其他线程或进程需要等待(直至获取互斥锁为止). Mutex的使用 ...
- 调试lldb命令常用
0.关于iOS的UI显示调试的三方控件 Reveal “po”命令是“print object”(打印对象)的简写.“$eax”是cup的一个寄存器.在一个异常的情况下,这个寄存器将会包含一个异常对象 ...
- java语言编写矩阵的四则运算
题目要求如下: 设计程序实现矩阵的四则运算 设计要求: (1) 实现矩阵的四则运算. (2) 考虑实现带变元的矩阵计算. (3)考虑实现矩阵的特征值和特征向量的计算. 我使用java语言写的 目录结构 ...
- Java 内存模型简单剖析
Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果. 主内存与工作内存 处理器上的寄存器的读写的速度比内存快几个数量级,为了解决 ...
- Core 配置文件Json
appsettings.json 文件属性 -复制到输出目录-始终复制.
- C基础学习笔记
1.C语言运算符优先级: 2.三种循环比较 while.do-while和for三种循环在具体的使用场合上是有区别的,如下: 1).在知道循环次数的情况下更适合使用for循环: 2).在不知道循环次数 ...
- 2017-9-3模拟赛T1 卡片(card)
题目 [题目描述] lrb 喜欢玩卡牌.他手上现在有n张牌,每张牌的颜色为红绿蓝中的一种.现在他有两种操作.一是可以将两张任意位置的不同色的牌换成一张第三种颜色的牌:二是可以将任意位置的两张相同颜色的 ...
- 剑指Offer 55. 链表中环的入口结点 (链表)
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目地址 https://www.nowcoder.com/practice/253d2c59ec3e4bc68d ...
- Python全栈之路----常用模块学习----模块的种类和导入方法
什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...