项目结构
$ tree
.
├── README.md
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── mouday
│ │ ├── mapper
│ │ │ ├── PersonMapper.java
│ │ │ └── PersonMapper.xml
│ │ ├── pojo
│ │ │ └── Person.java
│ │ └── util
│ │ └── MyBatisUtil.java
│ └── resources
│ ├── db.properties
│ ├── mybatis-config.xml
│ └── sql
│ └── person.sql
└── test
└── java
└── com
└── mouday
└── PersonTest.java
依赖 pom.xml
4.0.0
com.mouday
mybatis-demo
1.0-SNAPSHOT
src/main/java
**/*.xml
true
org.mybatis
mybatis
3.5.5
mysql
mysql-connector-java
8.0.20
org.projectlombok
lombok
1.18.12
provided
junit
junit
4.11
test
数据库配置 db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/data
username=root
password=123456
MyBatis配置 mybatis-config.xml
建表插入数据 person.sql
-- 建表
create table person(
id int not null primary key auto_increment,
name varchar(20),
age int
);
-- 插入数据
insert into person(name, age) values('刘备', 25);
insert into person(name, age) values('关羽', 24);
insert into person(name, age) values('张飞', 23);
insert into person(name, age) values('曹操', 25);
insert into person(name, age) values('许褚', 24);
insert into person(name, age) values('孙权', 25);
insert into person(name, age) values('周瑜', 24);
工具类 MyBatisUtil.java
package com.mouday.util;
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 java.io.IOException;
import java.io.InputStream;
public class MyBatisUtil {
private static SqlSessionFactory factory = null;
// 使用static静态代码块,随着类的加载而加载,只执行一次
static {
try {
String resource = "mybatis-config.xml";
// 加载MyBatis的主配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过构建器(SqlSessionFactoryBuilder)构建一个SqlSessionFactory工厂对象
factory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() throws IOException {
return factory.openSession();
}
}
实体Person.java
package com.mouday.pojo;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Person {
private Integer id;
private String name;
private Integer age;
}
mapper接口 PersonMapper.java
package com.mouday.mapper;
import com.mouday.pojo.Person;
import java.util.List;
public interface PersonMapper {
List selectAll();
/**
* 根据输入的信息进行条件检索
* 1. 当只输入用户名时, 使用用户名进行 【模糊检索】
* 2. 当只输入年龄时, 使用性别进行 【完全匹配】
* 3. 当用户名和年龄都存在时, 用这两个条件进行查询匹配的用
*/
List selectByPersonSelective(Person person);
/**
* 更新非空属性
*/
int updateByPrimaryKeySelective(Person person);
/**
* 插入非空字段
*/
int insertSelective(Person person);
/**
* 当 name 没有值时, 使用 name 进行查询
* 否则使用 id 进行查询
*/
List selectByNameOrId(Person person);
}
mapper映射文件 PersonMapper.xml
id, name, age
select
from person
select
from person
and name like concat('%', #{name}, '%')
and age=#{age}
update person
`name` = #{name,jdbcType=VARCHAR},
`age` = #{age,jdbcType=INTEGER},
where id = #{id,jdbcType=INTEGER}
insert into person
id,
`name`,
age,
#{id,jdbcType=INTEGER},
#{name,jdbcType=VARCHAR},
#{age,jdbcType=INTEGER},
select
from person
where 1=1
and id=#{id}
and name=#{name}
测试文件PersonTest.java
package com.mouday;
import com.mouday.mapper.PersonMapper;
import com.mouday.pojo.Person;
import com.mouday.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class PersonTest {
private SqlSession session;
private PersonMapper mapper;
@Before
public void init() throws IOException {
this.session = MyBatisUtil.getSqlSession();
this.mapper = this.session.getMapper(PersonMapper.class);
}
@After
public void destroy() {
this.session.close();
}
@Test
public void testSelect() {
System.out.println(mapper.selectAll());
}
/**
* 选择数据
*/
@Test
public void testSelectByStudentSelective() {
Person person = new Person();
System.out.println(mapper.selectByPersonSelective(person));
// select id, name, age from person
person.setName("操");
System.out.println(mapper.selectByPersonSelective(person));
// select id, name, age from person WHERE name like concat('%', ?, '%')
person.setAge(25);
System.out.println(mapper.selectByPersonSelective(person));
// select id, name, age from person WHERE name like concat('%', ?, '%') and age=?
}
/**
* 更新数据
*/
@Test
public void testUpdateByPrimaryKeySelective() {
Person person = new Person();
person.setId(1);
person.setAge(26);
mapper.updateByPrimaryKeySelective(person);
// update person SET `age` = ? where id = ?
session.commit();
person.setName("刘禅");
mapper.updateByPrimaryKeySelective(person);
session.commit();
// update person SET `name` = ?, `age` = ? where id = ?
}
/**
* 插入数据
*/
@Test
public void testInsertSelective() {
Person person = new Person();
person.setName("司马懿");
mapper.insertSelective(person);
// insert into person ( `name` ) values ( ? )
session.commit();
person.setAge(26);
mapper.insertSelective(person);
// insert into person ( `name`, age ) values ( ?, ? )
session.commit();
}
/**
* 选择查询
*/
@Test
public void testSelectByNameOrId() {
Person person = new Person();
person.setName("司马懿");
mapper.selectByNameOrId(person);
// select id, name, age from person where 1=1 and name=?
person.setId(1);
mapper.selectByNameOrId(person);
// select id, name, age from person where 1=1 and id=?
}
}
Where
set 和 where 其实都是 trim 标签的一种类型
where 等价于
表示当 trim 中含有内容时, 添加 where, 且第一个为 and 或 or 时, 会将其去掉。 而如果没有内容, 则不添加 where。
set 等价于
...
表示当 trim 中含有内容时, 添加 set, 且最后的内容为 , 时, 会将其去掉。而没有内容, 不添加 set
trim 的几个属性
prefix: 当 trim 元素包含有内容时, 增加 prefix 所指定的前缀
prefixOverrides: 当 trim 元素包含有内容时, 去除 prefixOverrides 指定的 前缀
suffix: 当 trim 元素包含有内容时, 增加 suffix 所指定的后缀
suffixOverrides:当 trim 元素包含有内容时, 去除 suffixOverrides 指定的后缀
参考
- 你用过Mybatis的动态SQL后,就知道写SQL有多爽了!
- https://mybatis.org/mybatis-3/zh/dynamic-sql.html