1、简介
MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发。
MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github
官网:https://mybatis.org/mybatis-3
中文网:https://mybatis.org/mybatis-3/zh/index.html
介绍:
MyBatis是一款开源的持久层框架,用于Java应用程序,可以将Java对象映射到数据库中。
它允许用户使用简单的XML或注解来配置和映射原生类型、接口和Java POJO(Plain Old Java Objects)到数据库表,减少了几乎所有的JDBC代码和手写设置参数的工作,它提供了一种灵活的查询机制,支持动态SQL,允许在查询期间动态生成SQL,并将其映射到Java对象。
总的来说,MyBatis是一款非常有用的工具,可以简化数据库应用程序的开发,使Java开发人员能够专注于应用程序逻辑,而不必关注数据库和SQL语句细节。
1.1、持久层
负责将数据到保存到数据库的那一层代码。
以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。
JavaEE三层架构:表现层、业务层、持久层
1.2、框架
框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
2、JDBC->Mybais
JDBC缺点:
1.硬编码
1.1、注册驱动、获取连接:
JDBC的代码有很多字符串,而这些是连接数据库的四个基本信息,以后如果要将Mysql数据库换成其他的关系型数据库的话,这四个地方都需要修改,如果放在此处就意味着要修改我们的源代码。
1.2、SQL语句:如果表结构发生变化,SQL语句就要进行更改。这也不方便后期的维护。
2.操作繁琐:
2.1、手动设置参数
2.2、手动封装结果集
代码对查询到的数据进行封装,而这部分代码是没有什么技术含量,而且特别耗费时间
Mybatis优化:
- 硬编码可以配置到配置文件
- 操作繁琐的地方,Mybatis都可以自动完成
持久层框架使用占比:
3、使用Mybatis
3.1、步骤概述
- 创建数据库创建数据表
- 创建Mybatis项目
- 配置pom.xml
- 配置logback.xml
- 配置mybatis-config.xml
- 配置UserMapper.xml
- 创建pojo类User
- 创建MybatisDemo
3.2、步骤详述
下面是Mybatis详细使用步骤:
①开启数据库服务,创建数据库,创建表单
②创建Maven项目:Mybatis->项目结构如下:
③配置pom.xml,导入依赖
->所需依赖为:mybatis,mysql,junit,slf4j日志,logback
1. <?xml version="1.0" encoding="UTF-8"?> 2. <!--项目依赖为:mybatis,mysql,junit,slf4j日志,logback--> 3. <project xmlns="http://maven.apache.org/POM/4.0.0" 4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 6. <modelVersion>4.0.0</modelVersion> 7. 8. <groupId>org.example</groupId> 9. <artifactId>Mybatis</artifactId> 10. <version>1.0-SNAPSHOT</version> 11. 12. <properties> 13. <maven.compiler.source>17</maven.compiler.source> 14. <maven.compiler.target>17</maven.compiler.target> 15. </properties> 16. 17. <dependencies> 18. <dependency> 19. <groupId>org.mybatis</groupId> 20. <artifactId>mybatis</artifactId> 21. <version>3.5.5</version> 22. </dependency> 23. 24. <dependency> 25. <groupId>mysql</groupId> 26. <artifactId>mysql-connector-java</artifactId> 27. <version>5.1.48</version> 28. </dependency> 29. 30. <dependency> 31. <groupId>junit</groupId> 32. <artifactId>junit</artifactId> 33. <version>4.13.2</version> 34. <scope>test</scope> 35. </dependency> 36. 37. <dependency> 38. <groupId>org.slf4j</groupId> 39. <artifactId>slf4j-api</artifactId> 40. <version>1.7.16</version> 41. </dependency> 42. 43. <dependency> 44. <groupId>ch.qos.logback</groupId> 45. <artifactId>logback-classic</artifactId> 46. <version>1.2.3</version> 47. </dependency> 48. 49. <dependency> 50. <groupId>ch.qos.logback</groupId> 51. <artifactId>logback-core</artifactId> 52. <version>1.2.3</version> 53. </dependency> 54. </dependencies> 55. 56. </project>
④配置logback.xml
1. <?xml version="1.0" encoding="UTF-8"?> 2. <configuration> 3. <!-- 4. CONSOLE :表示当前的日志信息是可以输出到控制台的。 5. --> 6. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 7. <!--输出流对象 默认 System.out 改为 System.err--> 8. <target>System.out</target> 9. <encoder> 10. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 11. %msg:日志消息,%n是换行符--> 12. <!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>--> 13. <pattern> 14. %d{yyyy-MM-dd HH:mm:ss.SSS} [%level] %cyan([%thread]) %boldGreen(%logger{15}) : %msg %n 15. </pattern> 16. </encoder> 17. </appender> 18. 19. <!-- File是输出的方向通向文件的 --> 20. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 21. <encoder> 22. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 23. <charset>utf-8</charset> 24. </encoder> 25. <!--日志输出路径--> 26. <file>C:/code/itheima-data.log</file> 27. <!--指定日志文件拆分和压缩规则--> 28. <rollingPolicy 29. class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 30. <!--通过指定压缩文件名称,来确定分割文件方式--> 31. <fileNamePattern>C:/code/itheima-data2-%d{yyyy-MM-dd}.log%i.gz</fileNamePattern> 32. <!--文件拆分大小--> 33. <maxFileSize>1MB</maxFileSize> 34. </rollingPolicy> 35. </appender> 36. 37. <!-- 38. level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR | ALL 和 OFF 39. , 默认debug 40. <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。 41. --> 42. <root level="ALL"> 43. <!-- 注意:如果这里不配置关联打印位置,该位置将不会记录日志--> 44. <appender-ref ref="CONSOLE" /> 45. </root> 46. </configuration>
⑤配置Mybatis核心配置文件->mybatis-config.xml
功能:替换连接信息,解决硬编码问题。
1. <?xml version="1.0" encoding="utf-8" ?> 2. <!DOCTYPE configuration 3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4. "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5. <configuration> 6. <typeAliases> 7. <package name="com.xzl.pojo"/> 8. </typeAliases> 9. <!--environments:配置数据库连接环境信息。 10. 可以配置多个environment,通过default属性切换不同的environment--> 11. <environments default="development"> 12. <environment id="development"> 13. <transactionManager type="JDBC"></transactionManager> 14. <dataSource type="POOLED"> 15. <!--数据库连接信息--> 16. <property name="driver" value="com.mysql.jdbc.Driver"/> 17. <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/> 18. <property name="username" value="root"/> 19. <property name="password" value="xzlXZGK680"/> 20. </dataSource> 21. </environment> 22. 23. <environment id="test"> 24. <transactionManager type="JDBC"></transactionManager> 25. <dataSource type="POOLED"> 26. <!--数据库连接信息--> 27. <property name="driver" value="com.mysql.jdbc.Driver"/> 28. <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/> 29. <property name="username" value="root"/> 30. <property name="password" value="xzlXZGK680"/> 31. </dataSource> 32. </environment> 33. </environments> 34. 35. <mappers> 36. <!--加载sql映射文件--> 37. <!-- <mapper resource="com/xzl/pojo/UserMapper.xml"/>--> 38. <mapper resource="com.xzl.pojo/UserMapper.xml"></mapper> 39. </mappers> 40. </configuration>
⭐Mybatis连接数据库的方式:mybatis-config.xml文件中的<environment>标签,<environments default>标签可以切换不同的environment:
⑥配置SQL映射文件UserMapper.xml->方便统一管理SQL语句,解决硬编码问题
1. <?xml version="1.0" encoding="UTF-8" ?> 2. <!DOCTYPE mapper 3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5. 6. <!--</mapper>--> 7. <mapper namespace="com.xzl.pojo.User"> 8. <select id="selectAll" resultType="com.xzl.pojo.User"> 9. select * from tb_user; 10. </select> 11. </mapper>
namespace命名空间可随意编写,但编写正确的包和类的关系作为命名空间,则在源码中可以方便查看跳转:
⑦创建User类
1. package com.xzl.pojo; 2. 3. public class User { 4. private int id; 5. private String username; 6. private String password; 7. private String gender; 8. private String address; 9. 10. //省略getter和setter 11. 12. @Override 13. public String toString() { 14. //这里的password用PSD来代替,因为CSDN不让发,大家见谅 15. return "User{" + 16. "id=" + id + 17. ", username='" + username + '\'' + 18. ", PSD='" + password + '\'' + 19. ", gender='" + gender + '\'' + 20. ", address='" + address + '\'' + 21. '}'; 22. } 23. 24. public int getId() { 25. return id; 26. } 27. 28. public void setId(int id) { 29. this.id = id; 30. } 31. 32. public String getUsername() { 33. return username; 34. } 35. 36. public void setUsername(String username) { 37. this.username = username; 38. } 39. 40. public String getPassword() { 41. return password; 42. } 43. 44. public void setPassword(String password) { 45. this.password = password; 46. } 47. 48. public String getGender() { 49. return gender; 50. } 51. 52. public void setGender(String gender) { 53. this.gender = gender; 54. } 55. 56. public String getAddress() { 57. return address; 58. } 59. 60. public void setAddress(String address) { 61. this.address = address; 62. } 63. }