Mybatis_01简介
什么是Mybatis
- MyBatis 是一款优秀的持久层框架。
- 它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
Mybatis优点
- 简单易学:没有任何第三方依赖,最简单的安装只需要两个jar文件+配置几个sql映射文件就可以了。
- 灵活:不会对应用程序或数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。
- 解除sql与代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
第一个Mybatis程序
- 搭建数据库环境
#建库
CREATE DATABASE `mybatis`;
USE `mybatis`;
#建表
CREATE TABLE `user`(
`id` INT(20) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
#插入测试数据
INSERT INTO `user`(`id`,`name`,`pwd`) VALUES(1,'九九','999999999'),(2,'许业炯','123456');
#查询验证上述操作
SELECT * FROM `user`;
- 创建maven项目,并导入相关依赖
- 在pom.xml中导入相关依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
- 配置解决静态资源过滤问题,否则后续测试会出错。
<!-- 在build中配置resources,来防止资源导出失败的问题。-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
- 在resources目录下编写Mybatis核心配置文件mybatis-config.xml
<?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.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?useSSl=true&
useUnicode=true&
characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/jiu/dao/userMapper.xml"/>
</mappers>
</configuration>
- 在utils包下编写mybatis工具类
package com.jiu.utils;
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;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resources = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resources);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}
}
- 在pojo包下编写数据库对应的实体类
- 注意字段名与数据库字段保持一致。
package com.jiu.pojo;
/**
* @CLassName : User
* @Description : TODO
* @Author : 九九
* @Date : 2021/7/6,20:07
**/
public class User {
private Long id;
private String name;
private String pwd;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
- 在dao包下编写Mapper接口类
package com.jiu.dao;
import com.jiu.pojo.User;
import java.util.List;
/**
* @InterfaceName : UserMapper
* @Description : TODO
* @Author : 九九
* @Date : 2021/7/6,20:09
**/
public interface UserMapper {
// 获取所有用户
List<User> getUsers();
}
- 在dao包下编写接口对应的Mapper.xml配置文件
- 注意namespace,应该与xml文件对应的接口类一致。
- select表示这是一个查询语句,id表示接口中对应的方法,resultType是返回值类型。
<?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="com.jiu.dao.UserMapper">
<select id="getUsers" resultType="com.jiu.pojo.User">
select * from mybatis.user;
</select>
</mapper>
- 测试
- 有两种方法可以获取结果,方法二看起来更简便。
package com.jiu.dao;
import com.jiu.pojo.User;
import com.jiu.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @CLassName : UserMapperTest
* @Description : TODO
* @Author : 九九
* @Date : 2021/7/6,20:14
**/
public class UserMapperTest {
@Test
public void testGetUsers(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
// System.out.println(sqlSession);
// 方法一
// List<User> users = sqlSession.selectList("com.jiu.dao.UserMapper.getUsers", User.class);
// for (User user : users) {
// System.out.println(user);
// 方法二
List<User> users = sqlSession.getMapper(UserMapper.class).getUsers();
for (User user : users) {
System.out.println(user);
}
}
}
测试结果如下: