1,简介
1.1,什么是MyBatis
官网:https://mybatis.org/mybatis-3/zh/index.html
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
简而言之:MyBatis简化了我们对 JDBC 的操作。
1.2MyBatis特点
- MyBatis是一个半自动化的持久层框架
- 开发人员可以自己编写SQL语句来实现优化
- 在MyBatis中,SQL和Java代码是分开,边界清晰
2,测试
2.1,一个数据库表
create database if not exists mydb;
use mydb;
create table t_department
(
did int auto_increment primary key,
dname varchar(100) not null,
description varchar(200) null,
manager_id int null
);
2.2,添加依赖
<!-- MyBatis的依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- 连接MySQl数据库的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
2.3,写一个实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Department {
private Integer did;
private String dname;
private String description;
}
2.4,配置MyBatis全局配置文件
在resources中创建一个mybatis-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根元素 -->
<configuration>
<!-- 配置默认运行环境 -->
<environments default="development">
<!-- 配置可运行环境 -->
<environment id="development">
<!-- 配置事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/aad?useSSL=false&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="DepartmentMapper.xml"/>
</mappers>
</configuration>
2.5,编写Mapper接口类
public interface DepartmentMapper {
//查询全部
List<Department> selectDepartments();
//插入
void insert(Department department);
//更新
void update(Department department);
//删除
void delete(int id);
//根据id查询
Department select(Integer did);
//多条件查询
List<Department> selectByCondition(Map<String, Object> map);
}
2.6,编写MyBatis映射文件
在resources文件夹下创建一个DepartmentMapper.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.openlab.mapper.DepartmentMapper">
<!--查询全部-->
<select id="selectDepartments" resultType="com.openlab.entity.Department">
select * from t_department
</select>
<!--插入-->
<insert id="insert" parameterType="com.openlab.entity.Department">
insert into t_department(dname,description) values (#{dname},#{description})
</insert>
<!--更新-->
<update id="update" parameterType="com.openlab.entity.Department">
update t_department set dname = #{dname},description = #{description} where did = #{did}
</update>
<!--删除-->
<delete id="delete">
delete from t_department where did = #{did}
</delete>
<!--根据id查询-->
<select id="select" parameterType="int" resultType="com.openlab.entity.Department">
select * from t_department where did = #{did}
</select>
<!--多条件查询-->
<select id="selectByCondition" parameterType="map" resultType="com.openlab.entity.Department">
select * from t_department where did = #{did} and dname = #{dname}
</select>
</mapper>
2.7,测试类
将映射文件添加到全局配置文件mybatis-config.xml中
<mappers>
<mapper resource="DepartmentMapper.xml" />
</mappers>
导入在pom.xml中导入junit依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
2.7.1,配置
public class MyBatisCRUDTest {
private SqlSession sqlSession;
@Before
public void init() {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
}catch (IOException e) {
e.printStackTrace();
}
}
@After
public void destroy() {
sqlSession.close();
}
}
2.7.2,查询全部测试
//查询全部
@Test
public void selectAll() {
DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
List<Department> departments = mapper.selectDepartments();
departments.forEach(department -> {
System.out.println(department.getDid() + "\t" + department.getDname());
});
}
2.7.3,插入测试
//插入测试
@Test
public void testInsert() {
DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
mapper.insert(new Department().setDname("市场部").setDescription("宣传"));
//提交事务
sqlSession.commit();
}
2.7.4,更新测试
//更新测试
@Test
public void updateTest() {
try {
DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
mapper.update(new Department().setDid(5).setDname("市场部").setDescription("创收部门"));
sqlSession.commit();
}catch (Exception e) {
sqlSession.rollback();
}
}
2.7.5,根据id查询
//根据id查询
@Test
public void testSelect() {
DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
Department department = mapper.select(5);
System.out.println(department);
}
2.7.6,多条件查询
//多条件查询
@Test
public void testSelectByCondition() {
Map<String,Object> map = new HashMap<>();
map.put("did","5");
map.put("dname","市场部");
DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
List<Department> departments = mapper.selectByCondition(map);
departments.forEach((department) -> {
System.out.println(department.getDid() + "\t" + department.getDname());
});
}
2.7.7,删除测试
//删除测试
@Test
public void testDelete() {
try {
DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
mapper.delete(5);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}
}