1 查询所有数据
准备环境:
数据库表:tb_brand
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
-- id 主键
id int primary key auto_increment,
-- 品牌名称
brand_name varchar(20),
-- 企业名称
company_name varchar(20),
-- 排序字段
ordered int,
-- 描述信息
description varchar(100),
-- 状态:0:禁用 1:启用
status int
);
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
('小米', '小米科技有限公司', 50, 'are you ok', 1);
SELECT * FROM tb_brand;
创建Brand实体类
package com.tsg.pojo;
public class Brand {
// id 主键
private Integer id;
// 品牌名称
private String brandName;
// 企业名称
private String companyName;
// 排序字段
private Integer ordered;
// 描述信息
private String description;
// 状态:0:禁用 1:启用
private Integer status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBrandName() {
return brandName;
}
public void setBrandName(String brandName) {
this.brandName = brandName;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public Integer getOrdered() {
return ordered;
}
public void setOrdered(Integer ordered) {
this.ordered = ordered;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "Brand{" +
"id=" + id +
", brandName='" + brandName + '\'' +
", companyName='" + companyName + '\'' +
", ordered=" + ordered +
", description='" + description + '\'' +
", status=" + status +
'}';
}
}
测试用例
安装MyBatisX插件
- MybatisX是一款基于IDEA的快速开发插件,为效率而生
- 主要功能
xml
和接口方法相互跳转
根据接口方法生成statement
实现
创建BrandMapper
接口
package com.tsg.mapper;
import com.tsg.pojo.Brand;
import java.util.List;
public interface BrandMapper {
List<Brand> selectAll();
}
编写sql语句:sql映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tsg.mapper.BrandMapper">
<select id="selectAll" resultType="com.tsg.pojo.Brand">
select * from tb_brand;
</select>
</mapper>
更改mybatis-config.xml
文件
执行测试代码
package com.tsg.test;
import com.tsg.mapper.BrandMapper;
import com.tsg.pojo.Brand;
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;
public class MybatisTest {
@Test
public void testSelectAll() throws Exception{
// 加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取SqlSession对象,用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取UserMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
List<Brand> brands = brandMapper.selectAll();
System.out.println(brands);
sqlSession.close();
}
}
注意:数据库表的字段名称和实体类的属性名称不一样,则不能自动封装数据
解决:
- 起别名
<select id="selectAll" resultType="com.tsg.pojo.Brand">
select id,brand_name as brandName,company_name as companyName,ordered,description,status
from tb_brand;
</select>
执行代码
- 使用
resultMap
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tsg.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.tsg.pojo.Brand">
<result column="brand_name" property="brandName" />
<result column="company_name" property="companyName" />
</resultMap>
<select id="selectAll" resultMap="brandResultMap">
select *
from tb_brand;
</select>
</mapper>
2 查看详情
- 编写接口方法:
Mapper
接口
参数是id
结果是Brand
- 编写sql语句:sql映射文件
<select id="selectById" resultMap="brandResultMap">
select * from tb_brand where id = #{id};
</select>
这里的#{id}
也可以写成${id}
使用#
的时候
使用$
的时候
$
存在sql注入问题
还有一个问题,特殊字符的处理
由于业务场景需要这里的=
号可能会改成<
,此时需要使用转义字符或者CDATA
区
<
的转义字符是<
或者将<
写到CDATA
区中
输入大写的CD,会提示,直接回车就可以
- 执行方法,测试
@Test
public void testSelectById() throws Exception{
// 加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取SqlSession对象,用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取UserMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
Brand brands = brandMapper.selectById(1);
System.out.println(brands);
sqlSession.close();
}
3 条件查询
参数接收:
散装参数
如果方法中有多个参数,需要使用@Param
(“SQL参数占位符名称”)对象参数
对象的属性名称要和参数占位符名称一致map集合参数
3.1 多条件查询
散装参数实现
package com.tsg.mapper;
import com.tsg.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BrandMapper {
List<Brand> selectAll();
Brand selectById(int id);
List<Brand> selectByCondition(@Param("status") int status,@Param("companyName") String companyName, @Param("brandName") String brandName);
}
</select>
<select id="selectByCondition" resultMap="brandResultMap">
select *
from tb_brand
where status = #{status}
and company_name like #{companyName}
and brand_name like #{brandName}
</select>
编写测试代码测试
@Test
public void testSelectByCondition() throws Exception{
// 加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取SqlSession对象,用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取UserMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
List<Brand> brands = brandMapper.selectByCondition(1, "%华为%", "%华为%");
System.out.println(brands);
sqlSession.close();
}
对象参数实现
List<Brand> selectByCondition(Brand brand);
sql语句不用修改
编写测试方法
@Test
public void testSelectByCondition() throws Exception{
int status = 1;
String brandName = "%华为%";
String companyName = "%华为%";
Brand brand = new Brand();
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setStatus(status);
// 加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取SqlSession对象,用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取UserMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
List<Brand> brands = brandMapper.selectByCondition(brand);
System.out.println(brands);
sqlSession.close();
}
map集合参数实现
List<Brand> selectByCondition(Map map);
sql语句不用改
编辑测试代码
@Test
public void testSelectByCondition() throws Exception{
int status = 1;
String brandName = "%华为%";
String companyName = "%华为%";
Map map = new HashMap();
map.put("status",status);
map.put("companyName",companyName);
map.put("brandName",brandName);
// 加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取SqlSession对象,用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取UserMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
List<Brand> brands = brandMapper.selectByCondition(map);
System.out.println(brands);
sqlSession.close();
}
3.2 动态条件查询
3.2.1 多条件的动态条件查询
sql语句会随着用户的输入或外部条件的变化而变化,我们称为动态sql
<!--
动态条件查询
-->
<select id="selectByCondition" resultMap="brandResultMap">
select *
from tb_brand
where
<if test="status !=null">
status = #{status}
</if>
<if test="companyName != null and companyName != '' ">
and company_name like #{companyName}
</if>
<if test="brand_name != null and brandName != '' ">
and brand_name like #{brandName}
</if>
</select>
测试:
存在的问题
当status
不存在的时候就会报错
解决:
- 恒等式
- 使用
<where>
这个标签来替换where
关键字
3.2.2 单条件的动态条件查询
从多个条件中选择一个
choose(when,otherwise):选择,类似于Java中的switch语句
接口文件:
List<Brand> selectByConditionSingle(Brand brand);
sql映射文件:
<select id="selectByConditionSingle" resultMap="brandResultMap">
select *
from tb_brand
where
<choose>
<when test="status != null">
status = #{status}
</when>
<when test="companyName != null and companyName != ''">
company_name like #{companyName}
</when>
<when test="brandName != null and brandName != ''">
brand_name like #{brandName}
</when>
</choose>
</select>
测试代码测试:
存在一个问题,一个都不选的情况,即传入一个空的brand
解决
使用<where>
标签
或者使用otherwise