MyBatis快速入门

268 阅读5分钟

软件开发常用架构

三层架构包含的三层

  • 界面层(Spring MVC框架):表示层、视图层,主要功能是接受用户的数据,显示请求的处理结果。
  • 业务逻辑层(Spring框架):接收表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。
  • 数据访问层(MyBatis框架):与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。

三层的处理请求的交互

  • 用户---> 界面层--->业务逻辑层--->数据访问层--->DB数据库

MyBatis框架快速入门

准备工作及要求

我的本机mysql环境:springdb数据库内创建一个student表,里面有两组数据,要求用mybatis框架完成sql查询,打印出这两组数据。

新建一个maven项目

可以参过以前我写的一个博客:maven配置使用,到3.2即可,后续一些步骤是配tomcat,暂时用不到。

在src目录下,把默认的main文件夹删除,添加java和resources两个文件夹,并分别将其标记为Sources Boot

和Resources Boot文件,在java文件夹中创建我们的包,如我的是cn.gs。

具体配置

实现步骤:
1.新建的student表
2.加入maven的mybatis坐标,mysql驱动的坐标
3.创建实体类,Student--保存表中的一行数据
4.创建持久层的dao接口,定义操作数据库的方法
5.创建一个mybatis的配置文件
  叫做sql映射文件:写sql语句的,一般一个表一个sql文件
  这个文件是xml文件,文件名与接口文件名一样
6.创建mybatis的主配置文件
  一个项目就是一个配置文件
  主配置文件提供了数据库的连接信息和sql映射文件的位置信息
7.创建使用mybatis类
  通过mybatis来访问数据库
  1. mysql中插入学生表,已完成

  2. maven的pom.xml配置文件中,依赖项中加入mybatis和mysql驱动包,并在编译build里面加入扫描到.xml的配置。pom.xml详细信息如下:

<?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>cn.gs</groupId>
  <artifactId>mybatis-blog-test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>mybatis-blog-test Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.26</version>
      <scope>compile</scope>
    </dependency>
    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>
  </dependencies>

  <build>
    <!--配置能编译.xml文件-->
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>
</project>
  1. 在cn.gs下创建一个domain包,包下面创建一个Student类
public class Student {
    private Integer id;
    private String name;
    private String email;
    private Integer age;
    //再生成它的 toString 和 getter/setter方法
}
  1. 在cn.gs下创建一个dao包,包下面创建一个StudentDao接口
public interface StudentDao {
    //查询student表所有数据
    public List<Student> selectStudents();
}
  1. 创建mybatis的配置文件,叫做sql映射文件,文件名与接口文件名一样

    即在dao包下创建StudentDao.xml文件

<?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">
<mapper namespace="cn.gs.dao.StudentDao">
    <select id="selectStudents" resultType="cn.gs.domain.Student">
        select id,name,email,age from Student order by id
    </select>
</mapper>
<!--namespace: 唯一值,要求你使用dao接口的全限定名称-->
<!--select 表示执行查询,也可用其他,如update、delete、insert等-->
<!--id: 执行sql的唯一标识,要求你使用接口中定义的方法名称-->
<!--resultType:表示返会结果的类型,如我们查询得到的就是Student类,写全限定名称-->
  1. 在resources目录下创建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>
    <!--环境配置 : 数据库连接信息-->
    <environments default="mydev">
        <!-- id: 一个唯一值,自定义,表示环境名称-->
        <environment id="mydev">
            <!-- transactionManager: mybatis的事物类型
                type: JDBC(表示使用jdbc中的Connection对象的commit,rollback做事物处理)-->
            <transactionManager type="JDBC"/>
            <!-- dataSource: 表示数据源,连接数据库-->
            <dataSource type="POOLED">
                <!--数据库的驱动类名-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接数据库的url字符串-->
                <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
                <!--mysql中我的用户名:root-->
                <property name="username" value="root"/>
                <!--root对应的登录密码:root-->
                <property name="password" value="root"/>
            </dataSource>
        </environment>

        <environment id="online">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!--sql映射文件-->
    <mappers>
        <mapper resource="cn/gs/dao/StudentDao.xml"/>
    </mappers>
</configuration>
  1. 在cn.gs下面创建一个APP类,完成测试
public class App 
{
    public static void main( String[] args ) throws IOException {
        //访问mybatis读取Student数据
        //1.定义mybatis主配置文件的名称,从类路径的跟开始(target/classes)
        String config = "mybatis.xml";
        //2.读取这个config文件
        InputStream is = Resources.getResourceAsStream(config);
        //3.创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //4.创建SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(is);
        //5.【重要】获取SqlSession对象,从SqlSessionFactory中获取
        SqlSession sqlSession = factory.openSession();
        //6.指定要执行的sql语句的表示,sql映射文件中的namesapce+ "." +标签的id值
        String sqlId = "cn.gs.dao.StudentDao" + "." + "selectStudents";
        //7.执行sql语句
        List<Student> list = sqlSession.selectList(sqlId);
        list.forEach(stu -> System.out.println(stu));
        //8.关闭SqlSession对象
        sqlSession.close();
    }
}