MyBatis是什么?
mybatis是一个集成了JDBC的持久层框架。
简化我们之前繁琐的JDBC操作。
1、创建Maven项目
1.1pom.xml文件中导入MyBatis,junit,mysql包
<?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.yiyu</groupId>
<artifactId>MyBatisLogItem</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
</dependencies>
<build>
<!-- 资源目录 -->
<resources>
<resource>
<!-- 设定主资源目录 -->
<directory>src/main/java</directory>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型 -->
<includes>
<include>**/*.xml</include>
</includes>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)-->
<excludes>
<exclude>**/*.yaml</exclude>
</excludes>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
junit:是为了我们再测试时方便写在一个类中
mybatis:我们学习mybatis当然要导入myatis包
mysql:因为我们的mybatis是一个集成了JDBC的框架,所以要涉及到数据库
2、创建数据库表,mysql版本为8
use master
create database mybatis
use mybatis
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int NOT NULL,
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'NULL',
`pwd` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'NULL',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `user` VALUES (0, '张九日', '32123');
INSERT INTO `user` VALUES (2, '李四', '123456');
INSERT INTO `user` VALUES (3, '张三', '123456');
INSERT INTO `user` VALUES (4, '赵久', '123456');
INSERT INTO `user` VALUES (6, '呓语', '123456');
3、创建实体类[User]
package entity;
public class User {
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
int id;
String name;
String pwd;
public int getId() {
return id;
}
public void setId(int 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 + '\'' +
'}';
}
}
4、创建接口UserDao
package dao;
import entity.User;
import java.util.List;
public interface UserDao {
List<User>getList();
int add();
}
我们用mybatis的话就不用去再写一个类去实现他了,因为mybatis都帮我们做了
再这里我们先写两个方法,后面在加
5、创建mybatis配置文件[mybatisConfig.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="mysql">
<environment id="mysql">
<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=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
- configuration标签配置连接池
- environments里面放的是数据源,defalut是使用哪个数据源,对应environment的id
- 比如我们有mysql,oracle,sqlserver,sqlite 等
- 现在我们默认使用的是mysql的数据源
environment数据源标签,id为唯一标识符然后配置url,驱动,账号,密码
我们每一个dao都会配有一个独立的xml映射文件
mappers标签里放的是我们的映射源
6、创建UserMapper.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="dao.UserDao">
<select id="getList" resultType="entity.User">
select * from user
</select>
</mapper>
一个映射文件映射一个dao
namespace:命名空间绑定我们的接口类
select标签
- id:对应接口中的方法名
- resultType:我们传统的JDBC操作是不是都会有一个返回值,我们这个属性就是配置我们结果集的返回类型,因为我们这里的返回类型是User,mybatis这里会把我们多个对象添加到集合中
- select标签中就是我们要写的sql语句
7、创建获取SqlSession对象方法
package util;
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;
// 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
public static SqlSession getSqlSession(){
{
try {
// 使用Mybatis获取sqlSessionFactory对象
String resource="mybatisConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
return sqlSessionFactory.openSession();
}
}
8、最后我们创建测试类来测试一下
import dao.UserDao;
import entity.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import util.MybatisUtils;
import java.util.List;
public class MyTest {
@Test
public void test1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> list = mapper.getList();
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
}
用我们写好的返回sqlSession的方法获取工厂对象带入我们的接口类就能直接运行接口中的方法
最后记得释放资源
9、现在我们要加使用别的方法就只要在接口中添加方法名,mapper配置文件中配置对应的sql标签就可以直接使用了,奉上代码
mapper配置文件
<?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="dao.UserDao">
<select id="getList" resultType="entity.User">
select * from user
</select>
<insert id="add" parameterType="entity.User">
insert into user
values (#{id},#{name},#{pwd});
</insert>
</mapper>
- 加了一个添加的方法
- parameterType:参数类型,我们调用添加方法的时候是不是要带一个对象过来才能添加,所以我们这里添加的对象是什么,带对应的类进去就行了
- sql语句values这里注意一下,之前我们数据库中有多少个列名我们就带多少个问号,我现在我们用#{对象里面的某个属性}代替要添加的每一个列名,我们现在数据库有3个字段就把每一个对应的填充进去就行了
UserDao接口中添加接口,我这里把最基本的增删改查都写进去了,后面我就省略这段
package dao;
import entity.User;
import java.util.List;
public interface UserDao {
List<User>getList();
int add(User user);
int delete(int id);
int update(User user);
}
10、测试添加方法
@Test
public void test2() {
// 获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 获取映射对象
UserDao mapper = sqlSession.getMapper(UserDao.class);
// 初始化一个用户对象
User user = new User(20, "天启", "123");
int add = mapper.add(user);
// 返回影响的行数
System.out.println(add);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
- 这里注意,因为我们原始的JDBC操作我们执行excuteQuery()或者excuteUpdate()操作之后我们的数据就添加成功了,是因为我们的原始的JDBC帮我们自动提交了事务
- 在MyBatis中他是没有给我们自动提交事务的,所以我们要自己提交事务,不然你们会发现你们的数据库并没有多出一条数据
- 这里就有人问了,为什么做查询语句的时候不用提交事务,解:百度
mapper配置文件增加delete方法以及update方法
<delete id="delete" parameterType="int" >
delete
from user
where id=#{id};
</delete>
<update id="update" parameterType="entity.User">
update user
set name = #{name},pwd=#{pwd}
where id=#{id};
</update>
这里我们就不多解释了,举一反三,没看懂的从头看一遍
11、测试删除和修改方法
@Test
public void test3() {
// 获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 获取映射对象
UserDao mapper = sqlSession.getMapper(UserDao.class);
int delete = mapper.delete(20);
// 返回影响的行数
System.out.println(delete);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
@Test
public void test4() {
// 获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 获取映射对象
UserDao mapper = sqlSession.getMapper(UserDao.class);
// 初始化一个用户对象
User user = new User(2, "王九人", "987654321");
int update = mapper.update(user);
// 返回影响的行数
System.out.println(update);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
12、至此结束。当然这是最简单到mybatis操作。
附上本章学习MyBatis项目
3 条评论
思路清晰,简单易懂,感谢作者大大
学费了
学到了