文章目录
一、从JDBC到Mybatis的改进
1.原始的JDBC连接数据库
(1)代码实现:
package esgdsfrg;
import java.sql.*;
public class Dtfgsewrf {
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/sys?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
// 数据库的用户名与密码,需要根据自己的设置
static final String USER = "root";
static final String PASS = "111111";
public static void main(String[] args){
Connection conn=null;
Statement stmt=null;
try{
//注册JDBC驱动
Class.forName(JDBC_DRIVER);
//打开链接
System.out.println("连接数据库...");
conn=DriverManager.getConnection(DB_URL,USER,PASS);
//执行查询
System.out.println("实例化Statement对象...");
stmt=conn.createStatement();
String sql;
sql="SELECT * FROM student";//数据库中的表名
ResultSet rs=stmt.executeQuery(sql);
//展开结果集数据库
while(rs.next()){
//通过字段检索
int id=rs.getInt("id");
String name=rs.getString("name");
String age=rs.getString("age");
String sex=rs.getString("sex");
String sorce=rs.getString("sorce");
//输出数据
System.out.print("ID:"+id);
System.out.print(",姓名:"+name);
System.out.print(",年龄:"+age);
System.out.print("性别: "+sex);
System.out.print("分数:"+sorce);
System.out.print("\n");
}
//完成后关闭
rs.close();
stmt.close();
conn.close();
} catch (SQLException | ClassNotFoundException se) {
//处理前面JDBC错误和Class.forName 错误
se.printStackTrace();
}finally {
//关闭资源
try{
if (stmt!=null) stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try{
if(conn!=null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
System.out.println("连接数据库结束");
}
}
JDBC的步骤:
·加载数据库驱动
·创建并获取数据库链接
·创建JDBC statement对象
·设置sql语句
·设置sql语句中的参数(用prepareStatement)
·通过statement执行sql并获取结果
·对sql执行结果进行解析处理
·释放资源(preparestatement、connection、resultSet)
因为以上过程,就会导致一些问题。
问题1:数据库链接创建、释放频繁造成系统资源浪费从而影响系
统性能。
解决问题:数据库连接的获取和关闭我们可以使用数据库连接池
来解决资源浪费的问题。通过连接池就可以反复利用所创建的连接
去访问数据库了,减少连接的开启和关闭时间。
问题2:sql语句在代码中硬编码,造成代码不易维护,实际应用
sql的变化可能较大,sql变动需要改变java代码。
解决问题:Mybatis把sql语句写在配置文件中通过xml或注解的
方式将要执行的各种statement(statement、
prepareStatement、CallableStatement)配置起来,
并通过Java对象和statement中的sql进行映射生成最终可执行的
sql语句,最后由Mybatis框架执行sql并将结果映射成Java对象
返回。这样当需要更改sql时,只需要更改配置文件。(不影响接
口的情况下)
问题3:使用prepareStatement向占有位符号传参数存在硬编码,
因为sql语句的where条件不一定,可能多也可能少,修改sql还
要修改代码,系统不宜维护。
解决问题:同上,配置文件。
下面来看看Mybatis的执行过程:
1.mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,
配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的
sql语句。此文件需要在SqlMapConfig.xml中加载。
2.通过mybatis环境等配置信息构造SqlSessionFactory即绘画
工厂。
3.由会话工厂创建sqlSession即会话,操作数据库由
sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,
Executor接口有两个实现,一个是基本执行器、一个是缓存
执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装
了mybatis配置信息及sql映射信息等。 mapper.xml文件中一个
sql对应一个Mapped Statement对象,sql的id即是Mapped
statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括
HashMap、基本类型、pojo,Executor通过Mapped Statemen
t在执行sql前将输入的java对象映射至sql中,输入参数映射
就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括
HashMap、基本类型、pojo,Executor通 过Mapped Statement
在执行sql后将输出结果映射至java对象中,输出结果映射过程相
当于jdbc编程中对结果的解析处理过程。
二、在idea环境下Mybatis访问mysql数据
1.在idea下新建项目工程
选择左侧的Spring Initializr,jdk要求1.8及以上,选择默认的Default下一步:
我们可以不改这些信息直接下一步,如果想改名字可以自己修改Group及Artifact,和最下边的package包名,选择下一步
选择项目所需要的依赖,这个页面是选择你工程中需要用到的依赖,因为我们的目标是web项目使用mybatis所以在web模块中勾选Spring Web,在SQL中依次勾选Jdbc API、Mybatis Framework、Mysql Driver。然后下一步直到finish即可。
接着项目就会下载我们需要的依赖
2.配置项目相关信息
1.来看下建好后的pom.xml文件,上一步选择的依赖,在pom.xml文件中 已经自动添加到我们的文件中了。下面为本项目的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>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</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>
修改配置文件
Spring Boot通过pom.xml中引入模块化的Stater,使得常规的开发场景可以很快把应用搭建起来。在使用Spring Boot的过程中,除了可以在pom.xml中配置一些内容外,一些项目相关的配置也可以在application.properties中通过配置来完成。
application.properties文件为默认项目配置文件,默认为空的,我们可以在配置文件中配置端口、名字等一般属性,也可以配置自定义属性、参数引用、多环境配置等,可以参考 https://www.jianshu.com/p/c023083f51b4 一文说明介绍。 application.properties文件在项目-src-main-resources下。
本项目如果使用application.properties文件,可以在文件中添加端口、数据源、mydatis等相关数据,下面为文件内容。
server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
3.创建User实体类实现业务流程
1.创建数据表
2.创建项目路径包来,展示业务流程。在项目src-main-java-com-sjzeis下分别创建包:controller、entity、mapper、service,用来实现控制层、实体层、映射层、业务层。
3 .在src-main-resources下创建mapper包用于存放*Mapper.xml文件
项目结构如图:
创建entity实体类User:
package com.sjzeis.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 + '\'' +
'}';
}
}
创建Mapper映射操作UserMapper:
package com.example.demo.control;
import com.sjzeis.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 id);
}
创建Mapper映射对应的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.example.demo.mapper.UserMapper">
<resultMap id="result" type="com.example.demo.entity.User">
<result column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="hobby" jdbcType="VARCHAR" property="hobby" />
</resultMap>
<select id="findAllUser" resultType="com.example.demo.entity.User">
select * from user;
</select>
</mapper>
创建service业务UserService类:
package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.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();
}
}
最后运行,
并且在地址栏输入:localhost:8080/user/getAllUser/
三、总结
该文章主要内容为从JDBC连接数据库到Mybatis的改进。并且了解Mybatis。
四、参考文献
https://blog.csdn.net/mahaokun/article/details/103221874/
https://blog.csdn.net/qq_45659777/article/details/120788539?spm=1001.2014.3001.5501