【框架】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、操作结果:

在这里插入图片描述
修改后的数据表:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值