从JDBC到Mybatis

  • 一、简介
  • 1. JDBC
  • 2. MyBatis
  • 3. JDBC开发问题
  • 4. MyBatis改进
  • 二、项目搭建
  • 三、项目配置
  • 四、运行
  • 五、小结
  • 六、 参考


一、简介

1. JDBC

JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。
JDBC API库常用用法

  • 制作到数据库的连接
  • 创建SQL或MySQL语句
  • 执行SQL或MySQL查询数据库
  • 查看和修改所产生的记录

架构
JDBC 的 API 支持两层和三层处理模式进行数据库访问,但一般的 JDBC 架构由两层处理模式组成:

  • JDBC API: 提供了应用程序对 JDBC 管理器的连接。
  • JDBC Driver API: 提供了 JDBC 管理器对驱动程序连接。

2. MyBatis

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

3. JDBC开发问题

JDBC查询数据库数据步骤

  • 加载JDBC驱动
  • 建立并获取数据库连接
  • 创建 JDBC Statements 对象
  • 设置SQL语句的传入参数
  • 执行SQL语句并获得查询结果
  • 对查询结果进行转换处理并将处理结果返回
  • 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)

问题

  • 频繁创建数据库连接对象,释放,造成系统资源浪费,影响系统性能,利用率低
  • 可读性差,sql语句定义、参数设置、结果集处理存在硬编码。发生变化,需要修改java代码,系统需要重新编译,重新发布。不好维护。
  • 对 ResultSet 查询的结果,需要自己封装为 List,重复代码较多
  • 业务代码和数据库的操作混用

优化

  • 使用数据库连接池对连接进行管理
  • SQL语句统一存放到配置文件
  • SQL语句变量和传入参数的映射以及动态SQL
  • 动态SQL语句的处理
  • 对数据库操作结果的映射和结果缓存
  • SQL语句的重复

4. MyBatis改进

  • 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能
  • Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
  • 不用编写关闭资源代码。

二、项目搭建

  1. 创建项目


    勾选Web项,Spring Web

    SQL中勾选JDBC API Mybaits Fragment 和Mysql Driver
  2. 项目创建完成

三、项目配置

使用该种方式创建项目,则在pom.xml文件中自动添加依赖

JAVA mybatis写入数据库 mybatis java api_sql

  1. 修改application.properties文件,application.properties是项目自带的配置文件,也可以建立其他的配置文件,可以在文中田间端口、数据源、mydatis等相关数据
server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/runboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false 
spring.datasource.username=root //账户
spring.datasource.password=******  //密码
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
  1. 建立项目文件
  • UserController.Java
package com.wxcmybaits.mybaits_example.controller;

import com.wxcmybaits.mybaits_example.entity.User;
import com.wxcmybaits.mybaits_example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/getAllUser")
    public List<User> findAll(){
        return userService.findAllUser();
    }

    @RequestMapping("/getUserByUserID/{userid}")
    public List<User> findUserByUserId(@PathVariable int userid){
        return userService.findUserByUserId(userid);
    }
}
  • User.Java
package com.wxcmybaits.mybaits_example.entity;
public class User {
    private int userid;
    private String username;
    private String password;

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
  • UserMapper.Java
package com.wxcmybaits.mybaits_example.mapper;

import com.wxcmybaits.mybaits_example.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {
    public List<User> findAllUser();
    public List<User> findUserByUserId(int userid);
}
  • UserService.Java
package com.wxcmybaits.mybaits_example.service;

import com.wxcmybaits.mybaits_example.entity.User;
import com.wxcmybaits.mybaits_example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired(required=false)
    public UserMapper userMapper;

    public List<User> findAllUser(){
        return userMapper.findAllUser();
    }

    public List<User> findUserByUserId(int userid){
        return userMapper.findUserByUserId(userid);
    }
}
  1. 建立mapper文件,在里面建立UserMapper.xml文件,这个xml文件就是映射文件,sql语句就是在这里面写的,注意具体包名位置(namespace)与刚刚建立的usemapper类要对应
    UserMapper.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.wxcmybaits.mybaits_example.mapper.UserMapper">
    <resultMap id="result" type="com.first.mybatis_example.entity.User">
        <result column="userid" jdbcType="INTEGER" property="userid" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="VARCHAR" property="password" />
    </resultMap>

    <select id="findAllUser" resultType="com.first.mybatis_example.entity.User">
        select  * from user;
    </select>

    <select id="findUserByUserId" resultType="com.first.mybatis_example.entity.User">
        select * from user where userid=#{userid};
    </select>
</mapper>
  1. Mysql创建表格
CREATE TABLE `user` (
  `userid` int(11) NOT NULL AUTO_INCREMENT COMMENT 'useriduser',
  `username` char(20) NOT NULL DEFAULT '' COMMENT 'username',
  `password` char(10) NOT NULL DEFAULT '' COMMENT 'password',
  PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1', '4545646', '546546'), ('2', '553453', 'h5354354'), ('3', '4355354', '543643453');

JAVA mybatis写入数据库 mybatis java api_mysql_02

四、运行

  • 在浏览器中输入http://localhost:8080/user/getAllUser就可以看到查询结果,查询的语句是在映射文件里的,而路径由来是UserController.Java里确定的,。
  • JAVA mybatis写入数据库 mybatis java api_User_03


  • http://localhost:8080/user/getUserByUserID/1
  • JAVA mybatis写入数据库 mybatis java api_数据库_04


  • 问题:

    修正
  • 问题
    Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could no修正
<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.26</version>
      <scope>runtime</scope>
    </dependency>

导入jar包同数据库版本相同

  • 问题

    修正

五、小结

  1. mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
  2. 加载映射文件。该文件中配置了操作数据库的 SQL 语句,需要在MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
  3. 用jdbc是需要导入一个包,而sql语句则是直接在代码里构造,用mybatis则是需要加入依赖,且需要配置,数据库的变更比较频繁时或查询的需求变化时,mybatis的使用更有利于代码的维护。