框架Mybatis入门(基于原生接口的XML版本),对数据库进行简单的增删改查操作

Posted 念奕玥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了框架Mybatis入门(基于原生接口的XML版本),对数据库进行简单的增删改查操作相关的知识,希望对你有一定的参考价值。

Mybatis是?

MyBatis本是Apache的一个开源项目iBatis。是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

MyBatis 支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架

在不使用框架的情况下,如果要开发一个Web应用程序,就必须要使用传统的JDBC代码来操作数据库,除了需要自己提供 SQL 外,还必须操作 Connection、Statment、ResultSet等,而且为了访问不同的表,不同字段的数据,需要些很多雷同模板化的代码。
优点:
使用MyBatis 框架之后,只需要提供 SQL 语句就可以,其余的诸如:建立连接、操作Statment、ResultSet,处理 JDBC 相关异常等等都可以交给 MyBatis 去处理,关注点可以集中在 SQL 语句增删改查这些操作层面上,并且 MyBatis 支持使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,即普通的 Java对象)映射成数据库中的记录。

MyBatis 的使用:

MyBatis 的使用分为三个版本:

  1. 基于原生接口的XML版本。
  2. 基于Mapper接口的XML版本。
  3. 基于Java 注解版本。

一般推荐基于 Mapper 接口和基于 Java 注解的方式,这两种方式在实际开发中更加常用。

创建Maven工程具体步骤详见

入门实例

