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,且没有更改默认的配置的话,那么下面的 driverurl 属性可以直接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&amp;useUnicode=true&amp;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&amp;useUnicode=true&amp;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中 cleancompile 一下)

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
...
posted @ 2021-08-22 21:29  山上下了雪-bky  阅读(110)  评论(0编辑  收藏  举报