目录
引入
在这篇文章中“一篇帮你配置Mybatis-CSDN博客”,已经实现了MyBatis的配置,任何语言的使用都离不开底层算法“添加”、“修改”、“搜索”、“删除”。
接下来就着上次文章来介绍一下,Mybatis是怎么实现增删改查的。
实现增删改查主要应用这四部分的文件
先简单介绍一下各个部分的作用。
1.Dao区域
DAO(数据访问层):
- 包含与数据库交互的接口和实现类。每个DAO接口对应一个数据库表或实体类,而实现类则提供了与数据库进行CRUD(创建、读取、更新、删除)操作的方法。
PersonDao
、StudentDao
、TeacherDao
和UserDao
是分别对应Person
、Student
、Teacher
和User
实体的Dao接口。PersonDaoImpl
、StudentDaoImpl
、TeacherDaoImpl
和UserDaoImpl
是这些Dao接口的实现类,它们包含了与数据库交互的具体实现。
里面代码主要长这样(先看一眼,稍后详细介绍):
2.entity区域(数据库的实体)
实体类包(entity):
- 包含所有实体类,这些类通常与数据库表结构相对应。
Person
、Student
、Teacher
和User
类代表了数据库中的四个表或四个不同类型的实体。
3.Mapper.xml区域
资源包(resources):
- 包含配置文件和映射文件。
mapper
目录:包含Mybatis的映射文件,这些文件定义了实体类与数据库表之间的映射关系。PersonMapper.xml
、StudentMapper.xml
和TeacherMapper.xml
是Mybatis的映射文件,分别对应Person
、Student
和Teacher
实体的映射关系。
里面代码主要长这样(先看一眼,稍后详细介绍):
【简而言之,这里是存储那些数据库的sql查询语句的地方。】
4.SqlMapConfig.xml区域
SqlMapConfig.xml
:Mybatis的配置文件,用于配置数据源、事务管理器等。
这里承载着连接3.部分的Mapper.xml文件(如下)
详细介绍
这里是一份数据库数据,通过MyBatis对它进行增删改查处理:
首先,要有一份Teacher类对数据库表项进行映射,并具备基础的构建以及重写toString:
package com.qcby.entity;
public class Teacher {
private Integer id;
private String sex;
private String name;
private String phone;
private String email;
public Teacher(Integer id, String name, String sex, String phone, String email) {
this.id = id;
this.sex = sex;
this.name = name;
this.phone = phone;
this.email = email;
}
public Teacher() {
}
public Teacher(String name, String sex, String phone, String email) {
this.sex = sex;
this.name = name;
this.phone = phone;
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
'}';
}
}
Mapper.xml语法
查找全部
<select id="findAll" resultType="com.qcby.entity.User">
select *from user;
</select>
对应的Dao方法区域所编写:
List<Teacher> findAll();//注意:这里的“findAll”方法名,要和Mapper文件中id=“”中的名字相对应
//查出来的可能不止一条所以引入泛型存储查出来的Teacher对象们
对应Test测试编写:
@Test
public void findAll(){
List<Teacher> teachers = mapper.findAll();//创建承载对象的List来盛纳查找出来的对象
for(Teacher teacher:teachers){
System.out.println(teacher.toString());//遍历打印
}
}
<select>
: 这是MyBatis中用于定义查询操作的标签。
id="findAll"
: 这是查询的唯一标识符。在MyBatis的Mapper接口中,你可以使用这个ID来引用这个查询。例如,如果你有一个名为UserMapper
的接口,你可能会在其中定义一个名为findAll
的方法,该方法将执行这个查询。
resultType="com.qcby.entity.User"
: 这指定了查询结果应该被映射到的Java类型。在这个例子中,结果将被映射到com.qcby.entity.User
类的实例中。这意味着MyBatis将期望从数据库查询中返回的结果列与User
类中的属性相匹配,并将它们相应地填充到User
对象中。
select * from user;
这是实际的SQL查询语句。它从user
表中检索所有列和所有行。
根据ID查找
<!-- id后面跟着的是方法名字(UserDao接口相对应) -->
<!-- parameterType后面表示入参类型 -->
<select id="findById" resultType="com.qcby.entity.User" parameterType="int">
select *from user where id=#{id};
</select>
对应的Dao方法区域所编写:
Teacher findById(int id);
//因为id是主键只能查出来一条,即对应Teacher一个类,所以直接写Teacher就行,不用再用List<>承载
注意:()里面表示传参,和Mapper中的parameterType="int"相对应
对应Test测试编写:
@Test
public void findById(){
Teacher teacher=mapper.findById(2);//只能查出来一条,用一个Teacher对象就能承纳
System.out.println(teacher.toString());
}
<select>
: 如前所述,这是MyBatis中用于定义查询操作的标签。
id="findById"
: 这是查询的唯一标识符,与UserDao
(或UserMapper
,取决于您的命名约定)接口中的方法名相对应。这意味着在UserDao
接口中,您应该有一个名为findById
的方法,它接受一个整数参数并返回一个User
对象或User
对象的列表(尽管在这个例子中,由于是根据ID查询,所以通常只返回一个User
对象)。
resultType="com.qcby.entity.User"
: 这指定了查询结果应该被映射到的Java类型。MyBatis将期望从数据库查询中返回的结果列与User
类中的属性相匹配,并将它们相应地填充到User
对象中。
parameterType="int"
: 这指定了传入查询的参数类型。在这个例子中,参数是一个整数,表示要查询的用户的ID。
select * from user where id=#{id};
: 这是实际的SQL查询语句。它从user
表中检索所有列,但仅限于那些其id
列值等于传入参数#{id}
的行。#{id}
是一个参数占位符,MyBatis会将其替换为实际传入的参数值。
根据名字查找
<!-- 通过名字查找 -->
<select id="findByName" resultType="com.qcby.entity.User" parameterType="java.lang.String">
select * from user where username=#{username};
</select>
对应的Dao方法区域所编写:
List<Teacher> findByName(String name);
//不做过多赘述,和前面原理相同
对应Test测试编写:
@Test
public void findByName(){
List<Teacher> teachers=mapper.findByName("老王");
for(Teacher teacher:teachers){
System.out.println(teacher.toString());
}
}
和上面解释大差不差,不再过多赘述。
分页
<!-- 当数据量比较大,用分页查询-->
<select id="findPage" resultType="com.qcby.entity.User" parameterType="int">
select* from user limit #{pageSize} offset #{pageStart};
</select>
对应的Dao方法区域所编写:
List<Teacher> findPage(@Param("pageSize") int pageSize,@Param("pageStart") int pageStart);
//注意:pageSize和pageStart都不是Teacher类型中的一项(即不对应数据库的任意一项)
//所以在Dao区域()里面要用“@Param("name") name的类型 name”来获取
对应的Test编写:
@Test
public void findPage(){
int pageSize=2;//和前端分页大差不差
int pageIndex=1;
int pageStart=pageSize*(pageIndex-1);
List<Teacher> teachers=mapper.findPage(pageSize,pageStart);
for(Teacher teacher:teachers){
System.out.println(teacher.toString());
}
}
通过name和Id查找
<select id="findByNameAndId" resultType="com.qcby.entity.Teacher" parameterType="com.qcby.entity.Teacher">
select * from teacher where name=#{name} and id=#{id};
</select>
【注意:当传参超过两个且类型相同时,那么在parameterType中只写一个就行;但是如果超过两个且类型不同,就要用上面那种方法parameterType="com.qcby.entity.Teacher"】
对应的Dao编写:
List<Teacher> findByNameAndId(Teacher teacher);
因为传参是Teacher类,所以这里也写入实例
对应Test编写:
@Test
public void findByNameAndId(){
Teacher teacher=new Teacher();
//可以用set方法填入,也可以直接写在new Teacher()中--有构造方法
teacher.setName("teacher10");
teacher.setId(1);
List<Teacher> teachers=mapper.findByNameAndId(teacher);
for(Teacher t:teachers){
System.out.println(t.toString());
}
}
查询数量
<!-- 查询数据 -->
<select id="getCount" resultType="int">
select count(*) from teacher;
</select>
对应Dao编写:
int getCount();
返回是int类型的,所以用int,没有传参,所以括号里是空
对应Test编写:
@Test
public void getCount(){
System.out.println(mapper.getCount());
}
模糊查找
<!-- 模糊查找-->
<select id="findLike" resultType="com.qcby.entity.Teacher" parameterType="java.lang.String">
select *from teacher where name like #{likename};
</select>
对应Dao编写:
List<Teacher> findLike(@Param("likename") String likename);
//同样,异参要用@Param
Test编写:
@Test
public void findLike(){
List<Teacher> teachers=mapper.findLike("%teacher%");
for(Teacher teacher:teachers){
System.out.println(teacher.toString());
}
}
添加
<!-- 添加 -->
<insert id="insert" parameterType="com.qcby.entity.Teacher">
insert into teacher(sex,name,phone,email) value(#{sex},#{name},#{phone},#{email})
</insert>
对应Dao编写;
int insert(Teacher teacher);
//删除,修改,添加的返回值都是int类型的,即对几行做了处理
Test:
@Test
public void Insert(){
Teacher teacher=new Teacher("teacher11","女","124353","@3488");
mapper.insert(teacher);
session.commit();//事务提交
}
删除
<!-- 删除 -->
<delete id="delete" parameterType="int">
delete from teacher where id=#{id};
</delete>
Dao:
int delete(int id);
Test:
@Test
public void Delete(){
mapper.delete(5);
session.commit();
}
修改
<!-- 修改 -->
<update id="update" parameterType="com.qcby.entity.Teacher">
update teacher set sex=#{sex},name=#{name},phone=#{phone},email=#{email} where id=#{id};
</update>
Dao:
int update(Teacher teacher);
Test:
@Test
public void Update() {
Teacher teacher = new Teacher(5,"teacher7","男","12445","@473f");
mapper.update(teacher);
session.commit();
}
【注意:在删除、修改、添加的Test中都要添加“session.commit()”,因为这三种都对数据库的数据做出了操作,而查询则没有】