MyBatis—案例

Posted 之墨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis—案例相关的知识,希望对你有一定的参考价值。

快速开始一个MyBatis

实现步骤:

  1. 创建student表(id, name, email, age)
  2. 新建maven项目
  3. 修改pom.xml
    1)加入依赖mybatis依赖, mysq|驱动, junit
    2)在加入资源插件
  4. 创建实体类Student。定义属性,属性名和列名保持一 致
  5. 创建Dao接口,定义操作数据库的方法。
  6. 创建xml文件(mapper文件),写sq|语句。
    mybatis框架推荐是把sq|语句和java代码分开
    mapper文件:定义和dao接口在同一目录,一个表一个mapper文件。
  7. 创建mybatis的主配置文件(xm|文件)有一个,放在resources目录下
    1)定义创建连接实例的数据源(DataSource) 对象
    2)指定其他mapper文件的位置
  8. 创建测试的内容。
    使用main方法,测试mybatis访问数据库
    也可以使用junit访问数据库

编写 Dao 接口 Mapper 映射文件

StudentDao.xml
要求:

  1. 在 dao 包中创建文件 StudentDao.xml
  2. 要 StudentDao.xml 文件名称和接口 StudentDao 一样,区分大小写的一样。
<?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">
<!--
 namespace:必须有值,自定义的唯一字符串 
 推荐使用:dao 接口的全限定名称 
-->
<mapper namespace="com.bjpowernode.dao.StudentDao">
 <!--
 <select>: 查询数据, 标签中必须是 select 语句
 id: sql 语句的自定义名称,推荐使用 dao 接口中方法名称, 
 使用名称表示要执行的 sql 语句
 resultType: 查询语句的返回结果数据类型,使用全限定类名 
 -->
 <select id="selectStudents" resultType="com.bjpowernode.domain.Student">
 <!--要执行的 sql 语句-->
 select id,name,email,age from student
 </select>
</mapper>

创建 MyBatis 主配置文件

项目 src/main 下创建 resources 目录,设置 resources 目录为 resources root
创建主配置文件:名称为 mybatis.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>
 <!--配置 mybatis 环境-->
 <environments default="mysql">
 <!--id:数据源的名称-->
 <environment id="mysql">
 <!--配置事务类型:使用 JDBC 事务(使用 Connection 的提交和回滚)-->
 <transactionManager type="JDBC"/>
 <!--数据源 dataSource:创建数据库 Connection 对象
 type: POOLED 使用数据库的连接池 
 -->
北京动力节点 www.bjpowernode.com
 <dataSource type="POOLED">
 <!--连接数据库的四个要素-->
 <property name="driver" value="com.mysql.jdbc.Driver"/>
 <property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
 <property name="username" value="root"/>
 <property name="password" value="123456"/>
 </dataSource>
 </environment>
 </environments>
 <mappers>
 <!--告诉 mybatis 要执行的 sql 语句的位置-->
 <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
 </mappers>
</configuration>

创建测试类

MyBatisTest
src/test/java/com/bjpowernode/ 创建 MyBatisTest.java 文件

/*
* mybatis 入门
*/
@Test
public void testStart() throws IOException {
 //1.mybatis 主配置文件 
 String config = "mybatis-config.xml";
 //2.读取配置文件 
 InputStream in = Resources.getResourceAsStream(config);
 //3.创建 SqlSessionFactory 对象,目的是获取 SqlSession 
 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
 //4.获取 SqlSession,SqlSession 能执行 sql 语句
 SqlSession session = factory.openSession();
 //5.执行 SqlSession 的 selectList()
 List<Student> studentList = 
北京动力节点 www.bjpowernode.com
session.selectList("com.bjpowernode.dao.StudentDao.selectStudents");
 //6.循环输出查询结果 
 studentList.forEach( student -> System.out.println(student));
 //7.关闭 SqlSession,释放资源
 session.close();
}

基本CURD的操作

MyBatis内部对象分析

对象使用
SqlSession , SqlSessionFactory
(1) Resources 类

Resources 类,顾名思义就是资源,用于读取资源文件。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。

(2) SqlSessionFactoryBuilder 类

SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的build() 方 法 。
由 于SqlSessionFactoryBuilder对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。
所以,一般会将 该 SqlSessionFactoryBuilder对象创建为一个方法内的局部对象,方法结束,对象销毁。

(3) SqlSessionFactory 接口

SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用只需要一个该对象即可。创建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法。
➢openSession(true):创建一个有自动提交功能的 SqlSession
➢openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交
➢ openSession():同openSession(false)

(4) SqlSession 接口

SqlSession 接口对象用于执行持久化操作。
一个 SqlSession 对应着一次数据库会话,一次会话以SqlSession 对象的创建开始,以 SqlSession 对象的关闭结束。
SqlSession接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()方法,将其关闭。再次需要会话,再次创建。
SqlSession 在方法内部创建,使用完毕后关闭。

创建工具类

可以简化测试内容的代码重复

package power.utils;

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 java.io.InputStream;

/**
 * @author ChowRunFa@1728420512.qq.com
 * @date 2021/10/3 18:35
 */
public class MyBatisUtil {
    //定义 SqlSessionFactory
    private static SqlSessionFactory factory = null;
    static {
        //使用 静态块 创建一次 SqlSessionFactory
        try{
            String config = "mybatis-config.xml";
            //读取配置文件
            InputStream in = Resources.getResourceAsStream(config);
            //创建 SqlSessionFactory 对象
            factory = new SqlSessionFactoryBuilder().build(in);
        }catch (Exception e){
            factory = null;
            e.printStackTrace();
        }
    }
    /* 获取 SqlSession 对象 */
    public static SqlSession getSqlSession(){
        SqlSession session = null;
        if( factory != null){
            session = factory.openSession();
        }
        return session;
    }
}

使用工具类

@Test
public void testSelectById(){
    //

    SqlSession session = MyBatisUtil.getSqlSession();
    String sqlId = "power.dao.StudentDao.selectStudentById";
    Student student = session.selectOne(sqlId,1005);
    System.out.println("查询:"+student);
    session.close();

}

使用Dao对象

(1) 创建 Dao 接口实现类

public class StudentDaoImpl implements StudentDao

(2) 实现接口中 select 方法

public List<Student> selectStudents() {
 SqlSession session = MyBatisUtil.getSqlSession();
 List<Student> studentList = session.selectList(
"com.bjpowernode.dao.StudentDao.selectStudents");
 session.close();
 return studentList;
}

测试查询操作:

MyBatisTest 类中创建 StudentDaoImpl 对象
public class MyBatisTest {
 StudentDao studentDao = new StudentDaoImpl();
}
@Test
public void testSelect() throws IOException {
 final List<Student> studentList = studentDao.selectStudents();
 studentList.forEach( stu -> System.out.println(stu));
}

(3) 实现接口中 insert 方法

public int insertStudent(Student student) {
 SqlSession session = MyBatisUtil.getSqlSession();
 int nums = session.insert(
 "com.bjpowernode.dao.StudentDao.insertStudent",student);
 session.commit();
 session.close();
 return nums;
}

测试 insert

@Test
public void testInsert() throws IOException {
 Student student = new Student();
 student.setId(1006);
 student.setName("林浩");
 student.setEmail("linhao@163.com");
 student.setAge(26);
 int nums = studentDao.insertStudent(student);
 System.out.println("使用 Dao 添加数据:"+nums);
}

(4) 实现接口中 update 方法

public int updateStudent(Student student) {
 SqlSession session = MyBatisUtil.getSqlSession();
 int nums = session.insert(
 "com.bjpowernode.dao.StudentDao.updateStudent",student);
 session.commit();
 session.close();
 return nums;
}

测试 update

@Test
public void testUpdate() throws IOException {
 Student student = new Student();
 student.setId(1006);
 student.setAge(28);
 int nums = studentDao.updateStudent(student);
 System.out.println("使用 Dao 修改数据:"+nums);
}

(5) 实现接口中 delete 方法

public int deleteStudent(int id) {
 SqlSession session = MyBatisUtil.getSqlSession();
 int nums = session.insert(
 "com.bjpowernode.dao.StudentDao.deleteStudent",1006);
 session.commit();
 session.close();
 return nums;
}

测试 delete

@Test
public void testDelete() throws IOException {
 int nums = studentDao.deleteStudent(1006);
 System.out.println("使用 Dao 修改数据:"+nums);
}

以上是关于MyBatis—案例的主要内容,如果未能解决你的问题,请参考以下文章

markdown [mybatis参考]关于mybatis #mybatis的一些片段

Mybatis程序入门案例

mybatis入门案例

mybatis-plus代码生成器(新)项目案例

Spring Boot:Spring Boot整合Mybatis案例

MyBatis学习简介及入门案例