目录
- 提要
- 一、创建项目及配置MyBatis
- 1. 选择依赖
- 2. 修改驱动版本
- 3. 建立映射文件位置
- 4. 配置项目参数
- 二、基于MaBatis操作数据库
- 1. 手动类型
- 1.1 创建关联的实体类
- 1.1.1 创建文件
- 1.1.2 编写代码
- 1.2 创建操作数据库的文件(编写SQL语句)
- 1.2.1 创建文件
- 1.2.2 编写代码
- 2. 自动类型
- 2.1 创建关联实体类
- 2.1.1 配置工具
- 2.1.2 生成实体类
- 2.2 创建操作数据库的文件(编写SQL语句)
- 2.2.1 创建接口文件
- 2.2.2 编写函数接口
- 2.2.3 创建映射文件
- 2.2.4 编写映射文件
- 3. 测试
提要
项目工具:IDea
主要关于在Idea工具中使用MyBatis操作数据库的详细步骤
步骤的正确性待验证
一、创建项目及配置MyBatis
1. 选择依赖
创建SpringBoot项目时需要选择 MySQL Driver 和 MyBatis Framework两个依赖
2. 修改驱动版本
修改pom.xml中MySQL驱动版本,我使用的是5.1.49,增加如下代码
<version>5.1.49</version>
3. 建立映射文件位置
在resources目录下创建mappers文件夹
4. 配置项目参数
在 application.properties里配置如下数的参数
// 配置驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
// 设置数据库的用户名、密码、地址
spring.datasource.username=root
spring.datasource.password=
spring.datasource.url=jdbc:mysql://localhost:3306/upc_demo?characterEncoding=utf8
// 配置映射文件的路径
// 目的:程序会自动寻找mappers目录下所有的 .xml文件
mybatis.mapper-locations=classpath:mappers/*.xml
二、基于MaBatis操作数据库
1. 手动类型
1.1 创建关联的实体类
- 个人理解实体类与结构体类似
- 一个实体类就是一个数据类型,我们可以创建自己的数据类型
- 此处我们创建的实体类,本质是一种与数据库表格组成类似的数据类型,该实体类只是操作数据库时数据交流的容器,既可以用于传递参数,也可以保存操作结果
1.1.1 创建文件
- 在XXXApplication文件的同级目录中创建package(命名便于识别即可)
- 在该package下创建java class文件(命名与数据库要关联的表名匹配,我们匹配数据库中dept表,所以实体类命名为Dept)
1.1.2 编写代码
根据数据库中表格的列组成,创建实体类里的属性,以及set( )、get( )方法
package com.upc.mybatis_01.entity;
public class Dept {
// 创建对应属性
private Integer deptno;
private String dname;
private String loc;
// get、set方法-构建方法:
// 右键空白处->Generate->Getter and Setter->选择所有属性构建即可
public Integer getDeptno() { return deptno;}
public void setDeptno(Integer deptno) { this.deptno = deptno; }
public String getDname() { return dname; }
public void setDname(String dname) { this.dname = dname; }
public String getLoc() { return loc; }
public void setLoc(String loc) { this.loc = loc; }
}
注意事项:
- 创建的类名,必须与表名对应:表名dept,类名Dept
- 类中的属性名(变量名)要与表中的列名一致:表格中一列名为deptno,则我们的属性名为 private Integer deptno
- 实体类中的属性数据类型与列的数据类型匹配,即列的数据为字符串,属性数据类型也要为字符串。MySQL中数据的类型与java数据类型对应关系如下
1.2 创建操作数据库的文件(编写SQL语句)
1.2.1 创建文件
- 在XXXApplication文件的同级目录中创建mapper的package
- 在mapper包里创建java interface函数接口文件(命名与操作表格匹配,我们要操作的表为dept,所以为DeptMapper)
1.2.2 编写代码
package com.upc.mybatis_01.mapper;
// 导入对应的实体类
import com.upc.mybatis_01.entity.Dept;
// 导入数据库操作的所有函数
import org.apache.ibatis.annotations.*;
// 引入导入查询结果的数据类型
import java.util.List;
import java.util.Map;
@Mapper
public interface DeptMapper {
// 增加操作
@Insert("insert into dept(deptno,dname,loc) values(#{deptno},#{dname},#{loc})")
public int save(Dept dept);
// 修改操作
@Update("update dept set dname=#{dname},"+
" loc=#{loc} where deptno=#{deptno}")
public int update(Dept dept);
// 删除操作
@Delete("delete from dept where deptno=#{deptno}")
public int delete(Integer deptno);
// 查询表格中所有数据
@Select("select deptno,dname,loc from dept")
public List<Dept> findAll();
// 分别统计每个部门下的总人数
@Select("select \n" +
"\td.deptno,d.dname,\n" +
"\tcount(e.empno) c,\n" +
"\tmax(e.sal) maxSal,\n" +
"\tmin(e.sal) minSal,\n" +
"\tsum(e.sal) sumSal,\n" +
"\tavg(e.sal) avgSal\n" +
"from emp e,dept d\n" +
"where e.deptno=d.deptno\n" +
"GROUP BY d.deptno,d.dname")
public List<Map<String,Object>> findGroup();
}
注意有知识点:
- @Mapper:是个声名,声名后spring就会自动管理我们这个接口,每当我们调用这个接口时,Spring会自动开启数据库,使用完会自动关闭数据库。
- @Insert、@Update、@Delete、@Select 等等是一种标识,程序运行时可以明确各部分代码都对应什么类型的操作
- 增删改查操作实质就是定义方法:输入数据:Dept实体类类型的数据;数据处理:将数据插入数据库的表格中;返回:一般插入、删除、修改的返回就是 1,所以返回是int类型
- #{deptno}:即取实体类dept里deptno的数据
- ’ + ’ 是将两个字符串连接在一起,即如果一个语句过长时,我们可以利用 + 把字符串拆分成多行,注意一旦使用 + ,后面的字符串要先空一位,因为一旦拼接,不留空格回连成整个字符串,会识别错误
- 删除一般是根据主键为条件删除,使用主键以外的条件可能会不精准,我们的主键只是deptno,输入的数据就只有deptno即可
- java util Map<Spring,Object>:是一个字典,当查询返回的结果是:最大值:100、最小值:0、总人数:160等等时,该字典是很好的容器
- List《Dept》:就是Dept类的结构体数组,每个元素是Dept类的数据,所以List可以完整存储下dept表格中的所有数据(注意是尖括号)
- List《Map》:就是Map类型数据的结构体数组,每个元素是一个字典(注意是尖括号)
- 对于复杂的甚至是所有的sql语句都建议在客户端写完,再粘贴过来,避免出错(粘贴过来后\t与\n是不用管的)
2. 自动类型
2.1 创建关联实体类
2.1.1 配置工具
- 点击Database
- 选择MySQL
- 选择驱动5.1
- 下载对应驱动(下载后不用再下载)
- 填写相关信息,Test后,Apply -> OK
- 在XXXApplication文件的同级目录中创建存放实体类的po包package
- 进入扩展功能
- 进入下图中文件
- 修改图中文件的内容(每次改变项目都要修改)
- 修改后如下
- 修改文件中的实体类包名为我们自己创建的po包
2.1.2 生成实体类
- 选择要生成关联实体类的表格
- 右键点击,并选择Genreate POJOs.groovy
- 选择实体类文件生成位置
2.2 创建操作数据库的文件(编写SQL语句)
2.2.1 创建接口文件
- 在po包的同级目录中创建mapper包
- 在mapper包中创建java interface函数接口文件(命名与操作数据库的表名匹配,我们操作表为salgrade,命名为SalgradeMapper)
2.2.2 编写函数接口
这里编写了一个查询数据的函数接口
package com.upc.mybatis_01.mapper;
import com.upc.mybatis_01.po.Salgrade;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SalgradeMapper {
//写一个查询所有的方法
public List<Salgrade> findAll();
}
2.2.3 创建映射文件
- 在resources的mappers目录下创建与接口文件同名的 .xml 文件
2.2.4 编写映射文件
手动类型中,SQL语句直接在mapper的接口文件中编写了;自动类型是mapper文件只写函数接口,xml映射文件里写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">
<!--namesapce指向我们要处理的对应接口文件-->
<mapper namespace="com.upc.mybatis_01.mapper.SalgradeMapper">
<!--根据SalgradeMappe接口文件里定义的函数接口,编写Sql语句-->
<select id="findAll" resultType="com.upc.mybatis_01.po.SalgradeMapper">
Select * from salgrade
</select>
</mapper>
注意:
- id 属性对应接口中方法的名称,我们在SalgradeMapper.java接口文件中定义的是findAll()那么id=“findAll”
- parameterType:方法输入数据的类型(若没有参数不写parameterType)
- resultType:表示返回值的类型,例如返回值List中放的是Emp类型,即List,则resultTYpe=“Emp”;但我们要指定哪个实体类,所以要这样写:com.upc.mybatis_01.mapper.SalgradeMapper
- 同理建议在数据库可检测语法的地方写,例如console文件里写,或者在navicate里写
3. 测试
目的:测试编写的整个流程的正确性
- 选中接口文件中的接口类
- 选择黄色灯泡,选择Creat Test
- 选中要测试的函数接口,点击OK
- 编写测试文件
package com.upc.mybatis_01.mapper;
import com.upc.mybatis_01.po.Salgrade;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class SalgradeMapperTest {
@Resource
private SalgradeMapper salgradeMapper;
@Test
void findAll() {
}
}
注意:
- @SpringBootTest:必须添加,这样Spring框架才会代理测试
- @Resource:必须添加,明确测试的内容
- 选中所有代码测试即可