一、MyBatis有哪些注解?
1. @Select:用于执行查询操作,可以指定 SQL 语句。
2. @SelectKey:用于在插入操作后获取数据库自动生成的键值。
3. @Insert:用于执行插入操作,可以指定 SQL 语句。
4. @Update:用于执行更新操作,可以指定 SQL 语句。
5. @Delete:用于执行删除操作,可以指定 SQL 语句。
6. @Results:用于定义结果集的映射规则。
7. @Result:用于定义单个字段的映射规则,通常用在 @Results 注解中。
8. @One:用于一对一的关联查询。
9. @Many:用于一对多的关联查询。
10. @Param:用于指定方法参数的名称,方便在 SQL 语句中引用。
11. @Options:用于设置查询的一些额外选项,如分页查询的参数。
12. @CacheNamespace:用于声明一个缓存空间,可以对查询结果进行缓存。
13. @CacheNamespaceRef:用于引用其他 Mapper 中定义的缓存空间。
二、MyBatis注解案例
Example:
有学生表t_student及班级表t_class,其中班级表和学生表之间是一对多的关联关系,请使用注解完成以下要求:
1.建立数据库class8_ssm及表t_student和t_class
2.利用注解实现班级和学生信息的增删改查操作
3.利用注解实现一对多的查询。查询某个班的所有学生的信息
三、案例分析
1.学生功能实现:
增加学生信息、删除学生信息、修改学生信息、查询学生信息
2.班级功能实现:
增加班级信息、删除班级信息、修改班级信息、查询班级信息、查询班级下学生
3.对象关系图
四、案例实现
B.项目文件结构
1.创建数据库及对应数据表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_class
-- ----------------------------
DROP TABLE IF EXISTS `t_class`;
CREATE TABLE `t_class` (
`id` int NOT NULL AUTO_INCREMENT,
`cname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`cteacher` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`ctel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for t_student
-- ----------------------------
DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student` (
`id` int NOT NULL AUTO_INCREMENT,
`sname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`sage` int NOT NULL,
`sgender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`classid` int NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `classid`(`classid` ASC) USING BTREE,
CONSTRAINT `classid` FOREIGN KEY (`classid`) REFERENCES `t_class` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
2.创建Spring项目,在pom文件引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ljl</groupId>
<artifactId>class8_ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
3.创建数据库连接配置文件及MyBatis配置文件
1.db.properties
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/class8_ssm?serverTimezone=UTC&\characterEncoding=utf-8&useUnicode=true&useSSl=false
mysql.username=root
mysql.password=pjl2003
2.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>
<properties resource="db.properties"/>
<!-- 设置实体别名-->
<typeAliases>
<package name="com.ljl.Entity"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}" />
<property name="url" value="${mysql.url}" />
<!-- //数据库账号-->
<property name="username" value="${mysql.username}" />
<!-- //数据库密码-->
<property name="password" value="${mysql.password}" />
</dataSource>
</environment>
</environments>
<!--声明类对应的sql操作文件-->
<mappers>
<mapper class="com.ljl.Mapper.ClassMapper"/>
<mapper class="com.ljl.Mapper.StudentMapper"/>
</mappers>
</configuration>
4.创建Entity软件包,在包中创建对象实体类
1.ClassE
package com.ljl.Entity;
import java.util.List;
public class ClassE {
private int id;
private String cname;
private String cteacher;
private String ctel;
private List<Student> student;
public ClassE() {
}
public ClassE(int id, String cname, String cteacher, String ctel, List<Student> student) {
this.id = id;
this.cname = cname;
this.cteacher = cteacher;
this.ctel = ctel;
this.student = student;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCteacher() {
return cteacher;
}
public void setCteacher(String cteacher) {
this.cteacher = cteacher;
}
public String getCtel() {
return ctel;
}
public void setCtel(String ctel) {
this.ctel = ctel;
}
public List<Student> getStudent() {
return student;
}
public void setStudent(List<Student> student) {
this.student = student;
}
@Override
public String toString() {
return "Class{" +
"id=" + id +
", cname='" + cname + '\'' +
", cteacher='" + cteacher + '\'' +
", ctel='" + ctel + '\'' +
", student=" + student +
'}';
}
}
2.Student
package com.ljl.Entity;
public class Student {
private int id;
private String sname;
private int sage;
private String sgender;
private int classid;
public Student() {
}
public Student(int id, String sname, int sage, String sgender, int classid) {
this.id = id;
this.sname = sname;
this.sage = sage;
this.sgender = sgender;
this.classid = classid;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
public String getSgender() {
return sgender;
}
public void setSgender(String sgender) {
this.sgender = sgender;
}
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", sname='" + sname + '\'' +
", sage=" + sage +
", sgender='" + sgender + '\'' +
", classid=" + classid +
'}';
}
}
5.创建Mapper软件包,在包中创建数据操作方法
1.ClassMapper
package com.ljl.Mapper;
import com.ljl.Entity.ClassE;
import com.ljl.Entity.Student;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface ClassMapper {
//TODO 增加班级信息
@Insert("INSERT INTO t_class (cname, cteacher, ctel) values (#{cname}, #{cteacher}, #{ctel})")
int insertClass(ClassE c);
//TODO 删除班级信息-根据-id-删除
@Delete("DELETE FROM t_class WHERE id = #{id}")
int deleteClass(int id);
//TODO 修改班级信息-根据-班级名称-修改
@Update("UPDATE t_class SET cteacher = #{cteacher}, ctel = #{ctel} WHERE cname = #{cname}")
int updateClass(ClassE c);
//TODO 查询班级信息-根据班级名称查询
@Select("SELECT * FROM t_class WHERE cname = #{cname}")
ClassE getClassByCname(String cname);
@Select("SELECT * FROM t_class")
List<ClassE> getAllClassE();
//TODO 查询班级下所有学生的信息
@Select("SELECT * FROM t_class WHERE id = #{id}")
@Results({@Result(id = true, column = "id", property = "id"),
@Result(column = "cname", property = "cname"),
@Result(column = "cteacher", property = "cteacher"),
@Result(column = "ctel", property = "ctel"),
@Result(column = "id", property = "student", many = @Many(select = "com.ljl.Mapper.StudentMapper.selectStudentByClassid"))})
ClassE selectClassAndStudentById(int id);
}
2.StudentMapper
package com.ljl.Mapper;
import com.ljl.Entity.ClassE;
import com.ljl.Entity.Student;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface StudentMapper {
//TODO 增加学生信息
@Insert("INSERT INTO t_student(sname, sage, sgender, classid) values (#{sname}, #{sage}, #{sgender}, #{classid})")
int insertStudent(Student student);
//TODO 删除学生信息-根据-学生名称-删除
@Delete("DELETE FROM t_student WHERE sname = #{sname}")
int deleteStudent(String sname);
//TODO 修改学生信息-根据-学生名称-修改
@Update("UPDATE t_student SET sage = #{sage}, sgender = #{sgender}, classid = #{classid} WHERE sname = #{sname}")
int updateStudent(Student student);
//TODO 查询学生信息-根据学生名称查询
@Select("SELECT * FROM t_student WHERE sname = #{sname}")
Student getStudentBySname(String sname);
@Select("SELECT * FROM t_student")
List<Student> getAllStudent();
//TODO 查询班级下所有学生的信息
@Select("SELECT * FROM t_student WHERE classid = #{classid}")
@Results({@Result(id = true,column = "id", property = "id" ),
@Result(column = "sname", property = "sname"),
@Result(column = "sage", property = "sage"),
@Result(column = "sgender", property = "sgender"),
@Result(column = "classid", property = "classid"),})
List<Student> selectStudentByClassid(int classid);
}
6.创建Dao软件包,创建方法实现接口及具体实现类
1.学生层面StudentDao及StudentDaoImpl
package com.ljl.Dao;
import com.ljl.Entity.ClassE;
import com.ljl.Entity.Student;
import java.util.List;
public interface StudentDao {
public int insertStudent(Student student);
public int deleteStudent(String sname);
public int updateStudent(Student student);
public List<Student> getAllStudent();
public Student getStudentBySname(String sname);
}
package com.ljl.Dao.Impl;
import com.ljl.Dao.StudentDao;
import com.ljl.Entity.ClassE;
import com.ljl.Entity.Student;
import com.ljl.Mapper.ClassMapper;
import com.ljl.Mapper.StudentMapper;
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 org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@Component
public class StudentDaoImpl implements StudentDao {
SqlSessionFactory ssf = null;
@Override
public int insertStudent(Student student) {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
int result_code = studentMapper.insertStudent(student);
sqlSession.commit();
return result_code;
}
@Override
public int deleteStudent(String sname) {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
int result_code = studentMapper.deleteStudent(sname);
sqlSession.commit();
return result_code;
}
@Override
public int updateStudent(Student student) {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
int result_code = studentMapper.updateStudent(student);
sqlSession.commit();
return result_code;
}
@Override
public List<Student> getAllStudent() {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.getAllStudent();
return students;
}
@Override
public Student getStudentBySname(String sname) {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = studentMapper.getStudentBySname(sname);
return student;
}
}
2.班级层面ClassDao及ClassDaoImpl
package com.ljl.Dao;
import com.ljl.Entity.ClassE;
import java.util.List;
public interface ClassDao {
public int insertClass(ClassE c);
public int deleteClass(int id);
public int updateClass(ClassE c);
public ClassE getClassByCname(String cname);
public List<ClassE> getAllClassE();
public ClassE selectClassAndStudentById(int id);
}
package com.ljl.Dao.Impl;
import com.ljl.Dao.ClassDao;
import com.ljl.Entity.ClassE;
import com.ljl.Mapper.ClassMapper;
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 org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@Component
public class ClassDaoImpl implements ClassDao {
SqlSessionFactory ssf = null;
@Override
public int insertClass(ClassE c) {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
ClassMapper classMapper = sqlSession.getMapper(ClassMapper.class);
int result_code = classMapper.insertClass(c);
sqlSession.commit();
return result_code;
}
@Override
public int deleteClass(int id) {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
ClassMapper classMapper = sqlSession.getMapper(ClassMapper.class);
int result_code = classMapper.deleteClass(id);
sqlSession.commit();
return result_code;
}
@Override
public int updateClass(ClassE c) {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
ClassMapper classMapper = sqlSession.getMapper(ClassMapper.class);
int result_code = classMapper.updateClass(c);
sqlSession.commit();
return result_code;
}
@Override
public ClassE getClassByCname(String cname) {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
ClassMapper classMapper = sqlSession.getMapper(ClassMapper.class);
ClassE c = classMapper.getClassByCname(cname);
return c;
}
@Override
public List<ClassE> getAllClassE() {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
ClassMapper classMapper = sqlSession.getMapper(ClassMapper.class);
List<ClassE> classES = classMapper.getAllClassE();
return classES;
}
@Override
public ClassE selectClassAndStudentById(int id) {
try {
InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = ssf.openSession();
ClassMapper classMapper = sqlSession.getMapper(ClassMapper.class);
ClassE c = classMapper.selectClassAndStudentById(id);
return c;
}
}
7.在Main文件中编辑业务逻辑
package com.ljl;
import com.ljl.Dao.ClassDao;
import com.ljl.Dao.Impl.ClassDaoImpl;
import com.ljl.Dao.Impl.StudentDaoImpl;
import com.ljl.Dao.StudentDao;
import com.ljl.Entity.ClassE;
import com.ljl.Entity.Student;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("欢迎使用岚精灵班级管理系统!");
ClassDao classDao = new ClassDaoImpl();
StudentDao studentDao = new StudentDaoImpl();
boolean status = true;
while (status) {
System.out.println("\n\n1.学生操作\n2.班级操作\n3.退出系统");
Scanner scanner = new Scanner(System.in);
System.out.println("请选择操作:");
int choice1 = scanner.nextInt();
if (choice1 == 1) {
System.out.println("\n\n1.添加学生\n2.删除学生\n3.修改学生\n4.查询学生\n5.返回");
int choice2 = scanner.nextInt();
if (choice2 == 1) {
Student student = new Student();
System.out.println("学生姓名:");
String sname = scanner.next();
student.setSname(sname);
System.out.println("学生年龄:");
int sage = scanner.nextInt();
student.setSage(sage);
System.out.println("学生性别:");
String sgender = scanner.next();
student.setSgender(sgender);
System.out.println("学生班级id:");
int classid = scanner.nextInt();
student.setClassid(classid);
int result = studentDao.insertStudent(student);
if (result == 1) {
System.out.println("添加成功!");
}else {
System.out.println("添加失败!");
}
}else if (choice2 == 2) {
System.out.println("请输入需要删除学生名称:");
String sname = scanner.next();
int result_code = studentDao.deleteStudent(sname);
if (result_code == 1) {
System.out.println("删除成功!");
}else {
System.out.println("删除失败!");
}
}else if (choice2 == 3) {
Student student = new Student();
System.out.println("需要修改信息的学生姓名:");
String sname = scanner.next();
student.setSname(sname);
System.out.println("学生年龄:");
int sage = scanner.nextInt();
student.setSage(sage);
System.out.println("学生性别:");
String sgender = scanner.next();
student.setSgender(sgender);
System.out.println("学生班级id:");
int classid = scanner.nextInt();
student.setClassid(classid);
int result = studentDao.updateStudent(student);
if (result == 1) {
System.out.println("修改成功!");
}else {
System.out.println("修改失败!");
}
}else if (choice2 == 4) {
System.out.println("请输入需要查询的学生名称:");
String sname = scanner.next();
Student student = studentDao.getStudentBySname(sname);
System.out.println("id:" + student.getId());
System.out.println("姓名:" + student.getSname());
System.out.println("年龄:" + student.getSage());
System.out.println("性别:" + student.getSgender());
System.out.println("班级id:" + student.getClassid());
}
}else if (choice1 == 2) {
System.out.println("\n\n1.添加班级\n2.删除班级\n3.修改班级\n4.查询班级信息\n5.查询所有班级信息\n6.查询班级学生名单\n7.返回");
int choice2 = scanner.nextInt();
if (choice2 == 1) {
ClassE classE = new ClassE();
System.out.println("请输入班级名称:");
String cname = scanner.next();
classE.setCname(cname);
System.out.println("请输入辅导员名称:");
String cteacher = scanner.next();
classE.setCteacher(cteacher);
System.out.println("请输入辅导员电话:");
String ctel = scanner.next();
classE.setCtel(ctel);
int result_code = classDao.insertClass(classE);
if (result_code == 1) {
System.out.println("添加成功!");
}else {
System.out.println("添加失败!");
}
}else if (choice2 == 2) {
System.out.println("请输入需要删除的id:");
int id = scanner.nextInt();
int result_code = classDao.deleteClass(id);
if (result_code == 1) {
System.out.println("删除成功!");
}else {
System.out.println("删除失败!");
}
}else if (choice2 == 3) {
ClassE classE = new ClassE();
System.out.println("请输入需要修改的班级名称:");
String cname = scanner.next();
classE.setCname(cname);
System.out.println("请输入辅导员名称:");
String cteacher = scanner.next();
classE.setCteacher(cteacher);
System.out.println("请输入辅导员电话:");
String ctel = scanner.next();
classE.setCtel(ctel);
int result_code = classDao.updateClass(classE);
if (result_code == 1) {
System.out.println("修改成功!");
}else {
System.out.println("修改失败!");
}
}else if (choice2 == 4) {
System.out.println("请输入需要查询的班级名称:");
String cname = scanner.next();
ClassE classE = classDao.getClassByCname(cname);
System.out.println("id:" + classE.getId());
System.out.println("班级名称:" + classE.getCname());
System.out.println("辅导员:" + classE.getCteacher());
System.out.println("电话:" + classE.getCtel());
}else if (choice2 == 5) {
List<ClassE> classE = classDao.getAllClassE();
for (ClassE classE1 : classE) {
System.out.println("===================================");
System.out.println("id:" + classE1.getId());
System.out.println("班级名称:" + classE1.getCname());
System.out.println("辅导员:" + classE1.getCteacher());
System.out.println("电话:" + classE1.getCtel());
System.out.println("===================================");
}
}else if (choice2 == 6) {
System.out.println("请输入需要查询的班级id:");
int id = scanner.nextInt();
ClassE classE = classDao.selectClassAndStudentById(id);
System.out.println("id:" + classE.getId());
System.out.println("班级名称:" + classE.getCname());
System.out.println("辅导员:" + classE.getCteacher());
System.out.println("电话:" + classE.getCtel());
List<Student> studentList = classE.getStudent();
System.out.println("===================================");
for (Student student1 : studentList) {
System.out.println("|| id:" + student1.getId());
System.out.println("|| 姓名:" + student1.getSname());
System.out.println("|| 性别:" + student1.getSgender());
System.out.println("|| 年龄:" + student1.getSage());
System.out.println("===================================");
}
}
}else if (choice1 == 3) {
status = false;
System.out.println("\n欢迎下次使用!");
}
}
}
}