利用mybatis对数据库进行操作(基于原生接口的XML版本
具体步骤:

1、利用Navicat Premium新建一个数据表,并插入一些数据


2、新建maven项目。

3、准备属性文件。

resource文件可以自己新建,内部的properties文件也可自己新建。
内容可以直接粘贴复制。
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>org.example</groupId>
  <artifactId>ExerMybatis</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>ExerMybatis 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.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <!-- Mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>
    <!-- mysql驱动 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.16</version>
    </dependency>
    <!-- 日志处理 -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <!-- 单元测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>ExerMybatis</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

db.properties文件内容:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/exercise?serverTimezone=GMT%2B8
jdbc.user=root
jdbc.password=1996mysqlyue

用的mysql是8.0版本的,所以driver中加了cj,若是低于8.0版本,则可以直接写成com.mysql.jdbc.Driver
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"/>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--连接数据库的四个基本信息-->
            <dataSource type="POOLED">
                <property name="driver" value="$jdbc.driver"/>
                <property name="url" value="$jdbc.url"/>
                <property name="username" value="$jdbc.user"/>
                <property name="password" value="$jdbc.password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    	<!--指定映射配置文件的位置,映射配置文件指的是每个业务独立的配置文件,这里指的就是对学生信息进行的一系列业务操作-->
        <mapper resource="mapper/stuMapper.xml"/>
    </mappers>
</configuration>

其中,dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源。后面的mappers中的内容可以写完相应的代码后再在加到配置文件里
log4j.properties文件(用于输出日志)内容:

log4j.rootLogger=DEBUG,Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache=INFO

4、学生的JavaBean类

与数据库中数据表内容相对应。

public class Student 
    private int id;
    private String stuName;
    private Integer age;
    //此处省略了对应的get、set、toString方法。

4、SQL映射文件

在resources文件里新建文件夹mapper,此目录下新建对应的StuMapper.xml文件。用来写对学生信息进行操作的sql语句。

<?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属性:命名空间,用来设定当前Mapper配置文件的唯一标识,将来在Java程序中通过namespace属性的值来定位到这个配置文件 -->
<!-- namespace属性值:名字可随便取,但推荐以相对应的Mapper接口的全类名,例如com.gy.mapper
.StudentMapper -->
<mapper  namespace="com.gy.mapper.StuMapper">
<!--    查询所有学生的信息-->
    <select id="selectAllStu" resultType="com.gy.entity.Student">
        select * from stuinfo;
    </select>
<!--    通过id来查询一个学生-->
    <select id="selectStuById" parameterType="int"
            resultType="com.gy.entity.Student">
        select * from stuinfo where id=#id;
    </select>
    <!-- 模糊查询,根据stuName字段查询用户-->
    <select id="selectStuByName" parameterType="string"
            resultType="com.gy.entity.Student">
        select * from stuinfo where stuName like '%$value%';
    </select>
    <!-- 添加学生-->
    <insert id="insertStu" parameterType="com.gy.entity.Student">
        insert into stuinfo(stuName,age) values (#stuName,#age);
    </insert>
    <!-- 根据Id更新学生信息 -->
    <update id="updateStu" parameterType="com.gy.entity.Student">
        update stuinfo set stuName = #stuName,age=#age where id = #id;
    </update>
    <!-- 根据Id删除学生 -->
    <delete id="deleteStu" parameterType="int">
        delete from stuinfo where id = #id
    </delete>
</mapper>

5、测试是否可以对数据表进行相应的操作。

新建test文件,及对应的test类。

public class StudentTest 
    SqlSession sqlSession = null;
    @Before
    public void getSqlSession() 
        //加载 mybatis 全局配置文件
        InputStream is = StudentTest.class.getClassLoader().getResourceAsStream(
                "mybatis-config.xml");
        //创建 SqlSessionFactory 对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //根据 sqlSessionFactory 产生 session
        sqlSession = sqlSessionFactory.openSession();
    

    //查询所有用户数据
    @Test
    public void testSelectAllUser() 
        /**
         * statement字符串由 StuMapper.xml文件中的两个部分构成(namespace + id)
         * <mapper namespace="com.gy.mapper.StuMapper">中 namespace 的值
         * <select id="selectAllUser" > 中的 id 值
         * 这样Mybatis才能定位到对应的SQL
         */
        String statement = "com.gy.mapper.StuMapper.selectAllStu";
        //用集合来接收返回结果(因为有多条数据)
        List<Student> StuList = sqlSession.selectList(statement);
        System.out.println("查询所有学生信息");
        for (Student stu : StuList) 
            System.out.println(stu);
        
        sqlSession.close();
    

    //根据Id查询一个学生数据
    @Test
    public void testSelectUserById() 
        String statement = "com.gy.mapper.StuMapper.selectStuById";
        Student stu = sqlSession.selectOne(statement, 1);
        System.out.println("根据Id查询一个学生数据"+stu);
        sqlSession.close();
    

    //模糊查询:根据stuinfo表的stuName字段
    @Test
    public void testSelectUserByName() 
        String statement = "com.gy.mapper.StuMapper.selectStuByName";
        List<Student> listUser = sqlSession.selectList(statement, "on");
        System.out.println("模糊查询");
        for (Student stu : listUser) 
            System.out.println(stu);
        
        sqlSession.close();
    

    //添加一个学生数据
    @Test
    public void testInsertUser() 
        String statement = "com.gy.mapper.StuMapper.insertStu";
        Student stu = new Student();
        stu.setAge(10);
        stu.setStuName("huahua");
        int i = sqlSession.insert(statement, stu);
        System.out.println( (i>0)? "添加成功!":"添加失败!");
        //提交插入的数据
        sqlSession.commit();
        sqlSession.close();
    

    //根据Id修改学生数据
    @Test
    public void testUpdateUser()
        //如果设置的 id不存在,那么数据库没有数据更改
        String statement = "com.gy.mapper.StuMapper.updateStu";
        Student stu = new Student();
        stu.setStuName("baibai");
        stu.setId(2);
        stu.setAge(29);
        int i = sqlSession.update(statement, stu);
        System.out.println( (i>0)? "修改成功!":"修改失败!");
        //提交数据
        sqlSession.commit();
        sqlSession.close();
    

    //根据Id删除学生数据
    @Test
    public void testDeleteUser()
        String statement = "com.gy.mapper.StuMapper.deleteStu";
        int i = sqlSession.delete(statement, 4);
        System.out.println( (i>0)? "删除成功!":"删除失败!");
        sqlSession.commit();
        sqlSession.close();
    


6、操作结果:


修改后的数据表:

以上是关于框架Mybatis入门(基于原生接口的XML版本),对数据库进行简单的增删改查操作的主要内容,如果未能解决你的问题,请参考以下文章

mybatis框架——入门级

MyBatis入门

MyBatis入门详解——附代码

MyBatis框架入门到精通-入门必备的学习笔记

mybatis总结回顾

Mybatis入门