Mybatis基础进阶学习2
Mybatis基础进阶学习2
1.测试基本结构

2.三个POJO
package com.pojo; import java.io.Serializable;
import java.util.Date; public class Orders implements Serializable {
private static final long serialVersionUID = 1L; private Integer id; private Integer userId; private String number; private Date createtime; private String note; /**
* 附加对象 用户对象
*/
private User user; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public Integer getUserId() {
return userId;
} public void setUserId(Integer userId) {
this.userId = userId;
} public String getNumber() {
return number;
} public void setNumber(String number) {
this.number = number == null ? null : number.trim();
} public Date getCreatetime() {
return createtime;
} public void setCreatetime(Date createtime) {
this.createtime = createtime;
} public String getNote() {
return note;
} public void setNote(String note) {
this.note = note == null ? null : note.trim();
} /**
* 这是一个输出对象时拼接的语句
*/
@Override
public String toString() {
return "Orders [id=" + id + ", userId=" + userId + ", number=" + number + ", createtime=" + createtime
+ ", note=" + note + "]";
}
}
package com.pojo; import java.io.Serializable;
import java.util.List; /**
* @author: XDZY
* @date: 2018/8/30 14:23
* @description: 包装类(将类包装到该类里面)
* 序列化:当一个对象要从内存中出来并且传输到别人的电脑内存时,他的状态会改变,所以要序列化
* 反序列化:一个对象的数据传到别人电脑时要经过反序列化才不会改变状态
*/
public class QueryVo implements Serializable {
private static final long serialVersionUID = 1L; private User user; List<Integer> idsList; Integer[] ids; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public List<Integer> getIdsList() {
return idsList;
} public void setIdsList(List<Integer> idsList) {
this.idsList = idsList;
} public Integer[] getIds() {
return ids;
} public void setIds(Integer[] ids) {
this.ids = ids;
}
}
package com.pojo; import java.io.Serializable;
import java.util.Date;
import java.util.List; public class User implements Serializable {
private static final long serialVersionUID = 1L; private Integer id;
/**
* 用户姓名
*/
private String username;
/**
* 性别
*/
private String sex;
/**
* 生日
*/
private Date birthday;
/**
* 地址
*/
private String address; /**
* 附加对象ordersList
*/
private List<Orders> ordersList; public List<Orders> getOrdersList() {
return ordersList;
} public void setOrdersList(List<Orders> ordersList) {
this.ordersList = ordersList;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
}
3.用户映射器与订单映射器
package com.mapper; import com.pojo.Orders;
import com.pojo.User; import java.util.List; /**
* @author: XDZY
* @date: 2018/8/30 23:08
* @description: 实现订单增删改查的接口(映射器)
*/
public interface OrderMapper {
/**
* 查询所有订单
*
* @return
*/
List<Orders> findOrderList(); /**
* 一对一关联查询(一个订单属于一个用户)
*
* @return
*/
List<Orders> findOrders(); /**
* 一对多关联查询(一个用户可以有多个订单)
*
* @return
*/
List<User> findUserList();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 命名空间:用于区分;如test.findUserById -->
<mapper namespace="com.mapper.OrderMapper">
<!-- 查询所有订单 -->
<!--<select id="findOrderList" resultType="Orders">--> <!-- 当表字段名pojo属性不同时,需要手动映射 -->
<resultMap id="orders" type="Orders">
<!-- 当表的字段与属性一样时,可以省略不写 -->
<result column="user_id" property="userId"/>
</resultMap>
<!-- select中的resultMap要对应resultMap的id -->
<select id="findOrderList" resultMap="orders">
select id,user_id,number,createtime,note from orders
</select> <!-- 一对一关联查询(一个订单属于一个用户):因为有其他表的字段,所以只能用自定义映射resultMap -->
<!-- 因为是多表查询,所以不管字段与属性名相同,也不能省略 -->
<resultMap id="order" type="Orders">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<!-- 映射到另一张表的字段;如果是一对一,则使用association;javaType表示java泛型 -->
<association property="user" javaType="User">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
</association>
</resultMap>
<select id="findOrders" resultMap="order">
select o.id,o.user_id,o.number,o.createtime,u.username
from orders o
left join user u
on o.user_id=u.id;
</select> <!-- 一对多关联查询(一个用户可以有多个订单) -->
<resultMap id="user" type="User">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<!-- 映射到另一张表的字段;如果是一对多,则使用collection;ofType表示遍历每个元素类型 -->
<collection property="ordersList" ofType="Orders">
<id column="id" property="id"/>
<result column="number" property="number"/>
</collection>
</resultMap>
<select id="findUserList" resultMap="user">
select o.id,o.user_id,o.number,o.createtime,u.username
from user u
left join orders o
on o.user_id=u.id;
</select>
</mapper>
package com.mapper; import com.pojo.QueryVo;
import com.pojo.User; import java.util.List; /**
* @author: XDZY
* @date: 2018/8/30 10:02
* @description: 实现用户增删改查的接口(映射器)
* 遵循四个原则
* 1)接口方法名与xml文件标签id一样
* 2)方法返回值类型与xml文件一样
* 3)方法的参数与xml文件一样
* 4)xml文件命名空间与该接口绑定
*/
public interface UserMapper {
/**
* 通过ID查询一个用户
*
* @param id
* @return
*/
User findUserById(Integer id); /**
* 根据用户名模糊查询用户增强版
*
* @param vo
* @return
*/
List<User> findUserByQueryVo(QueryVo vo); /**
* 查询用户数量
*
* @return
*/
Integer findCountUser(); /**
* 根据性别和名字查询用户
*
* @param user
* @return
*/
List<User> findUserByNameAndSex(User user); /**
* 根据多个ID查询用户(3种写法)
*
* @param vo
* @return
*/
//public List<User> findUserByIds(Integer[] ids);
//public List<User> findUserByIds(List<Integer> ids);
List<User> findUserByIds(QueryVo vo);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 命名空间:用于区分;如test.findUserById -->
<mapper namespace="com.mapper.UserMapper">
<!-- 通过ID查询一个用户 -->
<select id="findUserById" parameterType="Integer" resultType="User">
<!-- #{}:表示占位符 -->
select * from user where id=#{v}
</select> <!-- 根据用户名模糊查询用户 -->
<select id="findUserByName" parameterType="String" resultType="com.pojo.User">
<!-- ${}:表示字符串拼接 -->
-- select * from user where username like '%${value}%'
<!-- 防sql注入 -->
select * from user where username like "%"#{value}"%"
</select> <!-- 添加用户 -->
<insert id="addUser" parameterType="com.pojo.User">
<!-- 获取最新的ID主键 -->
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into user (username,birthday,address,sex)
values (#{username},#{birthday},#{address},#{sex})
</insert> <!-- 更新用户 -->
<update id="updateUserById" parameterType="com.pojo.User">
update user
set username=#{username},birthday=#{birthday},address=#{address},sex=#{sex}
where id=#{id}
</update> <!-- 删除用户 -->
<delete id="delUserById" parameterType="Integer">
delete from user where id=#{id}
</delete> <!-- 根据用户名模糊查询用户增强版,当要改变查询条件时,要改动的代码减少 -->
<select id="findUserByQueryVo" parameterType="QueryVo" resultType="com.pojo.User">
<!-- 防sql注入 -->
select * from user where username like "%"#{user.username}"%"
</select> <!-- 查询用户数量 -->
<select id="findCountUser" resultType="Integer">
select count(1) from user
</select> <!-- sql片段的使用:将重复要写的代码放这里 -->
<sql id="sqlCopy">
select * from user
</sql> <!-- 根据性别和名字查询用户 -->
<!-- where标签可以去掉前and;因为如果sex为空,则and在前面会报sql语法错误 -->
<select id="findUserByNameAndSex" parameterType="User" resultType="User">
<include refid="sqlCopy"/>
<where>
<if test="sex!=null and sex!=''">
sex=#{sex}
</if>
<if test="username!=null and username!=''">
and username=#{username}
</if>
</where>
</select> <!-- 根据多个ID查询用户(1,2,3) -->
<!-- separator:表示分隔符 -->
<!-- 坑:Integer[]的collection为array;List<Integer>的collection为list -->
<select id="findUserByIds" parameterType="QueryVo" resultType="User">
<include refid="sqlCopy"/>
<where>
<foreach collection="idsList" item="id" separator="," open=" id in (" close=")">
#{id}
</foreach>
</where>
</select>
</mapper>
4.单元测试
package com.junit; import com.mapper.OrderMapper;
import com.mapper.UserMapper;
import com.pojo.Orders;
import com.pojo.QueryVo;
import com.pojo.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.Test; import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; /**
* @author: XDZY
* @date: 2018/8/30 10:15
* @description: mybatis简单查询
* 动态代理对象会根据mapper接口方法的返回值确定调用selectOne,selectList还是其他方法
* 动态代理模式:就相当于你要去找人,告诉一个代理,他帮你找到
*/
public class MapperTest {
/**
* 根据用户ID查询用户信息
*
* @throws Exception
*/
@Test
public void testMapper() throws Exception {
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession帮我们生成一个实现类给接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.findUserById(10);
System.out.println(user);
} /**
* 根据提供的包装类里用户名模糊查询用户信息
*
* @throws Exception
*/
@Test
public void testMapperQueryVo() throws Exception {
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession帮我们生成一个实现类给接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class); QueryVo vo = new QueryVo();
User user = new User();
user.setUsername("五");
vo.setUser(user);
List<User> users = mapper.findUserByQueryVo(vo);
for (User user1 : users) {
System.out.println(user1);
}
} /**
* 查询用户数量
*
* @throws Exception
*/
@Test
public void testMapperUserCount() throws Exception {
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession帮我们生成一个实现类给接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class); int i = mapper.findCountUser();
System.out.println(i);
} /**
* 查询所有订单
*
* @throws Exception
*/
@Test
public void testMapperOrderList() throws Exception {
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession帮我们生成一个实现类给接口
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class); List<Orders> list = mapper.findOrderList();
for (Orders order : list) {
System.out.println(order);
}
} /**
* 根据性别和名字查询用户
*
* @throws Exception
*/
@Test
public void testMapperFindUserByNameAndSex() throws Exception {
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession帮我们生成一个实现类给接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User();
user.setUsername("xdzy");
user.setSex("男");
List<User> users = mapper.findUserByNameAndSex(user);
for (User user1 : users) {
System.out.println(user1);
}
} /**
* 根据多个ID查询用户(1,2,3)
*
* @throws Exception
*/
@Test
public void testMapperfindUserByIds() throws Exception {
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession帮我们生成一个实现类给接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<Integer> ids = new ArrayList<Integer>();
ids.add(16);
ids.add(22);
ids.add(27);
QueryVo vo = new QueryVo();
vo.setIdsList(ids);
List<User> users = mapper.findUserByIds(vo);
for (User user1 : users) {
System.out.println(user1);
}
}
}
package com.junit; import com.mapper.OrderMapper;
import com.pojo.Orders;
import com.pojo.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.Test; import java.io.InputStream;
import java.util.List; /**
* @author: XDZY
* @date: 2018/8/30 10:15
* @description: mybatis多表查询
*/
public class MapperTest2 {
/**
* 一对一关联查询
*
* @throws Exception
*/
@Test
public void testMapperOrders() throws Exception {
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession帮我们生成一个实现类给接口
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class); List<Orders> ordersList = mapper.findOrders();
for (Orders order : ordersList) {
System.out.println(order);
}
} /**
* 一对多关联查询
*
* @throws Exception
*/
@Test
public void testMapperUserList() throws Exception {
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//sqlSession帮我们生成一个实现类给接口
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class); List<User> userList = mapper.findUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
Mybatis基础进阶学习2的更多相关文章
- Mybatis基础入门学习
Mybatis基础入门学习 mybatis架构分析 搭建测试mybatis架构 )下载并导入mybatis3.2.7.jar(架构),mysql-connector-java-5.1.7-bin.ja ...
- 学习python须知,Python基础进阶需掌握哪些知识点?
Python基础进阶需要掌握哪些知识点?Python将是每个程序员的标配,有编程基础再掌握Python语言对于日后的升职加薪更有利.Python语言简洁利于理解,语法上相对容易能够让开发者更专注于业务 ...
- 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解
什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...
- python最全学习资料:python基础进阶+人工智能+机器学习+神经网络(包括黑马程序员2017年12月python视频(百度云链接))
首先用数据说话,看看资料大小,达到675G 承诺:真实资料.不加密,获取资料请加QQ:122317653 包含内容:1.python基础+进阶+应用项目实战 2.神经网络算法+python应用 3.人 ...
- python学习大全:python基础进阶+人工智能+机器学习+神经网络
首先用数据说话,看看资料大小,达到675G承诺:真实资料.不加密.(鉴于太多朋友加我QQ,我无法及时回复,) 方便的朋友给我点赞.评论下,谢谢!(内容较大,多次保存) [hide]链接:[url]ht ...
- PHP程序员进阶学习书籍参考指南
PHP程序员进阶学习书籍参考指南 @heiyeluren lastmodify: 2016/2/18 [初阶](基础知识及入门) 01. <PHP与MySQL程序设计(第4版)> ...
- 【简单易懂的AMV图文教程-2】VEGAS基础进阶——认识关键帧
[简单易懂的AMV图文教程-2]VEGAS基础进阶--认识关键帧 经过了上一期VEGAS基础教程的学习,相信大家都能独立完成一些比较简单的纯剪辑作品了.今天在这里为大家继续介绍VEGAS的一大基础应用 ...
- 老王Python培训视频教程(价值500元)【基础进阶项目篇 – 完整版】
老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...
- js基础进阶--关于setTimeout的思考
欢迎访问我的个人博客:http://www.xiaolongwu.cn 先热身 看看下面的额代码会打印出什么? for (var i = 0; i < 5; i++) { setTimeout( ...
随机推荐
- Hadoop2.X HA架构与部署
HDFS-HA原理及配置 1.HDFS-HA架构原理介绍 hadoop2.x之后,Clouera提出了QJM/Qurom Journal Manager,这是一个基于Paxos算法实现的HDFS HA ...
- python 在windows下监听键盘按键
python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), ...
- [LeetCode]19. Remove Nth Node From End of List删除链表的倒数第N个节点
Given a linked list, remove the n-th node from the end of list and return its head. Example: Given l ...
- DIV三列同行
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python socket实现多个连接
socket实现多个连接 前戏很重要~~ 在实现多个连接之前,先实现下多次发送和接收数据. 如果要多次接收数据,那么在服务器端的接收和客户端的发送部分就必须使用循环. 以下代码在python3.5下运 ...
- 压力测试工具ab的使用
ab是Apache自带的HTTP压力测试工具,全称是ApacheBench 路径为\Apache\bin\ab.exe 参数文档: http://httpd.apache.org/docs/2.2/p ...
- tcpdump确认服务器连接的交换机信息
Displaying CDP info via tcpdump or snoop Cisco Discovery Protocol is a management protocol that Cisc ...
- JavaScript 闭包的详细分享(三种创建方式)(附小实例)
JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...
- ASP.NET Core - 各项配置
之前搭建好了各项开发环境,现在来说说ASP.NET Core的各项配置.项目结构.以及在请求管道中挂载的各式各样的中间件.今天先来探讨探讨其各项配置及其项目结构 ASP.NET Core和上一代F ...
- avast从隔离区恢复后,仍无法打开被误杀文件的解决方案
从隔离区中手动恢复后,隔离区中被恢复的文件将不再展示. 此时,如果手动恢复的文件仍无法打开(图标此时也异常),请: 将avast禁用: 将avast启用. 然后尝试重新打开被误隔离并手动恢复的文件.