• spring Boot使用Mybatis实践


    Mybatis作为一款优秀的持久层框架,具有简化SQL编写、灵活性、易于集成、等特点深受开发人员青睐,下文将为大家讲到在Spring Boot中如何使用Mybatis

    1、依赖引入

    数据库驱动

    1. mysql
    2. mysql-connector-java
    3. 8.0.26

    数据源管理

    1. com.alibaba
    2. druid-spring-boot-starter
    3. 1.2.8

     Mybatis

    1. org.mybatis.spring.boot
    2. mybatis-spring-boot-starter
    3. 2.1.4

    2、配置信息

    数据源配置

    1. spring.datasource.druid.url=jdbc:mysql://IP:PORT/库名?characterEncoding=UTF-8&allowMultiQueries=true&useSSL=true
    2. spring.datasource.druid.username=用户名
    3. spring.datasource.druid.password=密码
    4. spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
    5. spring.datasource.druid.type=com.alibaba.druid.pool.DruidDataSource
    6. spring.datasource.druid.max-idle=10
    7. spring.datasource.druid.max-active=20
    8. spring.datasource.druid.max-wait=10000
    9. spring.datasource.druid.min-idle=5
    10. spring.datasource.druid.initial-size=5
    11. #自动重连
    12. spring.datasource.druid.autoReconnect=true
    13. #连接空闲时是否执行健康检查
    14. spring.datasource.druid.test-while-idle=true
    15. #连接池用于健康检查的 SQL 语句。在每次获取连接时都会执行该语句来判断连接是否有效
    16. spring.datasource.druid.validation-query=SELECT 1
    17. #健康检查间隔时间,单位毫秒
    18. spring.datasource.druid.validation-interval=18000
    19. #连接最大寿命,单位毫秒
    20. spring.datasource.druid.max-lifetime=180000

     mybatis配置

    1. #mybatis
    2. #xml文件路径
    3. mybatis.mapper-locations=classpath:mybatis/*.xml
    4. logging.level.com.baomidou.mybatisplus=DEBUG
    5. #将mapper包下的日志级别设置为DEBUG
    6. logging.level.com.jd.XXX.mapper=DEBUG
    7. mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl

    使Mybatis生效

    在Spring Boot启动主类上添加

    @MapperScan("com.jd.XX.mapper")//使用MapperScan批量扫描所有的Mapper接口;
    

    3、操作数据

    3.1、声明和数据表字段一一映射的简单对象

    1. package XXX;
    2. import java.math.BigDecimal;
    3. import java.util.Date;
    4. import java.util.StringJoiner;
    5. /**
    6. * 企业商户
    7. * User
    8. * 数据库表:user
    9. */
    10. public class User {
    11. /**
    12. * 自增ID
    13. * 表字段 : user.id
    14. */
    15. private Long id;
    16. private String merchantNo;
    17. private String registrationNo;
    18. /**
    19. * 组织结构代码
    20. */
    21. private String organizationCode;
    22. /**
    23. * 统一社会信用代码
    24. */
    25. private String companyUscc;
    26. private String companyName;
    27. private Integer companyType;
    28. private String role;
    29. /**
    30. * 企业经营范围
    31. */
    32. private String companyScope;
    33. private String provinceName;
    34. /**
    35. * 企业所在城市
    36. * 表字段 : user.city_name
    37. */
    38. private String cityName;
    39. private BigDecimal creditScore;
    40. /**
    41. * 企业地址
    42. * 表字段 : user.address
    43. */
    44. private String address;
    45. /**
    46. * 企业联系人
    47. * 表字段 : user.contact
    48. */
    49. @Crypt
    50. private String contact;
    51. private String contactCardType;
    52. private String contactCardNo;
    53. /**
    54. * 企业法人证件正面图片地址
    55. */
    56. private String contactFaceUrl;
    57. /**
    58. * 企业法人证件反面图片地址
    59. */
    60. private String contactConUrl;
    61. /**
    62. * 手持证件照片地址
    63. */
    64. private String contactUrl;
    65. /**
    66. * 企业联系人邮箱
    67. * 表字段 : user.contact_tel
    68. */
    69. private String contactTel;
    70. /**
    71. * 企业中征码
    72. * 表字段 : user.crc_code
    73. */
    74. private String crcCode;
    75. /**
    76. * 银行类型,国股 三农 城商
    77. * 表字段 : user.is_bank_org
    78. */
    79. private Integer bankType;
    80. private Integer supportCredit;
    81. private Integer isAuth;
    82. private String companyMold;
    83. /**
    84. * 企业营业执照图片地址
    85. */
    86. private String companyUrl;
    87. /**
    88. * 邮寄地址
    89. */
    90. private String mailingAddress;
    91. private Integer acceptProtocol;
    92. private Date startTime;
    93. /**
    94. * 逻辑删除字段:0正常,1删除
    95. */
    96. private Integer ldeleteFlag;
    97. /**
    98. * 是否接受平台协议
    99. */
    100. public boolean hasAcceptProtocol() {
    101. return this.acceptProtocol != null && this.acceptProtocol.equals(1);
    102. }
    103. /**
    104. * 创建时间
    105. * 表字段 : user.created_date
    106. */
    107. private Date createdDate;
    108. /**
    109. * 修改时间
    110. * 表字段 : user.modified_date
    111. */
    112. private Date modifiedDate;
    113. private Integer channel;
    114. /**
    115. * 企业用户 id.
    116. */
    117. private String companyUserId;
    118. public Long getId() {
    119. return id;
    120. }
    121. /**
    122. * 设置 自增ID 字段:user.id
    123. *
    124. * @param id the value for user.id, 自增ID
    125. */
    126. public void setId(Long id) {
    127. this.id = id;
    128. }
    129. public String getMerchantNo() {
    130. return merchantNo;
    131. }
    132. public void setMerchantNo(String merchantNo) {
    133. this.merchantNo = merchantNo == null ? null : merchantNo.trim();
    134. }
    135. public String getOrganizationCode() {
    136. return organizationCode;
    137. }
    138. public void setOrganizationCode(String organizationCode) {
    139. this.organizationCode = organizationCode;
    140. }
    141. public String getCompanyScope() {
    142. return companyScope;
    143. }
    144. public void setCompanyScope(String companyScope) {
    145. this.companyScope = companyScope;
    146. }
    147. public String getCompanyUscc() {
    148. return companyUscc;
    149. }
    150. public void setCompanyUscc(String companyUscc) {
    151. this.companyUscc = companyUscc;
    152. }
    153. public String getRegistrationNo() {
    154. return registrationNo;
    155. }
    156. public void setRegistrationNo(String registrationNo) {
    157. this.registrationNo = registrationNo == null ? null : registrationNo.trim();
    158. }
    159. /**
    160. * 获取 企业名称 字段:user.company_name
    161. *
    162. * @return user.company_name, 企业名称
    163. */
    164. public String getCompanyName() {
    165. return companyName;
    166. }
    167. /**
    168. * 设置 企业名称 字段:user.company_name
    169. *
    170. * @param companyName the value for user.company_name, 企业名称
    171. */
    172. public void setCompanyName(String companyName) {
    173. this.companyName = companyName == null ? null : companyName.trim();
    174. }
    175. public Integer getCompanyType() {
    176. return companyType;
    177. }
    178. public void setCompanyType(Integer companyType) {
    179. this.companyType = companyType;
    180. }
    181. public String getProvinceName() {
    182. return provinceName;
    183. }
    184. public void setProvinceName(String provinceName) {
    185. this.provinceName = provinceName == null ? null : provinceName.trim();
    186. }
    187. /**
    188. * 获取 企业所在城市 字段:user.city_name
    189. *
    190. * @return user.city_name, 企业所在城市
    191. */
    192. public String getCityName() {
    193. return cityName;
    194. }
    195. /**
    196. * 设置 企业所在城市 字段:user.city_name
    197. *
    198. * @param cityName the value for user.city_name, 企业所在城市
    199. */
    200. public void setCityName(String cityName) {
    201. this.cityName = cityName == null ? null : cityName.trim();
    202. }
    203. public BigDecimal getCreditScore() {
    204. return creditScore;
    205. }
    206. public void setCreditScore(BigDecimal creditScore) {
    207. this.creditScore = creditScore;
    208. }
    209. /**
    210. * 获取 企业地址 字段:user.address
    211. *
    212. * @return user.address, 企业地址
    213. */
    214. public String getAddress() {
    215. return address;
    216. }
    217. /**
    218. * 设置 企业地址 字段:user.address
    219. *
    220. * @param address the value for user.address, 企业地址
    221. */
    222. public void setAddress(String address) {
    223. this.address = address == null ? null : address.trim();
    224. }
    225. /**
    226. * 获取 企业联系人 字段:user.contact
    227. *
    228. * @return user.contact, 企业联系人
    229. */
    230. public String getContact() {
    231. return contact;
    232. }
    233. /**
    234. * 设置 企业联系人 字段:user.contact
    235. *
    236. * @param contact the value for user.contact, 企业联系人
    237. */
    238. public void setContact(String contact) {
    239. this.contact = contact == null ? null : contact.trim();
    240. }
    241. /**
    242. * 获取 企业联系人邮箱 字段:user.contact_tel
    243. *
    244. * @return user.contact_tel, 企业联系人邮箱
    245. */
    246. public String getContactTel() {
    247. return contactTel;
    248. }
    249. /**
    250. * 设置 企业联系人邮箱 字段:user.contact_tel
    251. *
    252. * @param contactTel the value for user.contact_tel, 企业联系人邮箱
    253. */
    254. public void setContactTel(String contactTel) {
    255. this.contactTel = contactTel == null ? null : contactTel.trim();
    256. }
    257. /**
    258. * 获取 企业中征码 字段:user.crc_code
    259. *
    260. * @return user.crc_code, 企业中征码
    261. */
    262. public String getCrcCode() {
    263. return crcCode;
    264. }
    265. /**
    266. * 设置 企业中征码 字段:user.crc_code
    267. *
    268. * @param crcCode the value for user.crc_code, 企业中征码
    269. */
    270. public void setCrcCode(String crcCode) {
    271. this.crcCode = crcCode == null ? null : crcCode.trim();
    272. }
    273. public Integer getBankType() {
    274. return bankType;
    275. }
    276. public User setBankType(Integer bankType) {
    277. this.bankType = bankType;
    278. return this;
    279. }
    280. /**
    281. * 获取 是否支持授信 字段:user.support_credit
    282. *
    283. * @return user.support_credit, 是否支持授信
    284. */
    285. public Integer getSupportCredit() {
    286. return supportCredit;
    287. }
    288. /**
    289. * 设置 是否支持授信 字段:user.support_credit
    290. *
    291. * @param supportCredit the value for user.support_credit, 是否支持授信
    292. */
    293. public void setSupportCredit(Integer supportCredit) {
    294. this.supportCredit = supportCredit;
    295. }
    296. public Integer getIsAuth() {
    297. return isAuth;
    298. }
    299. public void setIsAuth(Integer isAuth) {
    300. this.isAuth = isAuth;
    301. }
    302. /**
    303. * 获取 创建时间 字段:user.created_date
    304. *
    305. * @return user.created_date, 创建时间
    306. */
    307. public Date getCreatedDate() {
    308. return createdDate;
    309. }
    310. /**
    311. * 设置 创建时间 字段:user.created_date
    312. *
    313. * @param createdDate the value for user.created_date, 创建时间
    314. */
    315. public void setCreatedDate(Date createdDate) {
    316. this.createdDate = createdDate;
    317. }
    318. /**
    319. * 获取 修改时间 字段:user.modified_date
    320. *
    321. * @return user.modified_date, 修改时间
    322. */
    323. public Date getModifiedDate() {
    324. return modifiedDate;
    325. }
    326. /**
    327. * 设置 修改时间 字段:user.modified_date
    328. *
    329. * @param modifiedDate the value for user.modified_date, 修改时间
    330. */
    331. public void setModifiedDate(Date modifiedDate) {
    332. this.modifiedDate = modifiedDate;
    333. }
    334. public String getContactCardType() {
    335. return contactCardType;
    336. }
    337. public void setContactCardType(String contactCardType) {
    338. this.contactCardType = contactCardType;
    339. }
    340. public String getContactCardNo() {
    341. return contactCardNo;
    342. }
    343. public void setContactCardNo(String contactCardNo) {
    344. this.contactCardNo = contactCardNo;
    345. }
    346. public String getContactFaceUrl() {
    347. return contactFaceUrl;
    348. }
    349. public void setContactFaceUrl(String contactFaceUrl) {
    350. this.contactFaceUrl = contactFaceUrl;
    351. }
    352. public String getContactConUrl() {
    353. return contactConUrl;
    354. }
    355. public void setContactConUrl(String contactConUrl) {
    356. this.contactConUrl = contactConUrl;
    357. }
    358. public String getContactUrl() {
    359. return contactUrl;
    360. }
    361. public void setContactUrl(String contactUrl) {
    362. this.contactUrl = contactUrl;
    363. }
    364. public String getCompanyMold() {
    365. return companyMold;
    366. }
    367. public void setCompanyMold(String companyMold) {
    368. this.companyMold = companyMold;
    369. }
    370. public String getCompanyUrl() {
    371. return companyUrl;
    372. }
    373. public void setCompanyUrl(String companyUrl) {
    374. this.companyUrl = companyUrl;
    375. }
    376. public String getMailingAddress() {
    377. return mailingAddress;
    378. }
    379. public void setMailingAddress(String mailingAddress) {
    380. this.mailingAddress = mailingAddress;
    381. }
    382. public Integer getAcceptProtocol() {
    383. return acceptProtocol;
    384. }
    385. public String getRole() {
    386. return role;
    387. }
    388. public void setRole(String role) {
    389. this.role = role;
    390. }
    391. public User setAcceptProtocol(Integer acceptProtocol) {
    392. this.acceptProtocol = acceptProtocol;
    393. return this;
    394. }
    395. public Date getStartTime() {
    396. return startTime;
    397. }
    398. public User setStartTime(Date startTime) {
    399. this.startTime = startTime;
    400. return this;
    401. }
    402. public Integer getChannel() {
    403. return channel;
    404. }
    405. public void setChannel(Integer channel) {
    406. this.channel = channel;
    407. }
    408. public String getCompanyUserId() {
    409. return companyUserId;
    410. }
    411. public void setCompanyUserId(String companyUserId) {
    412. this.companyUserId = companyUserId;
    413. }
    414. public Integer getLdeleteFlag() {
    415. return ldeleteFlag;
    416. }
    417. public User setLdeleteFlag(Integer ldeleteFlag) {
    418. this.ldeleteFlag = ldeleteFlag;
    419. return this;
    420. }
    421. }

    3.2、编写操作语句

    在resources目录下,新建mybatis文件夹,新建表名.xml文件

    1. "1.0" encoding="UTF-8"?>
    2. "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. "com.xx.mapper.UserMapper">
    4. "BaseResultMap" type="com.xx.User">
    5. "id" jdbcType="BIGINT" property="id"/>
    6. "merchant_no" jdbcType="VARCHAR" property="merchantNo"/>
    7. "company_user_id" jdbcType="VARCHAR" property="companyUserId"/>
    8. "registration_no" jdbcType="VARCHAR" property="registrationNo"/>
    9. "organization_code" jdbcType="VARCHAR" property="organizationCode"/>
    10. "company_uscc" jdbcType="VARCHAR" property="companyUscc"/>
    11. "company_scope" jdbcType="VARCHAR" property="companyScope"/>
    12. "company_name" jdbcType="VARCHAR" property="companyName"/>
    13. "company_type" jdbcType="TINYINT" property="companyType"/>
    14. "role" jdbcType="VARCHAR" property="role"/>
    15. "company_mold" jdbcType="VARCHAR" property="companyMold"/>
    16. "company_url" jdbcType="VARCHAR" property="companyUrl"/>
    17. "province_name" jdbcType="VARCHAR" property="provinceName"/>
    18. "city_name" jdbcType="VARCHAR" property="cityName"/>
    19. "credit_score" jdbcType="DECIMAL" property="creditScore"/>
    20. "address" jdbcType="VARCHAR" property="address"/>
    21. "contact" jdbcType="VARCHAR" property="contact"/>
    22. "contact_tel" jdbcType="VARCHAR" property="contactTel"/>
    23. "contact_card_type" jdbcType="VARCHAR" property="contactCardType"/>
    24. "contact_card_no" jdbcType="VARCHAR" property="contactCardNo"/>
    25. "contact_face_url" jdbcType="VARCHAR" property="contactFaceUrl"/>
    26. "contact_con_url" jdbcType="VARCHAR" property="contactConUrl"/>
    27. "contact_url" jdbcType="VARCHAR" property="contactUrl"/>
    28. "crc_code" jdbcType="VARCHAR" property="crcCode"/>
    29. "bank_type" jdbcType="INTEGER" property="bankType"/>
    30. "support_credit" jdbcType="TINYINT" property="supportCredit"/>
    31. "is_auth" jdbcType="TINYINT" property="isAuth"/>
    32. "mailing_address" jdbcType="VARCHAR" property="mailingAddress"/>
    33. "accept_protocol" jdbcType="TINYINT" property="acceptProtocol"/>
    34. "start_time" jdbcType="TIMESTAMP" property="startTime"/>
    35. "created_date" jdbcType="TIMESTAMP" property="createdDate"/>
    36. "modified_date" jdbcType="TIMESTAMP" property="modifiedDate"/>
    37. "ldelete_flag" jdbcType="TINYINT" property="ldeleteFlag"/>
    38. "Base_Column_List">
    39. id, merchant_no, company_user_id, registration_no, company_name, company_type,role, province_name, city_name,
    40. address, contact, contact_tel, crc_code, bank_type, support_credit, is_auth, created_date,
    41. modified_date, company_mold, company_url,contact_card_type, contact_card_no,contact_face_url,
    42. contact_con_url,contact_url, organization_code,
    43. company_uscc,company_scope,mailing_address,accept_protocol,start_time,credit_score, ldelete_flag

    3.3、定义Mapper接口

    1. package xx.mapper;
    2. import com.xx.User;
    3. import org.apache.ibatis.annotations.Mapper;
    4. import org.apache.ibatis.annotations.Param;
    5. import java.util.List;
    6. @Mapper
    7. public interface UserMapper {
    8. /**
    9. * 根据商户号查询用户信息
    10. * @param merchantNo 商户号
    11. * @return 商户信息
    12. */
    13. User findByMerchantNo(String merchantNo);
    14. }

     此处的接口名应与xml文件中select查询语句中的id一致。

    3.4、测试

    使用单元测试框架进行测试

    1. @Autowired
    2. UserMapper userMapper;
    3. @Test
    4. void test(){
    5. userMapper.findByMerchantNo();
    6. }

    4、常见问题

    4.1、spring Boot中mybatis是怎样自动获取DataSource的

    在Spring Boot中,MyBatis的整合通常会依赖于Spring Boot的自动配置和注解驱动。MyBatis在Spring Boot中自动获取DataSource的过程主要涉及以下几个关键点:

    依赖配置:pom.xml(如果是Maven项目)中引入Spring Boot Starter和MyBatis的相关依赖。例如:

    1. org.mybatis.spring.boot
    2. mybatis-spring-boot-starter
    3. 2.2.0
    4. com.h2database
    5. h2
    6. runtime

    数据源配置:application.propertiesapplication.yml中配置数据源信息,Spring Boot会根据这些配置自动创建DataSource Bean。例如:

    1. spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
    2. spring.datasource.username=myuser
    3. spring.datasource.password=mypassword
    4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

    MyBatis配置: Spring Boot提供了自动配置,会根据依赖和配置自动创建SqlSessionFactorySqlSessionTemplate。你可以在application.propertiesapplication.yml中配置MyBatis相关属性,例如:

    mybatis.mapper-locations=classpath:/mapper/*.xml
    

    这里指定了MyBatis的Mapper文件所在的位置。

    使用注解: 在MyBatis的Mapper接口上使用@Mapper注解,或者在Spring Boot的主应用程序类上使用@MapperScan注解扫描Mapper接口所在的包。

    1. // 在主应用程序类上使用@MapperScan
    2. @SpringBootApplication
    3. @MapperScan("com.example.mapper")
    4. public class MyApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(MyApplication.class, args);
    7. }
    8. }

    或者在Mapper接口上使用@Mapper注解:

    1. @Mapper
    2. public interface UserMapper {
    3. // ...
    4. }

    总的来说,Spring Boot会根据约定和配置自动创建数据源,并将其注入到MyBatis中,使得整合过程非常便捷。只需配置相关属性,使用注解标注Mapper接口,Spring Boot就能完成自动化的MyBatis整合

  • 相关阅读:
    华为数通方向HCIP-DataCom H12-821题库(单选题:221-240)
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    接口测试工具Postman的基本使用
    Python open with as---文件处理
    A - Til the Cows Come Home
    数字时代 低代码赋能新零售系统
    26 WEB漏洞-XSS跨站之订单及Shell箱子反杀记
    线程的6种状态
    小程序源码:王者荣耀吃鸡气泡等等头像框DIY在线生成N种风格-多玩法安装简单
    【字符串】后缀数组
  • 原文地址:https://blog.csdn.net/weixin_43447989/article/details/133715487