数据库设计
CREATE TABLE `test` (
`test_id` varchar(255),
`test_name` varchar(255),
PRIMARY KEY (`test_id`)
)
生成目录结构
文件 | 作用 |
Test.java | 实体类 |
TestExample.java | 复杂增删查改所需的条件的模板类 |
TestMapper.java | 方法的接口 |
TestMapper.xml | 方法的sql语句映射文件类 |
如果有两个以上的主键,则会生成TestKey,java
实体类.java
public class Test {
private String testId;
private String testName;
/*
get set
*/
public String getTestId() {
return testId;
}
public void setTestId(String testId) {
this.testId = testId == null ? null : testId.trim();
}
public String getTestName() {
return testName;
}
public void setTestName(String testName) {
this.testName = testName == null ? null : testName.trim();
}
}
增删查改条件模板类 XxxExample.java
这个类是用来作为条件的类(可简称:增删查改条件模板类),里边封装了很多的条件,要增删查改的时候就可以new一个Example类,然后定义里边的条件,这样就是一个条件类了,最后让它作为参数进行select等方法。
看一下类的样子:一个主类有三个内部类,其中有一个内部类继承自另一个内部类
主类XxxExample.java:
属性 | 作用 |
orderByClause | 按照什么来排序 |
distinct | 是否要去掉重复 |
oredCriteria | 增删查改条件的集合 |
内部类GeneratedCriteria.java:
属性 | 作用 |
criteria | 许多小条件的集合 |
内部类Criterion.java
属性 | 作用 |
condition | 查询的条件具体是什么 |
value | 条件里的第一个值 |
secondValue | 条件里的第二个值 |
noValue | 是否是not条件 |
singleValue | 条件的参数值是否是单个的值 |
betweenValue | 是否是between条件 |
listValue | 条件的参数值是否是集合 |
typeHandler | 类型的处理器(暂且没有用到) |
XxxMapper.java接口详解
方法名 | 作用 |
selectByExample | 根据模板类来查询 |
selectByPrimaryKey | 根据主键查询 |
deleteByPrimaryKey | 根据主键来删除 |
deleteByExample | 根据模板类来删除 |
insert | 普通的插入方法(全字段) |
insertSelective | 可选的插入方法,一般不是null就写入sql语句,是null就算了 |
countByExample | 根据查询条件数元组个数 |
updateByExampleSelective | 根据条件类来可选择地更新元组(还是对null的优化处理) |
updateByExample | 根据条件类来更新元组() |
updateByPrimaryKeySelective | 根据主键来可选择地更新元组 |
updateByPrimaryKey | 根据主键来更新元组 |
public interface TestMapper {
long countByExample(TestExample example);
int deleteByExample(TestExample example);
int deleteByPrimaryKey(String testId);
int insert(Test record);
int insertSelective(Test record);
List<Test> selectByExample(TestExample example);
Test selectByPrimaryKey(String testId);
int updateByExampleSelective(@Param("record") Test record, @Param("example") TestExample example);
int updateByExample(@Param("record") Test record, @Param("example") TestExample example);
int updateByPrimaryKeySelective(Test record);
int updateByPrimaryKey(Test record);
}
~Mapper.xml
大致情况:
名称空间:定义到Mapper接口类上
<mapper namespace="com.superkarx.dao.TestMapper">
结果集:定义要返回什么
<!--结果集,指定这个结果集的 id 叫什么,返回的类型是对应哪个 bean-->
<resultMap id="BaseResultMap" type="com.superkarx.pojo.Test">
<!--id标签是主键的意思-->
<!--column:数据库的列(字段),jdbcType:数据库的属性类型,property:对应bean的对应属性名-->
<id column="test_id" jdbcType="VARCHAR" property="testId" />
<!--result标签是非主键的意思-->
<result column="test_name" jdbcType="VARCHAR" property="testName" />
</resultMap>
sql语句模板
sql模板id | 作用 |
Example_Where_Clause | where查询条件的模板 |
Update_By_Example_Where_Clause | 更新用的where查询条件的模板 |
Base_Column_List | 所有属性列依次列出,不用去再输入一遍 |
以下只讲述一个sql模板,其他以此类推
<sql id="Example_Where_Clause">
<where>
<!--循环查询条件集合,拿出来赋予criteria-->
<foreach collection="oredCriteria" item="criteria" separator="or">
<!--生效否,test:if的具体条件-->
<if test="criteria.valid">
<!--修剪,去掉多余的关键字(and或or等)-->
<!--
prefix:给sql语句拼接的前缀
suffix:给sql语句拼接的后缀
prefixOverrides:去除sql语句前面的关键字或者字符
-->
<trim prefix="(" prefixOverrides="and" suffix=")">
<!--循环criteria.criteria那些小规则小标准,然后赋予名为criterion的item-->
<foreach collection="criteria.criteria" item="criterion">
<!--choose标签+when:若其中一个成立则退出-->
<choose>
<!--当这个是真,说明这条查询条件是noValue的条件,则插入具体的查询条件内容-->
<!--以此类推~~~~-->
<when test="criterion.noValue">
and ${criterion.condition}
</when>
<when test="criterion.singleValue">
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue">
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue">
and ${criterion.condition}
<foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
这里只讲诉一个方法的xml配置详情
<select id="selectByExample" parameterType="com.superkarx.pojo.TestExample" resultMap="BaseResultMap">
select
<if test="distinct">
distinct
</if>
<!--用include标签引入sql模板(不用去写第二次)-->
<include refid="Base_Column_List" />
from test
<!--
查询条件(因为输入参数是TestExample,用Example模板来查询)
Example类:有很多的查询条件属性
-->
<if test="_parameter != null">
<include refid="Example_Where_Clause" />
</if>
<!--按什么来排序-->
<if test="orderByClause != null">
order by ${orderByClause}
</if>
</select>
运行测试使用
在数据库存入以下字段
@RestController
public class TestController {
@Resource
private TestMapper testMapper;
@GetMapping("/test/{id}")
public List getById(@PathVariable("id")String id){
/**
* 直接用主键的查询
*/
Test test = testMapper.selectByPrimaryKey(id);
TestExample testExample = new TestExample();
/**
* 通用的增删查改(不是主键,所以返回集合)
*/
testExample.createCriteria().andTestIdEqualTo(id);
List<Test> tests = testMapper.selectByExample(testExample);
/**
* 返回
*/
ArrayList<Object> objects = new ArrayList<>();
objects.add(test);
objects.add(tests);
return objects;
}
}
两种查询方法皆可行
让我们看看编译器的各种提示
这里是mapper接口的提示
增删查改模板类Example的使用
直接在这里添加很多的标准(增删查改条件)