MyBaits运行就是简化包装JDBC的过程
通过上图我们看出MyBatis免除了几乎所有的JDBC代码,以及设置参数和获得结果集工作
MyBatis通过数据库连接的xml + 专门写sql语句的xml + sqlSession语句 将JDBC代码进行了拆解 完成了JDBC的全过程
写MyBatis主要分为以下几个步骤
- 创建user表
- 创建模块,导入坐标
- 编写MyBatis核心文件 -- > 替代连接信息 解决硬编码问题
- 编写SQL映射文件 -- > 同一管理sql语句,解决硬代码问题
- 编码 5.1定义pojo类 5.2创建mapper接口 5.3加载核心配置文件,获取SqlSessionFactory对象 5.4获取SqlSession对象,执行SQL语句 5.5释放资源
项目结构
1.创建user表
create database mybatis
use mybatis
create table tb_user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
gender char(1),
addr varchar(30)
)
insert into tb_user values(1,'zhangsan','001','男','北京');
insert into tb_user values(2,'lisi','002','男','上海');
insert into tb_user values(3,'wangwu','003','男','武汉');
2.创建模块,导入坐标
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.it</groupId>
<artifactId>ssm-mybaits</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>mybaits-base-quick-01</module>
<module>mybatis-demo</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- Mysql连接依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.3</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version> <!-- 使用最新版本 -->
</dependency>
</dependencies>
</project>
3.编写MyBatis核心文件 -- > 替代连接信息 解决硬编码问题
mybatis-config.xml
(连接数据库 加载sql映射文件)
在其中environments属性中可以加入多个environment标签 即添加多个数据库 通过environments后面的default属性可以更换数据库
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库的连接信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载sql映射文件-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
4. 编写SQL映射文件 -- > 同一管理sql语句,解决硬代码问题
UserMapper.xml(映射文件 用来写sql语句)
<?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">
<!--
namespace:名称空间 像包一样做名称区分
-->
<mapper namespace="com.it.mapper.UserMapper">
<select id="selectAll" resultType="com.it.pojo.User">
select *
from tb_user;
</select>
</mapper>
其中resultType="com.it.pojo.User"
表示查询结果(即从 tb_user
表中选取的所有列)应该被映射到 com.it.pojo.User
这个Java类的实例上。
MyBatis会根据查询结果集中的列名和 User
类中的属性名进行自动映射。
如果列名和属性名完全匹配(不区分大小写),那么MyBatis会自动将列的值赋给对应的属性。
而namespace,映射文件中的namespace是用于绑定Dao接口的,即面向接口编程。
当你的namespace绑定接口后,你可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句(看5.2.创建mapper接口)
5.编码
5.1定义pojo类
User.java
package com.it.pojo;
//alt + 鼠标左键 整列编辑
public class User {
private Integer id;
private String username;
private String password;
private String gender;
private String addr;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
5.2创建mapper接口
你可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句(看5.2.创建mapper接口)
UserMapper.java
package com.it.mapper;
import com.it.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> selectAll();
}
sql映射文件中sql语句的id为接口类方法名,并保持参数类型和返回值(resultType)一致.
在本例中resultType 返回值为User 本应写成 User selectAll(); 但 User selectAll();只返回一个值,实际上要返回多个值,所以加上List --> List<User> selectAll();
5.3-5.5
加载核心配置文件,获取SqlSessionFactory对象
获取SqlSession对象,执行SQL语句
释放资源
MyBatisDemo.java
package com.it;
import com.it.mapper.UserMapper;
import com.it.pojo.User;
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;
import java.util.List;
public class MyBatisDemo {
public static void main(String[] args) throws IOException {
//1.加载mybatist核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();
System.out.println(users);
//4.释放资源
sqlSession.close();
}
}
其他代码资源
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.it" level="debug" additivity="false">
<appender-ref ref="console" />
</logger>
</configuration>
由以上案例可知 MyBatis完成需要三步
编写接口方法==>编写sql==>执行方法
在编写接口方法之前 要进行分析 1.当前功能需要什么参数2.当前功能返回什么结果