源码下载
mybatis
初识mybatis
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects)映射成数据库中的记录。
MyBatis 的几个主要特点:
- 支持定制化 SQL、存储过程和高级映射:MyBatis 主要管理 SQL 语句的运行,让开发者可以专注于 SQL 语句本身,而不是花费精力处理 JDBC 等数据库连接相关的代码。
- 灵活的映射规则:MyBatis 提供了很多灵活的映射规则,比如一对一、一对多、多对多等复杂关系都可以通过简单的 XML 配置实现。
- 松耦合:MyBatis 不会像一些传统的 ORM 框架那样强迫你使用某种编程模型,它允许你使用简单的 XML 或注解来配置 SQL 语句和映射关系,不会强制你抽象出 POJOs。
- 易于上手和集成:MyBatis 易于理解和实施,它可以很容易地集成到各种应用之中。
- 动态 SQL:MyBatis 提供了强大的动态 SQL 功能,可以方便地实现复杂的查询和操作。
- 可定制 SQL 执行:MyBatis 允许自定义 SQL 执行语句,提供了包括插件在内的多种方式来优化 SQL 的执行。
- 丰富的映射标签:MyBatis 提供了丰富的映射标签,使得数据库操作更加灵活、方便。
- 良好的支持性:MyBatis 支持多种数据库,如 MySQL、Oracle、SQL Server、H2、Sqlite 等。
MyBatis 的使用步骤大致如下: - 配置 MyBatis:通过 SQL 映射文件或注解来配置 SQL 语句。
- 创建会话工厂(SqlSessionFactory):通过配置文件或代码来创建 SqlSessionFactory。
- 创建 SQL 会话(SqlSession):利用 SqlSessionFactory 来创建 SQL 会话。
- 执行操作:通过 SQL 会话执行定义好的 SQL 语句。
- 处理结果:根据执行的 SQL 语句处理结果集。
- 关闭会话:操作完成后关闭 SQL 会话。
MyBatis 框架在国内外都有广泛的应用,是 Java 开发中常用的一种数据库操作框架。
原生jdbc操作数据库
原生 JDBC(Java Database Connectivity)是指 Java 数据库连接,它是一个用于 Java 程序和各种数据库之间进行交互的 API。JDBC 提供了一种标准方法来访问数据库,允许 Java 应用程序以一种统一的方式与不同的数据库进行通信。
package com.wyl.mybatis.service;
import java.sql.*;
/**
* @Description
* @Author WuYiLong
* @Date 2024/2/26 11:36
*/
public class JdbcService {
/**
* 数据库链接
*/
private static final String url = "jdbc:mysql://localhost:3306/blog?zeroDateTimeBehavior=CONVERT_TO_NULL&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8";
/**
* 用户名
*/
private static final String username = "root";
/**
* 密码
*/
private static final String password = "123456";
public static void main(String[] args) {
try {
// 加载所需的 JDBC 驱动,这通常是通过调用 Class.forName() 方法来完成的
Class.forName("com.mysql.cj.jdbc.Driver");
// 使用 DriverManager.getConnection() 方法建立与数据库的连接。
Connection connection = DriverManager.getConnection(url, username, password);
// 创建一个 Statement 或 PreparedStatement 对象来执行 SQL 语句。
String sql = "SELECT * FROM `b_expert` limit 10;";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.executeQuery(sql);
// 如果是查询操作,执行 executeQuery() 方法,并处理返回的 ResultSet。
ResultSet resultSet = preparedStatement.executeQuery(sql);
// 通过遍历,输出数据
while (resultSet.next()) {
System.out.println("专家名称:"+resultSet.getString("name"));
}
// 关闭 ResultSet、Statement 和 Connection,以释放数据库资源。
resultSet.close();
preparedStatement.close();
connection.close();
} catch (SQLException | ClassNotFoundException throwables) {
System.out.println(throwables.getMessage());
}
}
}
mybatis操作数据库
数据表设计
CREATE TABLE `d_full_city` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`code` varchar(255) DEFAULT NULL COMMENT '区域码',
`full_name` varchar(255) DEFAULT NULL COMMENT '全名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46476 DEFAULT CHARSET=utf8mb4 COMMENT='省市区-字典';
实体类
package com.wyl.mybatis.entity;
/**
* @Description 省市区-字典
* @Author wuyilong
* @Date 2024-02-26
*/
public class FullCity {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 区域码
*/
private String code;
/**
* 全名称
*/
private String fullName;
public static long getSerialVersionUID() {
return serialVersionUID;
}
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 String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
}
mapper接口
package com.wyl.mybatis.mapper;
import com.wyl.mybatis.entity.FullCity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @Description 省市区-字典
* @Author wuyilong
* @Date 2024-02-26
*/
@Mapper
public interface FullCityMapper {
/**
* 根据名称查询
* @param name
* @return
*/
FullCity selectByName(@Param("name") String name);
}
mapper.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.wyl.mybatis.mapper.FullCityMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.wyl.mybatis.entity.FullCity">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="code" property="code"/>
<result column="full_name" property="fullName"/>
</resultMap>
<select id="selectByName" resultType="com.wyl.mybatis.entity.FullCity">
select * from d_full_city where name = #{name}
</select>
</mapper>
mybatis的配置文件
<?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>
<!-- 属性:定义配置外在化 -->
<properties resource="mybatis-mysql.properties">
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="driver" value=""/>
<property name="url" value=""/>
</properties>
<!-- 设置:定义mybatis的一些全局性设置 -->
<settings>
<!-- 具体的参数名和参数值 -->
<setting name="cacheEnabled" value="true"/>
<!-- <setting name="lazyLoadingEnabled" value="true"/>-->
<!-- <setting name="multipleResultSetsEnabled" value="true"/>-->
<!-- <setting name="useColumnLabel" value="true"/>-->
<!-- <setting name="useGeneratedKeys" value="false"/>-->
<!-- <setting name="autoMappingBehavior" value="PARTIAL"/>-->
<!-- <setting name="defaultExecutorType" value="SIMPLE"/>-->
<!-- <setting name="defaultStatementTimeout" value="25"/>-->
<!-- <setting name="defaultFetchSize" value="100"/>-->
<!-- <setting name="safeRowBoundsEnabled" value="false"/>-->
<!-- <setting name="mapUnderscoreToCamelCase" value="false"/>-->
<!-- <setting name="localCacheScope" value="SESSION"/>-->
<!-- <setting name="jdbcTypeForNull" value="OTHER"/>-->
<!-- <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>-->
</settings>
<!-- 环境:配置mybatis的环境 -->
<environments default="development">
<!-- 环境变量:可以配置多个环境变量,比如使用多数据源时,就需要配置多个环境变量 -->
<environment id="development">
<!-- 事务管理器 -->
<transactionManager type="jdbc"></transactionManager>
<!-- 数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="./mapper/ExpertMapper.xml" />
</mappers>
</configuration>
mybatis的数据库配置文件
username=root
password=123456
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/blog?zeroDateTimeBehavior=CONVERT_TO_NULL&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8
执行过程
package com.wyl.mybatis.service;
import com.wyl.mybatis.entity.FullCity;
import com.wyl.mybatis.mapper.FullCityMapper;
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;
/**
* @Description
* @Author WuYiLong
* @Date 2024/2/26 16:04
*/
public class MybatisService {
public static void main(String[] args) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
FullCityMapper mapper = sqlSession.getMapper(FullCityMapper.class);
FullCity fullCity = mapper.selectByName("广东省");
System.out.println("城市的名称:"+fullCity.getName());
}
}
总结
JDBC 提供了最底层的访问数据库的方式,直接使用SQL语句,灵活但需要手动管理连接和事务。
MyBatis 是在JDBC之上的一个抽象层,隐藏了如何连接数据库、如何处理事务、如何关闭流、自动提交,通过ORM提供了更高层次的数据库操作,通过编写简单的sql就可以完成增删改查,简化了开发流程,更适合于复杂的SQL操作和动态SQL需求。
所以在选择使用JDBC还是MyBatis时,通常考虑应用的复杂性、性能需求和开发效率等因素。对于简单的数据库操作,JDBC可能更直接高效;而对于复杂的业务逻辑和大量的数据库交互,MyBatis提供的抽象和便利可能会更加合适。