MyBatis 练习:实现CRUD操作


一、需求

使用MyBatis实现在MySql数据库中的CRUD操作,使用Junit测试并在控制台输出操作结果

二、分析

技术选型:MySql+Java+Maven+Mybatis+Junit

三、实现步骤

1、在idea中创建项目过程

打开mysql数据库,新建一个数据库,并添加一个表,增加两条数据:

-- 如果不存咋mybatis_db数据库,则创建
create database if not exists mybatis_db;
-- 使用该数据库
use mybatis_db;
-- 创建user表
create TABLE user(
	id int primary key auto_increment,	-- 主键id自增长
	name varchar(32) not null,	-- 姓名字段,非空
	pwd varchar(32) not null, 	-- 密码字段,非空
);
-- 给user表添加两条数据
insert into mybatis_db.user values
(null,'张三','123456'),
(null,'李四','234567');

idea中新建一个Maven Project,不使用任何骨架

pom.xml中注入MySql驱动+MyBatis+Junit依赖:

    <dependencies>
        <!-- mysql  -->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <!--MyBatis-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <!--Junit-->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

在该工程中新建一个模块(MoudleMyBatis-01),该模块也为不使用骨架的Maven项目,新建的模块可以直接用父工程的pom.xml导入的依赖
在这里插入图片描述
MyBatis-01src目录下的resources目录下新建一个mybatis-config.xml配置文件,该文件中设置mysql驱动url和连接数据库的usernamepassword

<?xml version="1.0" encoding="GBK" ?>
<!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_DB?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

</configuration>

src\main下新建包:数据库实体类包com.wzq.domain、MyBatis实现类包com.wzq.mapper、工具类包
com.wzq.utils,建好之后,目录结构应该是这样的:
在这里插入图片描述

2、编写实体类

com.wzq.domain下,新建一个类User,该类为user表对应的实体类,所有变量均与表中字段保持一致,并添加Getter and Setter、有参的无参的构造方法,重新toString方法:

package com.wzq.domain;

public class User {
    
    
    private Integer id;
    private String name;
    private String pwd;
    
    public User() {
    
    }
    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;
    }

    @Override
    public String toString() {
    
    
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

3、编写 MyBatis 工具类

com.wzq.utils包下,新建类MyBatisUtils,在该类中加载配置文件,并获取SqlSession对象:

package com.wzq.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 = null;

    static {
    
    
        try {
    
    
            String resource = "mybatis-config.xml";
            InputStream inputStream  = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession(){
    
    
        return sqlSessionFactory.openSession();
    }
}

4、实现CRUD操作

com.wzq.mapper中,新建一个接口UserMapper,该接口定义了操作user表的方法

package com.wzq.mapper;

import com.wzq.domain.User;

import java.util.List;

public interface UserMapper {
    
    
}

新建一个UserMapper.xml文件,该文件中编写sqlnamespace指向UserMapper接口,要写全类名,并把encoding设置为GBK,否则无法在注释里加中文

<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wzq.mapper.UserMapper">

</mapper>

最后一步在mybatis-config.xml中添加mappers标签,指定资源路径为com/wzq/mapper/UserMapper.xml

    <mappers>
        <mapper resource="com/wzq/mapper/UserMapper.xml"/>
    </mappers>

1)查询所有用户

UserMapper接口中,定义额查询所有用户的方法:

List<User> findAll();

UserMapper.xml中写sql语句,指定返回类型为User,写全类名

    <select id="findAll" resultType="com.wzq.domain.User">
        select * from mybatis_db.user
    </select>

test/java下,创建包com.wzq.mapper.UserMapperTest测试类

获取SqlSession对象和mapper

    //抽取属性,获取SqlSession对象
    private SqlSession sqlSession = MyBatisUtils.getSqlSession();
    //抽取属性,获取mapper
    private UserMapper mapper = sqlSession.getMapper(UserMapper.class);

编写测试方法:

    //测试查询所有用户
    @Test
    public void findAllTest(){
    
    
        //2. 执行
        List<User> all = mapper.findAll();
        for (User user : all) {
    
    
            System.out.println(user);
        }
        //3. 关闭连接
        sqlSession.close();
    }

测试,输出结果:
在这里插入图片描述
没毛病

2)根据ID查询用户

同样的步骤,首先在UserMapper中,定义方法:

User findUserById(int id);

UserMapper.xml中写sql

    <select id="findUserById" resultType="com.wzq.domain.User" parameterType="int">
        select * from mybatis_db.user where id = #{id}
    </select>

UserMapperTest写测试方法:

    //测试根据ID查询用户
    @Test
    public void findUserByIdTest(){
    
    
        //2. 执行
        User user = mapper.findUserById(5);
        System.out.println(user);
        //3. 关闭连接
        sqlSession.close();
    }

输出结果:
在这里插入图片描述

3)插入、修改、删除用户

接下来就如法炮制了,首先在UserMapper接口中添加三个方法:

    //插入一个用户
    void addUser(User user);

    //修改用户
    void updateUser(User user);

    //删除用户
    void deleteUser(int id);

UserMapper.xml中写sql

    <!-- 插入一个用户 -->
    <insert id="addUser" parameterType="com.wzq.domain.User">
        insert into mybatis_db.user (id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>

    <!-- 修改用户 -->
    <update id="updateUser" parameterType="com.wzq.domain.User">
        update mybatis_db.user set name=#{name},pwd=#{pwd} where id=#{id} ;
    </update>

    <!-- 删除用户 -->
    <delete id="deleteUser" parameterType="int">
        delete from mybatis_db.user where id = #{id}
    </delete>

UserMapperTest中编写测试方法:

需要注意的是执行增、删、改需要提交事务!

    //增删改需要提交事务
    //插入一个用户
    @Test
    public void addUserTest(){
    
    
        User user = new User(null,"大王","1234215");
        mapper.addUser(user);
        //提交事务
        sqlSession.commit();
        findAllTest();
    }

    //修改用户
    @Test
    public void updateUserTest(){
    
    
        mapper.updateUser(new User(1,"王五","123456"));
        sqlSession.commit();
        sqlSession.close();
    }

    //删除用户
    @Test
    public void deleteUserTest(){
    
    
        mapper.deleteUser(2);
        sqlSession.commit();
        sqlSession.close();
    }

猜你喜欢

转载自blog.csdn.net/lesileqin/article/details/112982353