MyBatis系列-介绍及基本使用

MyBatis学习系列-入门

一、简介

1.什么是MyBatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis 官方文档:https://mybatis.org/mybatis-3/zh/
github地址:https://github.com/mybatis/mybatis-3

2.为什么要使用MyBatis

  • 与 JDBC 相比,减少了 50% 以上的代码量。
  • MyBatis 是最简单的持久化框架,小巧并且简单易学。
  • MyBatis 相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML 中,和程序逻辑代码分离,降低耦合度,便于同一管理和优化,提高了代码的可重用性。
  • 提供 XML 标签,支持编写动态 SQL 语句。
  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射。
  • 支持存储过程。MyBatis 以存储过程的形式封装 SQL,可以将业务逻辑保留在数据库之外,增强应用程序的可移植性、更易于部署和测试。

3.JDBC

JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序

1.使用jdbc连接mysql
Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            //1.定义数据库相关信息(驱动、连接信息)
            String driver = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/test?userSSL=false";
            String username = "root";
            String password = "root";

            //2.加载驱动
            Class.forName(driver);

            //3.获取数据库连接对象
            conn = DriverManager.getConnection(url,username,password);

            //4.定义查询
            String sql = "SELECT id,name,age FROM user WHERE name LIKE '张三%';";

            //5.创建一个PreparedStatement对象操作数据库
            pstmt = conn.prepareStatement(sql);

            //6.执行sql,得到结果集
            rs = pstmt.executeQuery();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (pstmt != null) {
                    pstmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
2.JDBC缺点
  • 频繁连接数据库,造成资源浪费;
  • 硬编码导致SQL语句与业务代码高度耦合不利于后期维护迭代;
  • 对PreparedStatement对象参数设置方便,需要设置占位符硬编码;
  • 返回结果对象ResultSet 需要通过大量硬编码赋值与业务返回对象;

4.搭建第一个Mybatis项目

1.创建一个普通的maven项目
2.添加pom.xml依赖
<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>
3. 驱动与数据库版本关系

在这里插入图片描述

4.创建 user数据表
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '张三', '18');
INSERT INTO `user` VALUES ('2', '李四', '20');
5.创建与表对应的实体类对象
package com.weber17.entity;

public class User {

    private Long id;

    private String name;

    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

6.创建User实体mapper接口类
package com.weber17.mapper;


import com.weber17.entity.User;

public interface UserMapper {

    /**
     * 根据id查询用户
     * @param id
     * @return
     */
    User selectUser(Integer id);

    /**
     * 新增用户
     * @param user
     * @return
     */
    Integer insertUser(User user);

    /**
     * 更新用户
     * @param user
     * @return
     */
    Integer updateUser(User user);

    /**
     * 根据删除用户
     * @param id
     * @return
     */
    Integer deleteUser(Integer id);
}

6.在项目resources里面新建com/weber17/mapper目录创建User实体的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="com.weber17.mapper.UserMapper">

    <!--根据id查询Emp实体-->
    <select id="selectUser" resultType="com.weber17.entity.User">
        select * from Emp where id = #{id}
    </select>

    <insert id="insertUser">
        INSERT INTO
        `mybatis`.`emp` ( `username`)
        VALUES (#{username});
    </insert>

    <update id="updateUser">
        UPDATE EMP
        SET username=#{username}
        WHERE id=#{id}
    </update>

    <delete id="deleteUser">
        DELETE FROM emp
        WHERE id=#{id}
    </delete>

</mapper>
7.编写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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper class="com.weber17.mapper.UserMapper"></mapper>
    </mappers>
</configuration>
8.编写测试类
package com.weber17.test;


import com.weber17.entity.User;
import com.weber17.mapper.UserMapper;
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.IOException;
import java.io.InputStream;

public class MybatisTest {

    public static void main(String [] args){

        //加载mybatis-config.xml获取sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        //基于mapper.xml中的StatementId的方式去执行SQL
        SqlSession session = sqlSessionFactory.openSession();
        User userXml = session.selectOne("com.weber17.mapper.UserMapper.selectUser", 1);
        System.out.println("基于xml文件的方式执行SQL:");
        System.out.println(userXml);

        //基于接口绑定的方式
        /**
         * 步骤:
         * 1. 新建数据访问层的接口:POJOMapper(例如本文中的UserMapper)
         * 2. 添加mapper中对应的操作方法
         * 2.1 方法名要和mapper中对应的操作的节点的id要一致
         * 2.2 返回类型要和mapper中对应的操作的节点的resultType要一致
         * 2.3 mapper中对应的操作的节点的参数必须要在方法的参数中声明
         * 3. Mapper.xml 中的namespace要和接口的完整限定类名要一样
         * 4.修改mybatis全局配置文件中的mappers,采用接口绑定的方式:   <mapper class="com.weber17.mapper.UserMapper"></mapper>
         * 5. xml需要和接口放在同一级目录,就是在resources新建和接口一样的文件目录
         */
        UserMapper userMapperInterface = session.getMapper(UserMapper.class);
        User userInterface = userMapperInterface.selectUser(1);
        System.out.println("基于接口的方式执行SQL:");
        System.out.println(userInterface);

        //基于注解的方式
        UserMapper userMapperAnnotation = session.getMapper(UserMapper.class);
        User userAnnotation = userMapperAnnotation.selectUser(2);
        System.out.println("基于注解的方式执行SQL:");
        System.out.println(userAnnotation);

    }

    private static SqlSessionFactory getSqlSessionFactory() {
        // 从 XML 中构建 SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
}

9.运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值