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); } } }