1. MyBatis注解开发

1.1 MyBatis的常用注解

这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper
映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@One:实现一对一结果集封装
@Many:实现一对多结果集封装

1.2 MyBatis的增删改查

我们完成简单的student表的增删改查的操作

  • 步骤一:创建mapper接口 ```sql public interface StudentMapper { //查询全部 @Select(“SELECT * FROM student”) public abstract List selectAll();

    //新增操作 @Insert(“INSERT INTO student VALUES (#{id},#{name},#{age})”) public abstract Integer insert(Student stu);

    //修改操作 @Update(“UPDATE student SET name=#{name},age=#{age} WHERE id=#{id}”) public abstract Integer update(Student stu);

    //删除操作 @Delete(“DELETE FROM student WHERE id=#{id}”) public abstract Integer delete(Integer id); }

  1. - 步骤二:测试类
  2. ```sql
  3. public class Test01 {
  4. @Test
  5. public void selectAll() throws Exception{
  6. //1.加载核心配置文件
  7. InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
  8. //2.获取SqlSession工厂对象
  9. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  10. //3.通过工厂对象获取SqlSession对象
  11. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  12. //4.获取StudentMapper接口的实现类对象
  13. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
  14. //5.调用实现类对象中的方法,接收结果
  15. List<Student> list = mapper.selectAll();
  16. //6.处理结果
  17. for (Student student : list) {
  18. System.out.println(student);
  19. }
  20. //7.释放资源
  21. sqlSession.close();
  22. is.close();
  23. }
  24. @Test
  25. public void insert() throws Exception{
  26. //1.加载核心配置文件
  27. InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
  28. //2.获取SqlSession工厂对象
  29. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  30. //3.通过工厂对象获取SqlSession对象
  31. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  32. //4.获取StudentMapper接口的实现类对象
  33. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
  34. //5.调用实现类对象中的方法,接收结果
  35. Student stu = new Student(4,"赵六",26);
  36. Integer result = mapper.insert(stu);
  37. //6.处理结果
  38. System.out.println(result);
  39. //7.释放资源
  40. sqlSession.close();
  41. is.close();
  42. }
  43. @Test
  44. public void update() throws Exception{
  45. //1.加载核心配置文件
  46. InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
  47. //2.获取SqlSession工厂对象
  48. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  49. //3.通过工厂对象获取SqlSession对象
  50. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  51. //4.获取StudentMapper接口的实现类对象
  52. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
  53. //5.调用实现类对象中的方法,接收结果
  54. Student stu = new Student(4,"赵六",36);
  55. Integer result = mapper.update(stu);
  56. //6.处理结果
  57. System.out.println(result);
  58. //7.释放资源
  59. sqlSession.close();
  60. is.close();
  61. }
  62. @Test
  63. public void delete() throws Exception{
  64. //1.加载核心配置文件
  65. InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
  66. //2.获取SqlSession工厂对象
  67. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  68. //3.通过工厂对象获取SqlSession对象
  69. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  70. //4.获取StudentMapper接口的实现类对象
  71. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
  72. //5.调用实现类对象中的方法,接收结果
  73. Integer result = mapper.delete(4);
  74. //6.处理结果
  75. System.out.println(result);
  76. //7.释放资源
  77. sqlSession.close();
  78. is.close();
  79. }
  80. }
  • 注意:

修改MyBatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可

  1. <mappers>
  2. <!--扫描使用注解的类-->
  3. <mapper class="com.itheima.mapper.UserMapper"></mapper>
  4. </mappers>
  1. 或者指定扫描包含映射关系的接口所在的包也可以
  1. <mappers>
  2. <!--扫描使用注解的类所在的包-->
  3. <package name="com.itheima.mapper"></package>
  4. </mappers>

1.3 注解开发总结

注解可以简化开发操作,省略映射配置文件的编写。

  • 常用注解 @Select(“查询的 SQL 语句”):执行查询操作注解@Insert(“查询的 SQL 语句”):执行新增操作注解@Update(“查询的 SQL 语句”):执行修改操作注解@Delete(“查询的 SQL 语句”):执行删除操作注解
  • 配置映射关系
    1. <mappers> <package name="接口所在包"/> </mappers>

    2. MyBatis注解实现多表操作

    2.1 MyBatis的注解实现复杂映射开发

    实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置
    图片10.png

    2.2 一对一查询

    2.2.1 一对一查询的模型

    一对一查询的需求:查询一个用户信息,与此同时查询出该用户对应的身份证信息
    1590942011460.png

    2.2.2 一对一查询的语句

    对应的sql语句: ```sql SELECT * FROM card;

SELECT * FROM person WHERE id=#{id};

  1. <a name="vTdLH"></a>
  2. ### 2.2.3 创建PersonMapper接口
  3. ```sql
  4. public interface PersonMapper {
  5. //根据id查询
  6. @Select("SELECT * FROM person WHERE id=#{id}")
  7. public abstract Person selectById(Integer id);
  8. }

