IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 从JDBC到Mybatis -> 正文阅读

[Java知识库]从JDBC到Mybatis

目录

一、由JDBC到Mybatis

1.什么是Mybatis

2.JDBC查询数据库数据步骤

3.JDBC演变为Mybatis

二、IDEA环境下Mybatis与JDBC进行改造示例对比

(一)JDBC操作数据库

1.Navicat数据表

2.IDEA创建项目

3.引入JDBC的jar包

?(二) MyBatis应用

? ? ? 1.创建项目

?2.Mysql建表(Navicat)

?3.配置文件

4.测试结果

?5.完整功能


一、由JDBC到Mybatis

1.什么是Mybatis

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

2.JDBC查询数据库数据步骤

? 加载JDBC驱动;

? 建立并获取数据库连接;

? 创建 JDBC Statements 对象;

? 设置SQL语句的传入参数;

? 执行SQL语句并获得查询结果;

? 对查询结果进行转换处理并将处理结果返回;

? 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet);

3.JDBC演变为Mybatis

(1)问题:数据库连接频繁的开启和关闭,造成了资源的浪费以及影响系统的性能

解决问题:数据库连接的获取和关闭我们可以使用数据库连接池来解决资源浪费的问题。通过连接池就可以反复利用已经建立的连接去访问数据库了。减少连接的开启和关闭的时间。

(2)但是现在连接池多种多样,可能存在变化,有可能采用DBCP的连接池,也有可能采用容器本身的JNDI数据库连接池

解决问题:我们可以通过DataSource进行隔离解耦,我们统一从DataSource里面获取数据库连接,DataSource具体由DBCP实现还是由容器的JNDI实现都可以,所以我们将DataSource的具体实现通过让用户配置来应对变化。

(3)我们使用JDBC进行操作数据库时,SQL语句基本都散落在各个JAVA类中,这样有三个不足之处:

第一,可读性很差,不利于维护以及做性能调优。

第二,改动Java代码需要重新编译、打包部署。

第三,不利于取出SQL在数据库客户端执行(取出后还得删掉中间的Java代码,编写好的SQL语句写好后还得通过+号在Java进行拼凑)。

解决问题:我们可以考虑不把SQL语句写到Java代码中,那么把SQL语句放到哪里呢?首先需要有一个统一存放的地方,我们可以将这些SQL语句统一集中放到配置文件或者数据库里面(以key-value的格式存放)。然后通过SQL语句的key值去获取对应的SQL语句。

(4)执行SQL语句、获取执行结果、对执行结果进行转换处理、释放相关资源是一整套下来的。假如是执行查询语句,那么执行SQL语句后,返回的是一个ResultSet结果集,这个时候我们就需要将ResultSet对象的数据取出来,不然等到释放资源时就取不到这些结果信息了。我们从前面的优化来看,以及将获取连接、设置传入参数、执行SQL语句、释放资源这些都封装起来了,只剩下结果处理这块还没有进行封装,如果能封装起来,每个数据库操作都不用自己写那么一大堆Java代码,直接调用一个封装的方法就可以搞定了。

