这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
前言
对于Java系中,最著名的ORM框架也就是Mybatis
,JPA
,Hibernate
了,在面对领导开发快速迭代的场景想,大部分的项目都是基于SSM的,这个M也就是Mybatis.
Mybatis
简单灵活从另一个角度就是需要自己写所有的代码(简单的可以使用代码生成器),Mybatis
也有第三方的增强工具比如MybatisPlus
,这个下次再说.
集成
Maven包引入
<!--mysql连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
正常项目中都需要引入数据库连接池工具,来管理数据库连接,现在性能最好的一批是Druid
和HikariCP
.Druid是阿里巴巴开源的工具,国内受众比较广,带sql监控.HikariCP
是SpringBoot后来默认集成的工具,专注于连接池管理.无监控
HikariCP方式
springBoot默认的数据库连接池是HikariCP
,无需再加其他配置
Druid方式
springBoot默认的数据库连接池是HikariCP
,
而HikariCP
在spring-boot-starter-jdbc
中,因此需要显示的定义出来spring-boot-starter-jdbc
,然后排除HikariCP
,再引入Druid
.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<!--排除HikariCP 连接池-->
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.14</version>
</dependency>
application.yml配置
数据库和连接池配置
HikariCP方式
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver #mysql 8.0
url: jdbc:mysql:///zdc_test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123123
type: com.zaxxer.hikari.HikariDataSource #当前使用的数据源 Hikari
hikari:
minimum-idle: 1 # 池中维护的最小空闲连接数 默认10 根据实际情况来
maximum-pool-size: 10 # 池中最大连接数 根据实际情况来
auto-commit: true # 自动提交从池中返回的连接
idle-timeout: 600000 # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
max-lifetime: 1800000 # 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL
connection-timeout: 30000 # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
connection-test-query: select 1
read-only: false # 是否是只读
Druid方式
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver #mysql 8.0
url: jdbc:mysql:///zdc_test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123123
type: com.alibaba.druid.pool.DruidDataSource #当前使用的数据源 druid
druid:
initial-size: 2 #初始化连接大小 根据实际情况来
min-idle: 1 # 池中维护的最小空闲连接数 默认10 根据实际情况来
max-active: 10 # 池中最大连接数 根据实际情况来
default-auto-commit: true # 自动提交从池中返回的连接
test-on-borrow: true #申请连接时执行validationQuery检测连接是否有效。
max-evictable-idle-time-millis: 1800000 # 最大生存的时间毫秒
min-evictable-idle-time-millis: 300000 #最小生存的时间毫秒
validation-query: select 1
default-read-only: false # 是否只读
aop-patterns: zdc.enterprise.service.impl.*.* # 监控切入点
filter: #过滤器配置
stat:
enabled: true
merge-sql: true
slow-sql-millis: 1
stat-view-servlet: # 监听配置
enabled: true # 是否启用监控
url-pattern: /druid/* #访问路径
reset-enable: false
login-username: 123123 #访问账号
login-password: 123123
其中此处代码就是配置Druid监控功能,项目启动之后直接访问/druid
,输入账号密码后即可访问
stat-view-servlet: # 监听配置
enabled: true # 是否启用监控
url-pattern: /druid/* #访问路径
reset-enable: false
login-username: 123123 #访问账号
login-password: 123123
MyBatis配置
mybatis:
mapper-locations: "classpath:/mappers/*Mapper.xml"
type-aliases-package: zdc.enterprise.entity
configuration:
use-generated-keys: true
mapper-locations
: entity对应的xml文件的位置
type-aliases-package
:entity包扫描位置
必要的注解配置
在Application
启动类上添加相关的注解
@ComponentScan({"zdc.enterprise.*"})
@EnableTransactionManagement
@MapperScan("zdc.enterprise.mapper")
@SpringBootApplication
public class SpringBootEnterpriseApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootEnterpriseApplication.class, args);
}
}
@EnableTransactionManagement
是开启事务管理
@MapperScan
是配置dao层接口文件的扫描路径,也就是和xml对应的XXMapper或者XXDao的路径
使用
项目目录结构
(1) 在数据库中创建一个student
表
CREATE TABLE `student` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255),
`age` int(11),
`birthdate` datetime ,
`money` decimal(10,0),
`info` varchar(255) COMMENT 'zouzdc',
PRIMARY KEY (`id`)
) ;
(2) 在entity
包下创建Student.java
类
@Data
@NoArgsConstructor
public class Student {
/**
* id
*/
private Long id;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 出生日期
*/
private LocalDate birthdate;
/**
* 零花钱
*/
private BigDecimal money;
/**
* 其他信息
*/
private String info;
}
(3) controller
和service
没啥可写的
(4) 在Mapper
层创建StudentMapper.java
接口类
public interface StudentMapper {
/***
* 根据参量查询student
* @param studentDto
* @return
*/
List<Student> getStudentByParams(StudentDto studentDto);
/***
* 分页查询
* @param studentDto
* @return
*/
List<Student> getStudentPage(StudentDto studentDto, Page page);
/***
* 分页查询总数
* @param studentDto
* @return
*/
Long getStudentPageCount(StudentDto studentDto);
/***
* 新增student
* @param student
* @return
*/
Long saveStudent(Student student);
/***
* 根据id更新student
* @param student
* @return
*/
int updateStudentById(Student student);
/***
* 根据id删除tudent
* @param id
* @return
*/
int deleteStudentById(Long id);
}
(5)在resources
的mappers
文件下创建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="zdc.enterprise.mapper.StudentMapper">
<resultMap type="zdc.enterprise.entity.Student" id="BaseResultMap">
<result column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
<result column="birthdate" property="birthdate" />
<result column="money" property="money" />
<result column="info" property="info" />
</resultMap>
<sql id="Base_Column_List">
`id` ,
`name` ,
`age` ,
`birthdate` ,
`money` ,
`info`
</sql>
<!-- 列表查询 -->
<select id="getStudentByParams" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"></include>
FROM student
WHERE 1=1
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null and name != ''">
AND name like concat('%' , #{name} ,'%')
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="birthdate != null">
AND birthdate = #{birthdate}
</if>
<if test="money != null">
AND money = #{money}
</if>
<if test="info != null and info != ''">
AND info like concat('%' , #{info} ,'%') /*请根据情况去判断是= 还是like 并删掉此句*/
</if>
</select>
<select id="getStudentPage" resultType="zdc.enterprise.entity.Student">
SELECT
<include refid="Base_Column_List"></include>
FROM student
WHERE 1=1
<if test="studentDto.id != null">
AND id = #{studentDto.id}
</if>
<if test="studentDto.name != null and studentDto.name != ''">
AND name like concat('%' , #{studentDto.name} ,'%')
</if>
<if test="studentDto.age != null">
AND age = #{studentDto.age}
</if>
<if test="studentDto.birthdate != null">
AND birthdate = #{studentDto.birthdate}
</if>
<if test="studentDto.money != null">
AND money = #{studentDto.money}
</if>
<if test="studentDto.info != null and studentDto.info != ''">
AND info like concat('%' , #{studentDto.info} ,'%')
</if>
<if test="page.fenye != null and page.fenye ">
limit #{page.start} ,#{page.size}
</if>
</select>
<select id="getStudentPageCount" resultType="java.lang.Long">
SELECT
count(1) as count
FROM student
WHERE 1=1
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null and name != ''">
AND name like concat('%' , #{name} ,'%')
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="birthdate != null">
AND birthdate = #{birthdate}
</if>
<if test="money != null">
AND money = #{money}
</if>
<if test="info != null and info != ''">
AND info like concat('%' , #{info} ,'%')
</if>
</select>
<update id="updateStudentById">
UPDATE `student` SET
`name`=#{name},
`age`=#{age},
`birthdate`=#{birthdate},
`money`=#{money},
`info`=#{info}
where
id =#{id}
</update>
<!-- 请根据此方法,书写自己的update方法,不可以直接使用-->
<insert id="saveStudent" keyProperty="id">
INSERT INTO `student` (
`name`,
`age`,
`birthdate`,
`money`,
`info`
) values (
#{name},
#{age},
#{birthdate},
#{money},
#{info}
)
</insert>
<delete id="deleteStudentById">
DELETE from student where id = #{id}
</delete>
</mapper>
备注
根据项目需要权衡是否移动要使用原生的MyBatis
在使用MyBatis的时候一定要配合代码生成器使用,网上很多开源的代码生成器,也可以自己写代码模版,提高效率
如果使用IDEA的话 推荐使用free mybatis plugin
或者MybatisX
插件, 能将接口类和mapper文件自动关联,并可以直接跳转
如果想更方便的话就配合MyBatisPlus使用吧
作者:ZOUZDC
链接:https://juejin.cn/post/7028963866063306760
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。