2.2.4 使用注解配置Mapper

  1. public interface CardMapper {
  2. //查询全部
  3. @Select("SELECT * FROM card")
  4. @Results({
  5. @Result(column = "id",property = "id"),
  6. @Result(column = "number",property = "number"),
  7. @Result(
  8. property = "p", // 被包含对象的变量名
  9. javaType = Person.class, // 被包含对象的实际数据类型
  10. column = "pid", // 根据查询出的card表中的pid字段来查询person表
  11. /*
  12. one、@One 一对一固定写法
  13. select属性:指定调用哪个接口中的哪个方法
  14. */
  15. one = @One(select = "com.itheima.one_to_one.PersonMapper.selectById")
  16. )
  17. })
  18. public abstract List<Card> selectAll();
  19. }

2.2.5 测试类

  1. public class Test01 {
  2. @Test
  3. public void selectAll() throws Exception{
  4. //1.加载核心配置文件
  5. InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
  6. //2.获取SqlSession工厂对象
  7. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  8. //3.通过工厂对象获取SqlSession对象
  9. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  10. //4.获取CardMapper接口的实现类对象
  11. CardMapper mapper = sqlSession.getMapper(CardMapper.class);
  12. //5.调用实现类对象中的方法,接收结果
  13. List<Card> list = mapper.selectAll();
  14. //6.处理结果
  15. for (Card card : list) {
  16. System.out.println(card);
  17. }
  18. //7.释放资源
  19. sqlSession.close();
  20. is.close();
  21. }
  22. }

2.2.6 一对一配置总结

  1. @Results:封装映射关系的父注解。
  2. Result[] value():定义了 Result 数组
  3. @Result:封装映射关系的子注解。
  4. column 属性:查询出的表中字段名称
  5. property 属性:实体对象中的属性名称
  6. javaType 属性:被包含对象的数据类型
  7. one 属性:一对一查询固定属性
  8. @One:一对一查询的注解。
  9. select 属性:指定调用某个接口中的方法

2.3 一对多查询

2.3.1 一对多查询的模型

一对多查询的需求:查询一个课程,与此同时查询出该该课程对应的学生信息
1590942772892.png

2.3.2 一对多查询的语句

对应的sql语句:

  1. SELECT * FROM classes
  2. SELECT * FROM student WHERE cid=#{cid}

2.3.3 创建StudentMapper接口

  1. public interface StudentMapper {
  2. //根据cid查询student表
  3. @Select("SELECT * FROM student WHERE cid=#{cid}")
  4. public abstract List<Student> selectByCid(Integer cid);
  5. }

2.3.4 使用注解配置Mapper

  1. public interface ClassesMapper {
  2. //查询全部
  3. @Select("SELECT * FROM classes")
  4. @Results({
  5. @Result(column = "id",property = "id"),
  6. @Result(column = "name",property = "name"),
  7. @Result(
  8. property = "students", // 被包含对象的变量名
  9. javaType = List.class, // 被包含对象的实际数据类型
  10. column = "id", // 根据查询出的classes表的id字段来查询student表
  11. /*
  12. many、@Many 一对多查询的固定写法
  13. select属性:指定调用哪个接口中的哪个查询方法
  14. */
  15. many = @Many(select = "com.itheima.one_to_many.StudentMapper.selectByCid")
  16. )
  17. })
  18. public abstract List<Classes> selectAll();
  19. }

2.3.5 测试类

  1. public class Test01 {
  2. @Test
  3. public void selectAll() throws Exception{
  4. //1.加载核心配置文件
  5. InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
  6. //2.获取SqlSession工厂对象
  7. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  8. //3.通过工厂对象获取SqlSession对象
  9. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  10. //4.获取ClassesMapper接口的实现类对象
  11. ClassesMapper mapper = sqlSession.getMapper(ClassesMapper.class);
  12. //5.调用实现类对象中的方法,接收结果
  13. List<Classes> list = mapper.selectAll();
  14. //6.处理结果
  15. for (Classes cls : list) {
  16. System.out.println(cls.getId() + "," + cls.getName());
  17. List<Student> students = cls.getStudents();
  18. for (Student student : students) {
  19. System.out.println("\t" + student);
  20. }
  21. }
  22. //7.释放资源
  23. sqlSession.close();
  24. is.close();
  25. }
  26. }

