版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35537301/article/details/82228108
输入映射
输入参数类型是简单类型
parameterType="数据类型"
#{}:括号中的值可以是任意值,但不能为空
${}:括号中的值必须是value
输入参数类型是pojo对象
parameterType="POJO对象的全向定名"
#{}:括号中的值为pojo属性名称
${}:括号中的值为pojo属性名称
输入参数类型是pojo包装对象
包装对象:pojo类中的一个属性是另外一个pojo
使用场景:不同维度上的查询
package com.itheima.pojo;
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
package com.itheima.mapper;
import java.util.List;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;
public interface UserMapper {
public List<User> selectUserByUsername(QueryVo queryVo);
}
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
<!-- 根据用户名称模糊查询用户信息 -->
<select id="selectUserByUsername" parameterType="com.itheima.pojo.QueryVo" resultType="com.itheima.pojo.User">
select * from user where username like "%"#{user.username}"%"
</select>
</mapper>
package com.itheima.test;
import java.io.InputStream;
import java.util.List;
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.Before;
import org.junit.Test;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
String resource = "SqlMapConfig.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void selectUserByUsername() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
QueryVo queryVo = new QueryVo();
User u = new User();
u.setUsername("小");
queryVo.setUser(u);
List<User> list = mapper.selectUserByUsername(queryVo);
for (User user : list) {
System.err.println(user);
}
}
}
输出映射
输出简单类型
需求:查询用户表数据条数
Mapper.xml文件
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="selectCount" resultType="Integer">
select count(*) from user
</select>
</mapper>
Mapper接口
package com.itheima.mapper;
import java.util.List;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;
public interface UserMapper {
/**
* @MethodName:selectCount
* @Description:
* @return
*/
public int selectCount();
}
测试方法
package com.itheima.test;
import java.io.InputStream;
import java.util.List;
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.Before;
import org.junit.Test;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
String resource = "SqlMapConfig.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void selectCount() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int count = mapper.selectCount();
System.out.println(count);
}
}
输出pojo对象
resultType="POJO属性名"
输出pojo列表
resultType="集合中每个对象,也是POJO属性名"
resultMap
当表中字段和POJO属性不一致的时候,需要使用resultMap来映射
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单id',
`user_id` int(11) NOT NULL COMMENT '下单用户id',
`number` varchar(32) NOT NULL COMMENT '订单号',
`createtime` datetime NOT NULL COMMENT '创建订单时间',
`note` varchar(100) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `FK_orders_1` (`user_id`),
CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
Order.java
package com.itheima.pojo;
import java.io.Serializable;
import java.util.Date;
public class Order implements Serializable {
private static final long serialVersionUID = 1L;
// 订单id
private Integer id;
// 用户id
private Integer userId;
// 订单号
private String number;
// 订单创建时间
private Date createtime;
// 备注
private String note;
}
OrderMapper.java
package com.itheima.mapper;
import java.util.List;
import com.itheima.pojo.Order;
public interface OrderMapper {
/**
* @MethodName:selectAll
* @Description:查询所有的订单信息
* @return
*/
public List<Order> selectAll();
}
OrderMapper.xml
<?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">
<mapper namespace="com.itheima.mapper.OrderMapper">
<!-- resultMap: 手动映射 -->
<!-- 当单表查询的时候,可以只映射不一致的属性就可以了! -->
<resultMap type="com.itheima.pojo.Order" id="orderMap">
<!-- id: 主键映射:必须的(单表查询可以不写) -->
<!-- column : 表中的字段名 -->
<!-- property:对应着返回值类型的属性名 -->
<id column="id" property="id" />
<!-- 映射普通的属性 -->
<result column="user_id" property="userId" />
</resultMap>
<select id="selectAll" resultMap="orderMap">
select * from orders
</select>
</mapper>
测试类
package com.itheima.test;
import java.io.InputStream;
import java.util.List;
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.Before;
import org.junit.Test;
import com.itheima.mapper.OrderMapper;
import com.itheima.pojo.Order;
public class OrderMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testQueryAll() {
// 获取sqlSession
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 获取OrderMapper
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Order> list = mapper.selectAll();
for (Order order : list) {
System.err.println(order);
}
}
}
动态SQL
if标签
作用
判断输入参数是否有效
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
<!-- 根据用户名称模糊查询用户信息 -->
<select id="selectUserByUsername" parameterType="com.itheima.pojo.QueryVo" resultType="com.itheima.pojo.User">
select * from user where 1=1
<!-- if:判断输入参数是否有效 -->
<if test="user.username!=null and user.username!=''">
and username like "%"#{user.username}"%"
</if>
<if test="user.sex!=null and user.sex!=''">
and sex = #{user.sex}
</if>
</select>
</mapper>
where标签
作用
添加where关键字
校验SQL语句去掉第一个and
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
<!-- 根据用户名称模糊查询用户信息 -->
<select id="selectUserByUsername" parameterType="com.itheima.pojo.QueryVo" resultType="com.itheima.pojo.User">
select * from user
<!-- where: 1、添加where关键字;2、校验SQL语句去掉第一个and -->
<where>
<!-- if:判断输入参数是否有效 -->
<if test="user.username!=null and user.username!=''">
and username like "%"#{user.username}"%"
</if>
<if test="user.sex!=null and user.sex!=''">
and sex = #{user.sex}
</if>
</where>
</select>
</mapper>
sql标签
作用
提取重复SQL片段
include标签
作用
引入SQL片段
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
<!-- 提取SQL语句的重复代码 -->
<sql id="selectId">
select * from user
</sql>
<select id="selectUserById" parameterType="Integer" resultType="com.itheima.pojo.User">
<include refid="selectId"/> where id = #{id}
</select>
</mapper>
foreach标签
- collection : 要遍历的集合名称
- 当输入参数类型是数组类型时,那么collection = array
- 当输入参数类型是集合类型时,那么collection = list
- 当输入参数类型是POJO对象类型时,那么collection = 对象属性名
- item: 遍历的每一个元素的名称:注意:这个名称必须和后面的占位符中的参数一致
- separator: 遍历的分隔符;当遍历到最后一位时,不会帮我们添加分隔符了!
- open: 遍历的前缀
- close:遍历的后缀
package com.itheima.mapper;
import java.util.List;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;
public interface UserMapper {
/**
* @MethodName:findUserByIds
* @Description:
* @param ids
* @return
*/
public List<User> findUserByIds(Integer[] ids);
}
UserMapper.xml文件
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="findUserByIds" parameterType="Integer" resultType="com.itheima.pojo.User">
select * from user
<where>
<!--
id in (1,10,26,28)
foreach : 遍历输入参数
collection : 要遍历的集合名称
当输入参数类型是数组类型时,那么collection = array
当输入参数类型是集合类型时,那么collection = list
当输入参数类型是POJO对象类型时,那么collection = 对象属性名
item: 遍历的每一个元素的名称:注意:这个名称必须和后面的占位符中的参数一致
separator: 遍历的分隔符;当遍历到最后一位时,不会帮我们添加分隔符了!
open: 遍历的前缀
close:遍历的后缀
-->
<foreach collection="array" item="id" separator="," open=" id in (" close=")">
#{id}
</foreach>
</where>
</select>
</mapper>
package com.itheima.test;
import static org.junit.Assert.*;
import java.io.InputStream;
import java.util.List;
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.Before;
import org.junit.Test;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
String resource = "SqlMapConfig.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void findUserByIds() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Integer [] ids = {1,10,27};
List<User> list = mapper.findUserByIds(ids);
for (User user : list) {
System.err.println(user);
}
}
}
集合
package com.itheima.mapper;
import java.util.List;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;
public interface UserMapper {
/**
* @MethodName:findUserByIds
* @Description:
* @param ids
* @return
*/
public List<User> findUserByIds(List<Integer> ids);
}
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="findUserByIds" parameterType="Integer" resultType="com.itheima.pojo.User">
select * from user
<where>
<!--
id in (1,10,26,28)
foreach : 遍历输入参数
collection : 要遍历的集合名称
当输入参数类型是数组类型时,那么collection = array
当输入参数类型是集合类型时,那么collection = list
当输入参数类型是POJO对象类型时,那么collection = 对象属性名
item: 遍历的每一个元素的名称:注意:这个名称必须和后面的占位符中的参数一致
separator: 遍历的分隔符;当遍历到最后一位时,不会帮我们添加分隔符了!
open: 遍历的前缀
close:遍历的后缀
-->
<foreach collection="list" item="id" separator="," open=" id in (" close=")">
#{id}
</foreach>
</where>
</select>
</mapper>
package com.itheima.test;
import static org.junit.Assert.*;
import java.io.InputStream;
import java.util.List;
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.Before;
import org.junit.Test;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
String resource = "SqlMapConfig.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void findUserByIds() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(10);
ids.add(27);
List<User> list = mapper.findUserByIds(ids);
for (User user : list) {
System.err.println(user);
}
}
}
POJO对象
package com.itheima.mapper;
import java.util.List;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;
public interface UserMapper {
/**
* @MethodName:findUserByIds
* @Description:
* @param queryVo
* @return
*/
public List<User> findUserByIds(QueryVo queryVo);
}
<?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">
<!-- namespace:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="findUserByIds" parameterType="com.itheima.pojo.QueryVo" resultType="com.itheima.pojo.User">
select * from user
<where>
<!--
id in (1,10,26,28)
foreach : 遍历输入参数
collection : 要遍历的集合名称
当输入参数类型是数组类型时,那么collection = array
当输入参数类型是集合类型时,那么collection = list
当输入参数类型是POJO对象类型时,那么collection = 对象属性名
item: 遍历的每一个元素的名称:注意:这个名称必须和后面的占位符中的参数一致
separator: 遍历的分隔符;当遍历到最后一位时,不会帮我们添加分隔符了!
open: 遍历的前缀
close:遍历的后缀
-->
<foreach collection="ids" item="id" separator="," open=" id in (" close=")">
#{id}
</foreach>
</where>
</select>
</mapper>
package com.itheima.test;
import static org.junit.Assert.*;
import java.io.InputStream;
import java.util.List;
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.Before;
import org.junit.Test;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.QueryVo;
import com.itheima.pojo.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
String resource = "SqlMapConfig.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void findUserByIds() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
QueryVo queryVo = new QueryVo();
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(10);
ids.add(27);
queryVo.setIds(ids);
List<User> list = mapper.findUserByIds(queryVo);
for (User user : list) {
System.err.println(user);
}
}
}