从JDBC到Mybatis
前言
本文将简单介绍什么是Mybaties和如何操作其与数据库取得联系
一、关于Mybaties
1.什么是Mybaties
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2.Mybaties与JDBC的区别
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。MyBatis是对JDBC的封装。
3.MyBatis的优点
- 优化获取和释放
我们一般在访问数据库时都是通过数据库连接池来操作数据库,数据库连接池有好几种,比如C3P0、DBCP,也可能采用容器本身的JNDI数据库连接池。我们可以通过DataSource进行隔离解耦,我们统一从DataSource里面获取数据库连接,DataSource具体由DBCP实现还是由容器的JNDI实现都可以,所以我们将DataSource的具体实现通过让用户配置来应对变化。
- SQL统一管理,对数据库进行存取操作
我们使用JDBC对数据库进行操作时,SQL查询语句分布在各个Java类中,这样可读性差,不利于维护,当我们修改Java类中的SQL语句时要重新进行编译。
Mybatis可以把SQL语句放在配置文件中统一进行管理,以后修改配置文件,也不需要重新就行编译部署。
- 生成动态SQL语句
我们在查询中可能需要根据一些属性进行组合查询,比如我们进行商品查询,我们可以根据商品名称进行查询,也可以根据发货地进行查询,或者两者组合查询。如果使用JDBC进行查询,这样就需要写多条SQL语句。
- 能够对结果集进行映射
我们在使用JDBC进行查询时,返回一个结果集ResultSet,我们要从结果集中取出结果封装为需要的类型
在Mybatis中我们可以设置将结果直接映射为自己需要的类型,比如:JavaBean对象、一个Map、一个List等等。
二、操作Mybaties
1.使用JDBC
此处我们继续使用上次所创建的数据库和项目
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class test {
static final String driverName="com.mysql.cj.jdbc.Driver";
static final String dbUrl="jdbc:mysql://localhost:3306/test";
static final String userName="root";
static final String password="jmfl.13320324195";
public static void main(String[] args) {
// TODO Auto-generated method stub
// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
Connection conn = null;
Statement stmt = null;
try{
// 注册 JDBC 驱动
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, url FROM websites";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while(rs.next()){
// 通过字段检索
int id = rs.getInt("id");
String name = rs.getString("name");
String url = rs.getString("url");
// 输出数据
System.out.print("ID: " + id);
System.out.print(", 站点名称: " + name);
System.out.print(", 站点 URL: " + url);
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!");
}
}
2.使用Mybaties
- 创建Mybaties项目
(1)
(2)
(3)
3.文件配置
- 添加包。在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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>databasedemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>databasedemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 数据库连接配置。在application.properties中
server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=xxxxxxxxxxxxx
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
4.代码书写
- 先在与启动类同一层中创建包controller、entity、mapper、service,用来实现控制层、实体层、映射层、业务层
- 在资源文件下创建mapper文件夹
- 在entity创建实体类Web
package com.example.mysql_to_mybaties.entity;
public class Web {
private int id;
private String name;
private String url;
private int alexa;
private String country;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setUrl(String url) {
this.url = url;
}
public int getAlexa() {
return alexa;
}
public void setAlexa(int alexa) {
this.alexa = alexa;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getUrl() {
return url;
}
@Override
public String toString() {
return "websites{" +
"id=" + id +
", name='" + name + '\'' +
", url='" + url + '\'' +
'}';
}
}
- 在Mapper包下创建映射操作WebMapper接口
package com.example.mysql_to_mybaties.mapper;
import com.example.mysql_to_mybaties.entity.Web;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface WebMapper {
public List<Web> findAllWeb();
List<Web> findWebByid(int id);
}
- 在resource文件夹下如下路径的文件夹,并创建映射操作WebMapper.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.mysql_to_mybaties.mapper.WebMapper">
<resultMap id="result" type="com.example.mysql_to_mybaties.entity.Web">
<result column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="url" jdbcType="VARCHAR" property="url" />
</resultMap>
<select id="findAllWeb" resultType="com.example.mysql_to_mybaties.entity.Web">
select * from websites;
</select>
<select id="findWebByid" resultType="com.example.mysql_to_mybaties.entity.Web">
select * from websites where id=#{id};
</select>
</mapper>
- 在service创建业务WebService类
package com.example.mysql_to_mybaties.service;
import com.example.mysql_to_mybaties.entity.Web;
import com.example.mysql_to_mybaties.mapper.WebMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class WebService {
@Autowired(required = false)
public WebMapper webMapper;
public List<Web> findAllStudent() {
return webMapper.findAllWeb();
}
public List<Web> findWebByid(int id) {
return webMapper.findWebByid(id);
}
}
7.在 controller控制层创建WebController类
package com.example.mysql_to_mybaties.controller;
import com.example.mysql_to_mybaties.entity.Web;
import com.example.mysql_to_mybaties.service.WebService;
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("/Web")
class WebController {
@Autowired
private WebService webService;
@RequestMapping("/getAllWeb")
public List<Web> findAll(){
return webService.findAllWeb();
}
@RequestMapping("/getWebByid/{id}")
public List<Web> findUserByWebId(@PathVariable int id){
return webService.findWebByid(id);
}
}
5.运行结果
在网址输入http://localhost:8080/Web/getAllWeb/
在网址输入http://localhost:8080/Web/getWebByid/2/
代码网址–GitHub
https://github.com/J-JMF/mysql_to_mybaties
参考文章
https://blog.csdn.net/weixin_56102526/article/details/120825699?spm=1001.2014.3001.5501