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( ...
随机推荐
- ajax多次请求的一个效果思路
首先页面加载时候显示遮罩层 jQuery(function() { show_dialog(); //tianxie(); }); 定义一个全局数组,用于存放问题id var qar = []; 循环 ...
- Win2D 官方文章系列翻译 - 像素格式
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-pixel-formats/ DirectXPixelFormat 枚举 包含了 Direct3D 和 DXG ...
- C#委托(一)——说明及举例
C#命名空间下有五种类型,分别为: 类.构造.接口.枚举.委托. 委托被定义为5中基本类型的一种,也就意味着代码可以这么写: using System; namespace Test { delega ...
- springmvc实现文件下载到Android手机设备pda端
1:首先要添加相关得jar文件,在pom.xml中 <dependency> <groupId>commons-fileupload</groupId> <a ...
- Mybatis通用Mapper(转)
转自:http://blog.csdn.net/isea533/article/details/41457529 极其方便的使用Mybatis单表的增删改查 项目地址:http://git.oschi ...
- input输入框不能获得焦点
今天在ipad上遇到一个问题:jquery 调用 $(id).focus() 方法,失效,不能弹出键盘获得输入的焦点. 开始以为是 $(id).focus() 方法的问题,然后就试着用原声的docum ...
- 切图让我进步!关于white-space属性的组合拳
菜鸟一枚,没有大神的风骚,只有一点在练习中的心得,今天获得的知识是关于white-space属性.overflow属性还有text-overflow属性的组合使用,废话不多说浪费时间,进入今天的正题! ...
- viewport信息设置
- jQueryMobile(三)
五].jQueryMobile工具栏 头部.尾部的定位:data-position='inline' 默认data-position='fixed' 固定在头部/尾部data-fullscreen=' ...
- CSS中的鼠标样式明细
<INPUT TYPE="submit" style="cursor: hand" value="hand"> ...