2.3.6 一对多配置总结

  1. @Results:封装映射关系的父注解。
  2. Result[] value():定义了 Result 数组
  3. @Result:封装映射关系的子注解。
  4. column 属性:查询出的表中字段名称
  5. property 属性:实体对象中的属性名称
  6. javaType 属性:被包含对象的数据类型
  7. many 属性:一对多查询固定属性
  8. @Many:一对多查询的注解。
  9. select 属性:指定调用某个接口中的方法

2.4 多对多查询

2.4.1 多对多查询的模型

多对多查询的需求:查询学生以及所对应的课程信息
1590943489827.png

2.4.2 多对多查询的语句

对应的sql语句:

  1. SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERE sc.sid=s.id
  2. SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid=c.id AND sc.sid=#{id}

2.4.3 添加CourseMapper 接口方法

  1. public interface CourseMapper {
  2. //根据学生id查询所选课程
  3. @Select("SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid=c.id AND sc.sid=#{id}")
  4. public abstract List<Course> selectBySid(Integer id);
  5. }

2.4.4 使用注解配置Mapper

  1. public interface StudentMapper {
  2. //查询全部
  3. @Select("SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERE sc.sid=s.id")
  4. @Results({
  5. @Result(column = "id",property = "id"),
  6. @Result(column = "name",property = "name"),
  7. @Result(column = "age",property = "age"),
  8. @Result(
  9. property = "courses", // 被包含对象的变量名
  10. javaType = List.class, // 被包含对象的实际数据类型
  11. column = "id", // 根据查询出student表的id来作为关联条件,去查询中间表和课程表
  12. /*
  13. many、@Many 一对多查询的固定写法
  14. select属性:指定调用哪个接口中的哪个查询方法
  15. */
  16. many = @Many(select = "com.itheima.many_to_many.CourseMapper.selectBySid")
  17. )
  18. })
  19. public abstract List<Student> selectAll();
  20. }

2.4.5 测试类

  1. public class Test01 {
  2. @Test
  3. public void selectAll() throws Exception{
  4. //1.加载核心配置文件
  5. InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
  6. //2.获取SqlSession工厂对象
  7. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  8. //3.通过工厂对象获取SqlSession对象
  9. SqlSession sqlSession = sqlSessionFactory.openSession(true);
  10. //4.获取StudentMapper接口的实现类对象
  11. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
  12. //5.调用实现类对象中的方法,接收结果
  13. List<Student> list = mapper.selectAll();
  14. //6.处理结果
  15. for (Student student : list) {
  16. System.out.println(student.getId() + "," + student.getName() + "," + student.getAge());
  17. List<Course> courses = student.getCourses();
  18. for (Course cours : courses) {
  19. System.out.println("\t" + cours);
  20. }
  21. }
  22. //7.释放资源
  23. sqlSession.close();
  24. is.close();
  25. }
  26. }

2.4.6 多对多配置总结

  1. @Results:封装映射关系的父注解。
  2. Result[] value():定义了 Result 数组
  3. @Result:封装映射关系的子注解。
  4. column 属性:查询出的表中字段名称
  5. property 属性:实体对象中的属性名称
  6. javaType 属性:被包含对象的数据类型
  7. many 属性:一对多查询固定属性
  8. @Many:一对多查询的注解。
  9. select 属性:指定调用某个接口中的方法

3. MyBatis构建SQL语句

3.1 SQL 构建对象介绍

  • 我们之前通过注解开发时,相关 SQL 语句都是自己直接拼写的。一些关键字写起来比较麻烦、而且容易出错。
  • MyBatis 给我们提供了 org.apache.ibatis.jdbc.SQL 功能类,专门用于构建 SQL 语句

1590943921472.png

