MyBatis笔记:Hello world(基础增删改查)
MyBatis的介绍就不多说了,感兴趣的可以去 MyBatis 3中文参考文档 查阅。因为是刚接触MyBatis,所以真的是从0开始记录这次的学习笔记。
1. 在IDEA上创建一个简单的maven项目
2. 配置maven
在IDEA上创建maven项目时,IDEA有一个自带的maven,但是通常我们都不用这个IDEA自带的maven,可以自己下载一个maven来使用,然后在IDEA中配置即可。(可以在 https://maven.apache.org/download.cgi 下载maven的压缩包,如 apache-maven-3.8.1-bin.zip
,然后将压缩包解压到任何一个不含中文的路径下即可)
然后在maven解压后的 conf/settings.xml
文件中的 profiles
节点下添加以下信息,用于指定项目使用的java版本(如果使用了自己下载的maven,但是没有配置在maven中配置java版本的话可能会报 “不支持的发行版本5”的错误)。
注: 修改settings.xml文件时最好先把原来的settings.xml文件先copy一份出来备份着。
<profile>
<id>development</id>
<activation>
<jdk>14</jdk>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
<maven.compiler.compilerVersion>14</maven.compiler.compilerVersion>
</properties>
</profile>
然后在IDEA中配置自己的maven。
3. 配置pom.xml
pom.xml是maven项目的核心配置文件,刚创建好maven项目后,我们需要配置一些依赖包和资源查找路径等信息,具体配置如下,直接在 project
节点下配置即可,配置好后右键项目 Maven > Reimport
即可,然后就可以在IDEA右侧 Maven
栏看到依赖包都已经下载好了(如果是第一次使用此maven,Reimport的时间可能会久一点,具体得看个人的网络情况)。
<!-- 配置需要依赖的包 -->
<dependencies>
<!-- 配置数据库驱动,我使用的是MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- MyBatis包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit包,用于测试代码 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 配置xml、properties等资源文件的查找路径,如果不配置的话,maven默认只会加载src/main/resources目录的文件 -->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
4. 配置数据库连接信息
在 src/main/resources
目录下创建一个xml文件mybatis_config.xml(这是mybatis的核心配置文件,名称由自己定),然后将数据库的连接信息配置进去。如果使用的是MySQL,且没有更改默认的配置的话,那么下面的 driver
和 url
属性可以直接copy来用,它们都是固定的。
<?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=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
5. 创建数据库和表
创建一个数据库 mybatis
和一张表 user
,创建的方式有很多,我这里使用的是在SQLyog软件里执行SQL的方式创建的。
CREATE DATABASE `mybatis`;
USE `mybatis`;
CREATE TABLE `user` (
`id` INT(20) NOT NULL PRIMARY KEY,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
6. 定义实体类
实体类对应于数据库中的一张表,类的属性则对应于数据库表的字段。创建一个包路径 com.crud.pojo
,然后在这个包下定义一个User实体类,代码如下。
package com.crud.pojo;
// 实体类,表示数据库中的一张表,属性表示表中的字段
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = 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 + '\'' +
'}';
}
}
7. 定义实体类对应的mapper接口
在 com.crud
路径下创建一个mapper包,在mapper包下创建一个UserMapper接口,接口中定义的方法就是你想对数据库进行的操作(增删改查)。
package com.crud.mapper;
import com.crud.pojo.User;
import java.util.List;
public interface UserMapper {
// C:创建(插入)一条user记录
int addUser(User user);
// R:获查询user表的所有信息
List<User> getUserList();
// R:根据id查询user信息
User getUserById(int id);
// U:更新(修改)一条user记录
int updateUser(User user);
// D:根据id删除一条user记录
int deleteUser(int id);
}
8. 配置增删改查操作对应的SQL
MyBatis中SQL是配置在了xml文件中的,所以需要新建一个和接口对应的xml文件,我这里就直接在mapper包下面新建一个和接口同名的UserMapper.xml文件,xml中SQL和其他配置信息如下,需要特别注意的是,这个xml需要在第4步中创建的mybatis_config.xml文件的 configuration
节点下进行配置。
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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/crud/mapper/UserMapper.xml" />
</mappers>
</configuration>
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">
<!-- namespace对应于UserMapper接口的路径 -->
<mapper namespace="com.crud.mapper.UserMapper">
<!-- 插入操作对应的就是insert标签,id对应于接口中的方法名, parameterType表示接口方法的参数类型,填写实体类的路径即可-->
<insert id="addUser" parameterType="com.crud.pojo.User">
<!-- 可以在SQL中使用#{}的形式直接引用实例的属性值 -->
insert into mybatis.user(id, name, pwd) value(#{id}, #{name}, #{pwd});
</insert>
<!-- 查询操作对应的就是select标签,id对应于接口中的方法名, resultType表示查询的返回值或返回集合中的数据类型,填写实体类的路径即可-->
<select id="getUserList" resultType="com.crud.pojo.User">
select * from mybatis.user;
</select>
<!-- parameterType表示接口方法的参数类型,id为int类型 -->
<select id="getUserById" parameterType="int" resultType="com.crud.pojo.User">
select * from mybatis.user where id=#{id};
</select>
<!-- 更新(修改)操作对应的就是update标签 -->
<update id="updateUser" parameterType="com.crud.pojo.User">
update mybatis.user set name=#{name}, pwd=#{pwd} where id=#{id};
</update>
<!-- 删除操作对应的就是update标签 -->
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id};
</delete>
</mapper>
9. 定义获取session的工具类。
因为每次执行SQL都需要用到session,所以把获取session的操作提取出来定义到一个工具类中。在 com.crud
下新建一个utils包,在包下新建一个MybatisUtils类。
package com.crud.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{
// mybatis_config.xml就是mybatis的核心配置文件,包含了数据库配置信息和mapper信息等,默认的查找路径就是src/main/resources
String resource = "mybatis_config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 获取sqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
// 返回一个session用于执行数据库相关操作
return sqlSessionFactory.openSession();
}
}
10. 使用mybatis进行增删改查操作
在 src/test/java
路径下新建包路径 com.crud.mapper
,在此包中新建一个UserMapperTest测试类,用于测试MyBatis的相关操作,直接点击侧边栏上的执行按钮即可。(每次修改代码后记得在IDEA的右侧maven中 clean
和 compile
一下)
package com.crud.mapper;
import com.crud.pojo.User;
import com.crud.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
// getMapper返回的就是一个UserMapper接口的实例
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 调用实例对应的方法时就会执行xml中配置的对应SQL
int res = mapper.addUser(new User(1, "zhangsan", "123456"));
// 增删改等操作的返回值是int类型,表示是否执行成功,大于0则表示执行成功了
if (res > 0) {
// 增删改等操作一定记得提交事务,否则此次操作是不会更新到数据库中的
sqlSession.commit();
System.out.println("插入成功");
}
// 最后一定记得close掉session
sqlSession.close();
}
@Test
public void getUserList() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 查询操作会把结果封装为java对象后再返回
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int res = mapper.updateUser(new User(1, "zhangsan666", "666666"));
if (res > 0) {
sqlSession.commit();
System.out.println("更新成功");
}
sqlSession.close();
}
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int res = mapper.deleteUser(1);
if (res > 0) {
sqlSession.commit();
System.out.println("删除成功");
}
sqlSession.close();
}
}
错误解决
如果运行时出现如下错误信息,这是因为编码导致的问题,直接把UserMapper.xml中所有注释都删掉就可以了。
java.lang.ExceptionInInitializerError
...
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in com/crud/mapper/UserMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 15; 1 字节的 UTF-8 序列的字节 1 无效。
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64)
at com.crud.utils.MybatisUtils.<clinit>(MybatisUtils.java:21)
... 23 more
...