前言
这里主要说两种方式来连接MySQL。
小型项目可以直接用JdbcTemplate。
大型项目可以考虑集成Mybatis。
还有一个JPA的方式
https://www.psvmc.cn/article/2024-01-16-spring-jpa.html
Spring Data JPA 是基于 Hibernate 的,所有优缺点也很明显。
优点
- 可以不用写SQL。
- 可以自动建表。
缺点
- 性能会差一点。
- 灵活性相对较低。
JdbcTemplate
添加依赖
1 | <dependency> |
配置
application.properties配置文件中增加数据库参数,信息内容如下:
1 | spring.datasource.url=jdbc:mysql://127.0.0.1:3306/zbi_source?useUnicode=true&characterEncoding=utf8 |
Service
1 | package cn.psvmc.zapicall.service; |
添加
1 | public void addUser(UserModel user) { |
Controller
1 | import cn.psvmc.zapicall.bean.UserModel; |
访问
启动项目,通过浏览器访问:
http://localhost:8080/user/user_list
http://localhost:8080/user/user_list2
http://localhost:8080/user/user_by_id
集成Mybatis
添加依赖
1 | <dependency> |
配置
application.properties配置文件中增加数据库参数,信息内容如下:
1 | spring.datasource.url=jdbc:mysql://127.0.0.1:3306/zbi_source |
Mapper
如果你的项目需求相对简单,对代码的可读性和维护性要求较高,可以选择注解方式;
如果你的项目需求比较复杂,对动态SQL的需求较多,或者你更倾向于将数据访问逻辑与Java代码分离的方式,可以选择XML配置方式。
注解方式
两种方式任选其一即可。
方式1
添加@Mapper
和@Repository
注解,这样就不用在Application中配置扫描的包了。
UserMapper.java
1 | package cn.psvmc.zapicall.mapper; |
方式2
不配置注解,在Application中添加扫描的包。
UserMapper.java
1 | package cn.psvmc.zapicall.mapper; |
Application上要添加注解
1 | "cn.psvmc.zapicall.mapper") ( |
简单的语句只需要使用@Insert、@Update、@Delete、@Select这4个注解即可,动态SQL语句需要使用@InsertProvider、@UpdateProvider、@DeleteProvider、@SelectProvider等注解。
具体可参考MyBatis官方文档:https://mybatis.org/mybatis-3/zh_CN/java-api.html。
映射字段
1 | "select * from t_user where id=#{id}") ( |
添加判断条件
在 MyBatis 中使用注解的方式编写 Mapper ,您可以通过使用 @SelectProvider
注解来添加判断条件。
@SelectProvider
注解允许您指定一个 Provider 类,该类包含根据不同条件生成 SQL 语句的方法。
首先,创建一个 Provider 类,它包含生成 SQL 语句的方法。方法的参数可以接受不同的参数,根据这些参数生成不同的 SQL 语句。
这里以生成一个包含条件判断的查询语句为例:
1 | public class UserProvider { |
然后,在 Mapper 接口的方法上使用 @SelectProvider
注解,并指定 Provider 类和方法:
1 | public interface UserMapper { |
在上面的例子中,@Param("condition")
注解将方法参数 condition
映射到 SQL 语句中的 #{condition}
。
现在,您可以在调用 Mapper 方法时传入不同的条件,以根据条件生成不同的 SQL 语句:
1 | List<MyEntity> result = myMapper.findDataWithCondition("id = #{id}"); |
注意
在编写动态 SQL 语句时,使用XML方式的时候可以使用 MyBatis 提供的条件判断标签,如
<if>
、<choose>
等,以动态生成不同的查询条件。但在注解方式下,无法直接使用这些标签,需要通过自定义 Provider 方法来实现判断条件的拼装。
XML方式
添加扫描配置
application.properties
中添加配置
1 | mybatis.mapper-locations=classpath*:mapper/*.xml |
映射类
UserMapper.java
1 | package cn.psvmc.zapicall.mapper; |
XML
UserMapper.xml
1 |
|
mybatis.type-aliases-package
配置后我们的实体类的包名就可以省略了
上面的可以简写为:
1 |
|
其它示例
1 |
|
jdbcType
在MyBatis中,jdbcType用于定义数据库和Java类型之间的映射关系。
它是通过XML映射文件或注解来配置的。
jdbcType的值可以是以下之一:
- VARCHAR:对应于Java中的String类型。
- CHAR:对应于Java中的String类型。
- LONGVARCHAR:对应于Java中的String类型。
- NCHAR:对应于Java中的String类型。
- NVARCHAR:对应于Java中的String类型。
- CLOB:对应于Java中的String类型。
- NUMERIC:对应于Java中的BigDecimal类型。
- DECIMAL:对应于Java中的BigDecimal类型。
- BIT:对应于Java中的Boolean类型。
- BOOLEAN:对应于Java中的Boolean类型。
- TINYINT:对应于Java中的Byte类型。
- SMALLINT:对应于Java中的Short类型。
- INTEGER:对应于Java中的Integer类型。
- BIGINT:对应于Java中的Long类型。
- REAL:对应于Java中的Float类型。
- FLOAT:对应于Java中的Double类型。
- DOUBLE:对应于Java中的Double类型。
- BINARY:对应于Java中的byte array类型。
- VARBINARY:对应于Java中的byte array类型。
- LONGVARBINARY:对应于Java中的byte array类型。
- DATE:对应于Java中的java.sql.Date类型。
- TIME:对应于Java中的java.sql.Time类型。
- TIMESTAMP:对应于Java中的java.sql.Timestamp类型。
其他示例
1 |
|
插件
为了方便开发我们可以安装插件MyBatisX
实体类
1 | package cn.psvmc.zapicall.bean; |
Service
UserService.java
1 | package cn.psvmc.zapicall.service; |
Controller
1 | package cn.psvmc.zapicall.controller; |
访问
启动项目,通过浏览器访问:
http://localhost:8080/user/list
http://localhost:8080/user/userById?id=6
Druid连接池
Druid不但提供连接池的功能,还提供监控功能,可以实时查看数据库连接池和SQL查询的工作情况。
1 | <!-- druid数据源驱动 --> |
配置从
1 | spring.datasource.url=jdbc:mysql://127.0.0.1:3306/zbi_source?useUnicode=true&characterEncoding=utf8 |
改为
1 | spring.datasource.type=com.alibaba.druid.pool.DruidDataSource |
访问
http://localhost:8080/druid/login.html
输入上面配置的账号密码druid
即可。
SpringBoot连接池规则
- 由于
HikariCP
的性能和并发性。如果有HikariCP
,SpringBoot 会选择它。 - 否则,如果
Tomcat数据源连接池
可用,也可以使用它。 - 如果
HikariCP
和Tomcat数据源连接池
都不可用,并且如果Commons DBCP2
可用,就使用它。
可以使用 spring.datasource.type
属性来指定要使用的连接池。
如果使用 spring-boot-starter-jdbc
或 spring-boot-starter-data-jpa
,将自动获得对 HikariCP
的依赖。