mybatis优势:
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
本章仅供参考使用,idea使用中文汉化插件,并仅运用idea对数据库进行增删改查;
目录
前言
本文依据官方文档查阅理解mybatis,详情请查看官方文档:
mybatis – MyBatis 3 | 简介https://mybatis.org/mybatis-3/zh/index.html
MyBatis是什么?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1、创建项目
1.1、创建一个maven项目
maven的作用是:
1、在文件中添加相应的配置,maven就会自动的下载相应的jar包;
2、下载依赖,只要配置的jar包所依赖的其他jar包都会被它自动下载下来;
3、可以直接通过它打包war或者jar项目。
关于maven项目内部的绑定问题请直接上网搜,否则无法丝滑使用,请引起重视!其实也是因为我懒(小声叭叭)文件配置参考百度即可:maven配置setting文件-百度经验 (baidu.com)
1.2、创建子Maven项目
创建子maven项目是为了以后的代码更加简洁,并且可以不用频繁写依赖文件;
最终效果如图:
2、MySQL数据库的创建
2.1、创建数据库
有建数据库软件的请自个使用建数据库的软件,没有就用DOS语句,请确保下载了MySQL!
有关于数据库软件的用查询插入:
CREATE DATABASE mybatis;
USE mybatis;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(0) 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 (1, '小明', '521');
INSERT INTO `user` VALUES (2, '小红', '1314');
INSERT INTO `user` VALUES (3, '小军', '99');SET FOREIGN_KEY_CHECKS = 1;
2.2、使用idea链接数据库
为了方便查询,在idea中查看内部数据;
最终的样子:
3、MyBatis的环境布局
注意:各位谨记在编写下列xml文件代码时,不可以写中文注释,我写注释是为了方便大家查看,或者是编码方式为utf8!
3.1、MyBatis项目的总体布局
虽然不是很规范,但我还是以简洁为主;
3.2、MyBatis的依赖创建
很多人在想,为什么需要两个pom.xml呢?这也是为了后续代码的方便,他有一个好处就是不必重复编写pom.xml文件,内部的maven项目文件是继承最外层的maven父类文件的(也就是继承你父亲留给你的财富,都学到这了还不懂继承关系吗哈哈哈哈!)
内部的依赖分别为mybatis,Junit,sql,目前使用的就这么多,具体版本号所附带的功能或许会有所差异,不过大致都相同,pom.xml内部依赖代码块如下:
<?xml version="1.0" encoding="UTF8"?>
<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>org.example</groupId>
<artifactId>mybatis</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>the-first-mybatis</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF8</project.build.sourceEncoding>
</properties>
<!--创建三种依赖mybatis,Junit,mysql-->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
<!--在build中配置resuorces,来防止我们的资源导出失败-->
<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>false</filtering>
</resource>
</resources>
</build>
</project>
3.3、MyBatis与数据库的接口
不连接数据库你拿什么去实现代码,你都不知道,电脑知道吗?
所以我们要在resources中创建mybatis与mysql的接口,并且尽量使用官方文档使用的名称mybatis-config.xml:
<?xml version="1.0" encoding="UTF8" ?>
<!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=false&characterEncoding=UTF8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper.xml"/>
</mappers>
</configuration>
注意:mappers映射器必须写上,资源映射器是参与资源处理过程的Grails的Artefact,如:修改、移动、更名压缩以及设置缓存等,在这里的作用是注册绑定我们的Mapper文件,不使用就会报错!
3.4、编写utils中的MybatisUtils文件
package 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;
//从 SqlSessionFactory 中获取 SqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//SqlSession完全包含了面向对数据库执行sql命令所需的所有方法
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
4、MyBatis的增删改查
4.1、创建实体类
创建实体类可以使用插件也可以自行生成,写好类之后可以使用快捷键Alt+Insert键生成构造函数,getter ,setting等代码:
package entity;
import java.io.Serializable;
/**
* (User)实体类
*
* @author makejava
* @since 2022-05-09 09:13:33
*/
public class User implements Serializable {
private static final long serialVersionUID = 654674671703060350L;
private Integer id;
private String name;
private String pwd;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
public User(Integer id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
}
4.2、创建UserDao,以存放变量
package dao;
import entity.User;
import java.util.List;
import java.util.Map;
public interface UserDao {
List<User> getAllUsers();
int updateUser(User user);
int addUser(User user);
int deleteUser(int id);
User getOneUser(Map<String, Object> map);
List<User> getUsersByNameLike(String name);
}
4.3、编写mapper.xml文件
mapper.xml文件我觉得放在其他文件之中不如和mybatis-config.xml文件之中简单粗暴
这里存放的是SQL语句,针对数据的各种查询,可以按需求查找,就不一一列举了。
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace指定你要实现的mapper接口全名 -->
<mapper namespace="dao.UserDao">
<!--标签名是操作方式,id与接口中方法名一致 resultType指定返回值类型的全名-->
<select id="getAllUsers" resultType="entity.User">
<!--标签内写sql语句-->
select * from user
</select>
<update id="updateUser" parameterType="entity.User">
<!--用#{}传入参数,实体类的属性可以直接用属性名调用,方法参数可以直接用参数名-->
update user set name=#{name},pwd=#{pwd} where id=#{id}
</update>
<insert id="addUser" parameterType="entity.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
<select id="getOneUser" parameterType="map" resultType="entity.User">
select * from user where id=#{id}
</select>
<select id="getUsersByNameLike" parameterType="String" resultType="entity.User">
select * from user where name like #{name}
</select>
</mapper>
5、测试
在最后的test文件中创建UserDaoTest文件用于测试,测试文件一般与其他代码块分开用于分区处理,不至于一团糟。
如果你复制代码时发现报错了,那就需要你加载@Test这个注解了,为什么用注解?我:?,注解不香么?(滑稽)你:真香!
import dao.UserDao;
import entity.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import utils.MybatisUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UserDaoTest {
@Test
public void testGetAllUser() {
final SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> users = userDao.getAllUsers();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void testAddUser() {
final SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
userDao.addUser(new User(4, "张三", "9527"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void testUpdateUser() {
final SqlSession sqlSession = MybatisUtils.getSqlSession();
final UserDao userDao = sqlSession.getMapper(UserDao.class);
userDao.updateUser(new User(4, "李四", "007"));
//增删改需要提交事务
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDelUser(){
final SqlSession sqlSession = MybatisUtils.getSqlSession();
final UserDao userDao = sqlSession.getMapper(UserDao.class);
userDao.deleteUser(4);
//增删改需要提交事务
sqlSession.commit();
sqlSession.close();
}
@Test
public void testGetOneUser(){
final SqlSession sqlSession = MybatisUtils.getSqlSession();
final UserDao userDao = sqlSession.getMapper(UserDao.class);
Map<String, Object> map = new HashMap<>();
map.put("id", 2);
System.out.println(userDao.getOneUser(map));
sqlSession.close();
}
@Test
public void testGetUsersByNameLike(){
final SqlSession sqlSession = MybatisUtils.getSqlSession();
final UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> users = userDao.getUsersByNameLike("%明%");
for (User user : users)
System.out.println(user);
sqlSession.close();
}
}
运行结果:
总结
总结什么??都看到这里了,不给个关注再走么?嘿嘿!