解决问题:我们分析一下,一般对执行结果的有哪些处理有可能将结果不做任何处理就直接返回,也有可能将结果转换成一个JavaBean对象返回、一个Map返回、一个List返回等`,结果处理可能是多种多样的。从这里看,我们必须告诉SQL处理器两点:第一,需要返回什么类型的对象;第二,需要返回的对象的数据结构怎么跟执行的结果映射,这样才能将具体的值copy到对应的数据结构上。

(5)由于我们将所有SQL语句都放到配置文件中,这个时候会遇到一个SQL重复的问题,几个功能的SQL语句其实都差不多,有些可能是SELECT后面那段不同、有些可能是WHERE语句不同。有时候表结构改了,那么我们就需要改多个地方,不利于维护。

解决问题:当我们的代码程序出现重复代码时怎么办?将重复的代码抽离出来成为独立的一个类,然后在各个需要使用的地方进行引用。对于SQL重复的问题,我们也可以采用这种方式,通过将SQL片段模块化,将重复的SQL片段独立成一个SQL块,然后在各个SQL语句引用重复的SQL块,这样需要修改时只需要修改一处即可。

二、IDEA环境下Mybatis与JDBC进行改造示例对比

(一)JDBC操作数据库

1.Navicat数据表

打开navicat,选择数据库T1,新建查询

?新建一个user表然后输入代码并运行

?user

create table user(
	id int primary key auto_increment,
	name varchar(50),
	password varchar(50),
	email varchar(60),
	birthday date
)character set utf8 collate utf8_general_ci;

?插入数据,并运行

?

代码

insert into user(name,password,email,birthday) values('zs','123456','zs@sina.com','1999-12-04');
insert into user(name,password,email,birthday) values('lisi','123456','lisi@sina.com','2001-12-04');
insert into user(name,password,email,birthday) values('wangwu','123456','wangwu@sina.com','2003-12-04');

2.IDEA创建项目

1.打开IDEA,File->New->Project? ? ? ? ?

?2.选择java,然后next->next

?3.命名项目,然后点击finish

?4.新建包右击scr->new->java class

?

?Date

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Date{
    static final String driverName="org.gjt.mm.mysql.Driver";
    static final String dbUrl="jdbc:mysql://localhost:3306/t";
    static final String userName="root";
    static final String password="123456";
    public static void main(String[] args) {
        // TODO Auto-generated method stubt
       

        Connection conn = null;
        Statement stmt = null;
        try{
            Class.forName(driverName);

            // 打开链接
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(dbUrl,userName,password);

            // 执行查询
            System.out.println(" 实例化Statement对象...");
            stmt = (Statement) conn.createStatement();
            String sql;
            sql = "SELECT id, name, password, email FROM user";
            ResultSet rs = stmt.executeQuery(sql);

            // 展开结果集数据库
            while(rs.next()){
                // 通过字段检索
                int id  = rs.getInt("id");
                String name = rs.getString("name");
                String password = rs.getString("password");
                String email = rs.getString("email");
                // 输出数据
                System.out.print("ID: " + id);
                System.out.print(", 姓名: " + name);
                System.out.print(", 密码: " +password);
                System.out.print(", 邮箱: " +email);
                System.out.print("\n");
            }
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            // 处理 JDBC 错误
            se.printStackTrace();
        }catch(Exception e){
            // 处理 Class.forName 错误
            e.printStackTrace();
        }finally{
            // 关闭资源
            try{
                if(stmt!=null) stmt.close();
            }catch(SQLException se2){
            }// 什么都不做
            try{
                if(conn!=null) conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
}



3.引入JDBC的jar包

1.file->project structure

?2.Moudles->Dependencies->+->jars or directories

?3.导入jar包

?

?4.应用成功

?

?5.运行

?6.运行结果

?

?(二) MyBatis应用

? ? ? 1.创建项目

?(1)用IDEA新建项目,new-peoject->spring initializr->next

?(2)Java Version ,点击next

?(3)选择web->Sring Web->next,SQL->JDBC API,mybatis framework,mysql driver

?

?2.Mysql建表(Navicat)

1.创建学生students,插入信息

create table students(
	no int primary key auto_increment,
	name varchar(50),
	age int 
)character set utf8 collate utf8_general_ci;
insert into students(no,name,age) values('1','张三','20');
insert into students(no,name,age) values('2','李四','26');
insert into students(no,name,age) values('3','王五','29');
insert into students(no,name,age) values('4','张二','44');
insert into students(no,name,age) values('5','小小','64');

?3.配置文件

1.application.properties代码

server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/t?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

?2.(1)项目src->main->java->com? 下分别创建包:controller、entity、mapper、service,用来实现控制层、实体层、映射层、业务层

(2)src->main->resources? 下创建mapper包用于存放*Mapper.xml文件:

(3)创建entity实体类Students

?

?Students

package com.example.demo.entity;

public class Students {
    private int no;
    private String name;
    private int age;

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }

}

(4)创建Mapper映射操作StudentsMapper类:

?

package com.example.demo.mapper;

import com.example.demo.entity.Students;
import com.example.demo.entity.Students;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface StudentsMapper {
    public List<Students> findAllStudent();

    List<Students> findStudentByno(int no);
}

(5)创建Mapper映射对应的StudentsMapper.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.example.demo.mapper.StudentsMapper">
    <resultMap id="result" type="com.example.demo.entity.Students">
        <result column="no" jdbcType="INTEGER" property="no" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="age" jdbcType="INTEGER" property="age" />
    </resultMap>

    <select id="findAllStudent" resultType="com.example.demo.entity.Students">
        select  * from students;
    </select>

    <select id="findStudentByno" resultType="com.example.demo.entity.Students">
        select * from students where no=#{no};
    </select>
</mapper>

(6)创建service业务StudentsService类:

package com.example.demo.service;
import com.example.demo.entity.Students;
import com.example.demo.mapper.StudentsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
public class StudentsService {
    @Autowired(required = false)
    public StudentsMapper studentsMapper;
    public List<Students> findAllStudent() {
        return studentsMapper.findAllStudent();
    }

    public List<Students> findStudentByno(int no) {
        return studentsMapper.findStudentByno(no);
    }


}

?

(7)创建 controller控制层UsersController类:

?

package com.example.demo.controller;

import com.example.demo.entity.Students;
import com.example.demo.service.StudentsService;
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("/Student")
class UserController {
    @Autowired
    private StudentsService studentsService;

    @RequestMapping("/getAllStudent")
    public List<Students> findAllStudent(){
        return studentsService.findAllStudent();
    }

    @RequestMapping("/getStudentByno/{no}")
    public List<Students> findUserByStudentId(@PathVariable int no){
        return studentsService.findStudentByno(no);
    }
}

4.测试结果

(1)点击运行

?(2)打开浏览器输入http??????://localhost:8080/Student/getAllStudent/

?

? ?输入:http://://localhost:8080/Student/getStudentByno/1

?5.完整功能

StudentsMapper

package com.example.demo.mapper;

import com.example.demo.entity.Students;
import com.example.demo.entity.Students;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface StudentsMapper {
    public List<Students> findAllStudent();
    public List<Students> findStudentByno(int no);
    public List<Students> findStudentByname(String name);
    public int insertStudent(Students student);
    public int updateStudent(Students student);
    public int deleteStudent(Students student);
}

?StudentController

package com.example.demo.controller;

import com.example.demo.entity.Students;
import com.example.demo.service.StudentsService;
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("/Student")
class StudentsController {
    @Autowired
    private StudentsService studentService;

    @RequestMapping("/getAllStudent")
    public List<Students> findAll(){
        return studentService.findAllStudent();
    }

    @RequestMapping("/getStudentByno/{no}")
    public List<Students> findUserByStudentId(@PathVariable int no){
        return studentService.findStudentByno(no);
    }
    @RequestMapping("/getStudentByname/{name}")
    public List<Students> findStudentByname(@PathVariable String name){
        return studentService.findStudentByname(name);
    }

    @RequestMapping("/insertStudent")
    public Students insertStudent(Students student){
        return studentService.insertStudent(student);
    }

    @RequestMapping("/updateStudent")
    public int updateStudent(Students student){
        return studentService.updateStudent(student);
    }

    @RequestMapping("/deleteStudent")
    public int deleteStudent(Students student){
        return studentService.deleteStudent(student);
    }
}





StudentService

package com.example.demo.service;

import com.example.demo.entity.Students;
import com.example.demo.mapper.StudentsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
public class StudentsService {
    @Autowired(required = false)
    public StudentsMapper studentMapper;
    public List<Students> findAllStudent() {
        return studentMapper.findAllStudent();
    }
    public List<Students> findStudentByno(int no) {
        return studentMapper.findStudentByno(no);
    }
    public List<Students> findStudentByname(String name){
        return studentMapper.findStudentByname(name);
    }
    public Students insertStudent(Students student){
        studentMapper.insertStudent(student);
        return student;
    }

    public int updateStudent(Students student){
        return studentMapper.updateStudent(student);
    }
    public int deleteStudent(Students student){
        return studentMapper.deleteStudent(student);
    }
}


StudentMapper.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.example.demo.mapper.StudentsMapper">
    <resultMap id="result" type="com.example.demo.entity.Students">
        <result column="no" jdbcType="INTEGER" property="no" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="age" jdbcType="INTEGER" property="age" />
    </resultMap>

    <select id="findAllStudent" resultType="com.example.demo.entity.Students">
        select  * from students;
    </select>

    <select id="findStudentByno" resultType="com.example.demo.entity.Students">
        select * from students where no=#{no};
    </select>
    <select id="findStudentByname" resultType="com.example.demo.entity.Students">
        select * from students where name=#{name};
    </select>

    <insert id="insertStudent" parameterType="com.example.demo.entity.Students" keyProperty="no" useGeneratedKeys="true">
        insert into students(name,age) values (#{name},#{age});
    </insert>

    <update id="updateStudent" parameterType="com.example.demo.entity.Students">
        update students set name=#{name},age=#{age} where no=#{no};
    </update>

    <delete id="deleteStudent" parameterType="com.example.demo.entity.Students">
        delete from  where no=#{no};
    </delete>
</mapper>

查找:http://://localhost:8080/Student/getStudentByname/张二

插入一条信息:http://localhost:8080/Student/insertStudent?name=明明&age=123

?插入成功

?

?总结:JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作;MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。

参考文献:(8条消息) JDBC演变到Mybatis过程_luzhensmart的专栏-CSDN博客

MyBatis-从JDBC到Spring整合MyBatis_zgliulin-CSDN博客

IDEA数据库连接:从JDBC到Mybatis_WOOZI9600L2的博客-CSDN博客

(8条消息) IDEA实训——从JDBC到Mybatis_一只特立独行的猪 ?的博客-CSDN博客

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:20:41  更:2021-10-23 12:22:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/26 2:29:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码