3.2 查询功能的实现

  • 定义功能类并提供获取查询的 SQL 语句的方法。 
  • @SelectProvider:生成查询用的 SQL 语句注解。type 属性:生成 SQL 语句功能类对象 method 属性:指定调用方法

    3.3 新增功能的实现

  • 定义功能类并提供获取新增的 SQL 语句的方法。

  • @InsertProvider:生成新增用的 SQL 语句注解。 type 属性:生成 SQL 语句功能类对象 method 属性:指定调用方法

    3.4 修改功能的实现

  • 定义功能类并提供获取修改的 SQL 语句的方法。

  • @UpdateProvider:生成修改用的 SQL 语句注解。 type 属性:生成 SQL 语句功能类对象method 属性:指定调用方法

    3.5 删除功能的实现

  • 定义功能类并提供获取删除的 SQL 语句的方法。

  • @DeleteProvider:生成删除用的 SQL 语句注解。type 属性:生成 SQL 语句功能类对象 method 属性:指定调用方法

    4. MyBatis学生管理系统

    4.1 系统介绍

    我们之前在做学生管理系统时,使用的是原始JDBC操作数据库的,操作非常麻烦,现在我们使用MyBatis操作数据库,简化Dao的开发。

    4.2 环境搭建(略)

    4.3 代码改造

  • 步骤一:新增MyBatis配置文件 MyBatisConfig.xml ```sql <?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">

  1. <!--引入数据库连接的配置文件-->
  2. <properties resource="config.properties"/>
  3. <!--配置LOG4J-->
  4. <settings>
  5. <setting name="logImpl" value="log4j"/>
  6. </settings>
  7. <!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
  8. <environments default="mysql">
  9. <!--environment配置数据库环境 id属性唯一标识-->
  10. <environment id="mysql">
  11. <!-- transactionManager事务管理。 type属性,采用JDBC默认的事务-->
  12. <transactionManager type="JDBC"></transactionManager>
  13. <!-- dataSource数据源信息 type属性 连接池-->
  14. <dataSource type="POOLED">
  15. <!-- property获取数据库连接的配置信息 -->
  16. <property name="driver" value="${driver}" />
  17. <property name="url" value="${url}" />
  18. <property name="username" value="${username}" />
  19. <property name="password" value="${password}" />
  20. </dataSource>
  21. </environment>
  22. </environments>
  23. <!--配置映射关系-->
  24. <mappers>
  25. <package name="com.itheima"/>
  26. </mappers>

  1. - 步骤二: 删除StudentDaoImpl,修改StudentDao
  2. ```java
  3. package com.itheima.dao;
  4. import com.itheima.domain.Student;
  5. import org.apache.ibatis.annotations.Delete;
  6. import org.apache.ibatis.annotations.Insert;
  7. import org.apache.ibatis.annotations.Select;
  8. import org.apache.ibatis.annotations.Update;
  9. import java.util.ArrayList;
  10. /*
  11. Dao层接口
  12. */
  13. public interface StudentDao {
  14. //查询所有学生信息
  15. @Select("SELECT * FROM student")
  16. public abstract ArrayList<Student> findAll();
  17. //条件查询,根据id获取学生信息
  18. @Select("SELECT * FROM student WHERE sid=#{sid}")
  19. public abstract Student findById(Integer sid);
  20. //新增学生信息
  21. @Insert("INSERT INTO student VALUES (#{sid},#{name},#{age},#{birthday})")
  22. public abstract int insert(Student stu);
  23. //修改学生信息
  24. @Update("UPDATE student SET name=#{name},age=#{age},birthday=#{birthday} WHERE sid=#{sid}")
  25. public abstract int update(Student stu);
  26. //删除学生信息
  27. @Delete("DELETE FROM student WHERE sid=#{sid}")
  28. public abstract int delete(Integer sid);
  29. }
  • 步骤三:修改StudentServiceImpl

    1. package com.itheima.service.impl;
    2. import com.itheima.dao.StudentDao;
    3. import com.itheima.domain.Student;
    4. import com.itheima.service.StudentService;
    5. import org.apache.ibatis.io.Resources;
    6. import org.apache.ibatis.session.SqlSession;
    7. import org.apache.ibatis.session.SqlSessionFactory;
    8. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    9. import java.io.IOException;
    10. import java.io.InputStream;
    11. import java.util.ArrayList;
    12. import java.util.List;
    13. /**
    14. * 学生的业务层实现类
    15. * @author 黑马程序员
    16. * @Company http://www.itheima.com
    17. */
    18. public class StudentServiceImpl implements StudentService {
    19. @Override
    20. public List<Student> findAll() {
    21. ArrayList<Student> list = null;
    22. SqlSession sqlSession = null;
    23. InputStream is = null;
    24. try{
    25. //1.加载核心配置文件
    26. is = Resources.getResourceAsStream("MyBatisConfig.xml");
    27. //2.获取SqlSession工厂对象
    28. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    29. //3.通过工厂对象获取SqlSession对象
    30. sqlSession = sqlSessionFactory.openSession(true);
    31. //4.获取StudentDao接口的实现类对象
    32. StudentDao mapper = sqlSession.getMapper(StudentDao.class);
    33. //5.调用实现类对象的方法,接收结果
    34. list = mapper.findAll();
    35. } catch (Exception e) {
    36. e.printStackTrace();
    37. } finally {
    38. //6.释放资源
    39. if(sqlSession != null) {
    40. sqlSession.close();
    41. }
    42. if(is != null) {
    43. try {
    44. is.close();
    45. } catch (IOException e) {
    46. e.printStackTrace();
    47. }
    48. }
    49. }
    50. //7.返回结果
    51. return list;
    52. }
    53. @Override
    54. public Student findById(Integer sid) {
    55. Student stu = null;
    56. SqlSession sqlSession = null;
    57. InputStream is = null;
    58. try{
    59. //1.加载核心配置文件
    60. is = Resources.getResourceAsStream("MyBatisConfig.xml");
    61. //2.获取SqlSession工厂对象
    62. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    63. //3.通过工厂对象获取SqlSession对象
    64. sqlSession = sqlSessionFactory.openSession(true);
    65. //4.获取StudentDao接口的实现类对象
    66. StudentDao mapper = sqlSession.getMapper(StudentDao.class);
    67. //5.调用实现类对象的方法,接收结果
    68. stu = mapper.findById(sid);
    69. } catch (Exception e) {
    70. e.printStackTrace();
    71. } finally {
    72. //6.释放资源
    73. if(sqlSession != null) {
    74. sqlSession.close();
    75. }
    76. if(is != null) {
    77. try {
    78. is.close();
    79. } catch (IOException e) {
    80. e.printStackTrace();
    81. }
    82. }
    83. }
    84. //7.返回结果
    85. return stu;
    86. }
    87. @Override
    88. public void save(Student student) {
    89. SqlSession sqlSession = null;
    90. InputStream is = null;
    91. try{
    92. //1.加载核心配置文件
    93. is = Resources.getResourceAsStream("MyBatisConfig.xml");
    94. //2.获取SqlSession工厂对象
    95. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    96. //3.通过工厂对象获取SqlSession对象
    97. sqlSession = sqlSessionFactory.openSession(true);
    98. //4.获取StudentDao接口的实现类对象
    99. StudentDao mapper = sqlSession.getMapper(StudentDao.class);
    100. //5.调用实现类对象的方法,接收结果
    101. mapper.insert(student);
    102. } catch (Exception e) {
    103. e.printStackTrace();
    104. } finally {
    105. //6.释放资源
    106. if(sqlSession != null) {
    107. sqlSession.close();
    108. }
    109. if(is != null) {
    110. try {
    111. is.close();
    112. } catch (IOException e) {
    113. e.printStackTrace();
    114. }
    115. }
    116. }
    117. }
    118. @Override
    119. public void update(Student student) {
    120. SqlSession sqlSession = null;
    121. InputStream is = null;
    122. try{
    123. //1.加载核心配置文件
    124. is = Resources.getResourceAsStream("MyBatisConfig.xml");
    125. //2.获取SqlSession工厂对象
    126. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    127. //3.通过工厂对象获取SqlSession对象
    128. sqlSession = sqlSessionFactory.openSession(true);
    129. //4.获取StudentDao接口的实现类对象
    130. StudentDao mapper = sqlSession.getMapper(StudentDao.class);
    131. //5.调用实现类对象的方法,接收结果
    132. mapper.update(student);
    133. } catch (Exception e) {
    134. e.printStackTrace();
    135. } finally {
    136. //6.释放资源
    137. if(sqlSession != null) {
    138. sqlSession.close();
    139. }
    140. if(is != null) {
    141. try {
    142. is.close();
    143. } catch (IOException e) {
    144. e.printStackTrace();
    145. }
    146. }
    147. }
    148. }
    149. @Override
    150. public void delete(Integer sid) {
    151. SqlSession sqlSession = null;
    152. InputStream is = null;
    153. try{
    154. //1.加载核心配置文件
    155. is = Resources.getResourceAsStream("MyBatisConfig.xml");
    156. //2.获取SqlSession工厂对象
    157. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    158. //3.通过工厂对象获取SqlSession对象
    159. sqlSession = sqlSessionFactory.openSession(true);
    160. //4.获取StudentDao接口的实现类对象
    161. StudentDao mapper = sqlSession.getMapper(StudentDao.class);
    162. //5.调用实现类对象的方法,接收结果
    163. mapper.delete(sid);
    164. } catch (Exception e) {
    165. e.printStackTrace();
    166. } finally {
    167. //6.释放资源
    168. if(sqlSession != null) {
    169. sqlSession.close();
    170. }
    171. if(is != null) {
    172. try {
    173. is.close();
    174. } catch (IOException e) {
    175. e.printStackTrace();
    176. }
    177. }
    178. }
    179. }
    180. }