基于XML配置的Mybatis的增删查改

发布于 2020-07-28  1004 次阅读


1.首先搭建mybatis的环境配置。
1.1建立数据库和本次测试用的表User然后插入User信息。

create database if not exists mybatisdemo;
create table if not exists user(id int(4) auto_increment primary key,name varchar(16) not null,password varchar(16) not null,age int(3) ,createtime datetime default now());
insert into user(name,password,age,createtime) values('A','A',32,now());
insert into user(name,password,age,createtime) values('B','B',53,now());
insert into user(name,password,age,createtime) values('C','C',87,now());

1.2创建一个maven工程
在这里插入图片描述
1.3从pom.xml中引入项目所需的依赖jar包

<?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>org.example</groupId>
    <artifactId>mybatisdemo2</artifactId>
    <version>1.0-SNAPSHOT</version>
     <dependencies>
<!--         引入JUnit测试依赖-->
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-api</artifactId>
             <version>5.7.0-M1</version>
             <scope>test</scope>
         </dependency>
<!--引入mybatis依赖-->
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.5.5</version>
         </dependency>
<!--         引入MySQL依赖-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>
</dependencies>

</project>

1.4在包entity中建立实体类User.java

package entity;

import java.io.Serializable;
import java.util.Date;

/**
 * Classname:User
 *
 * @description:用户类
 * @author: 陌意随影
 * @Date: 2020-07-24 09:49
 * @Version: 1.0
 **/
public class User implements Serializable {
    //用户ID主键
    private Integer id;
    //用户名
    private String name;
    //密码
    private  String password;
    //年龄
    private  Integer age;
    //创建日期
    private  Date createTime;

    public User() {
    }

    public User(Integer id, String name, String password, Integer age, Date createTime) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.age = age;
        this.createTime = createTime;
    }

    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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

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

1.5配置mybatis的主配置环境

<?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">
<!--mybatis的主配置文件-->
<configuration>
    <environments default="development">
        <environment id="development">
            <!-- 配置事务类型  -->
            <transactionManager type="JDBC"/>
            <!--   配置连接信息         -->
            <dataSource type="POOLED">
                <!--       配置加载MySQL的驱动         -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--      MySQL连接的数据库地址,笔者这里是在本地localhost上测试,并且数据库的名称为mybatisdemo     -->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=UTC"/>
                <!--      MySQL连接的用户名         -->
                <property name="username" value="root"/>
                <!--      MySQL的连接密码        -->
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!--   指定配置文件的的位置,映射文件指的是每个dao的位置-->
    <mappers>
        <!--  指定Userdao的位置-->

    </mappers>
</configuration>

1.6在dao包中创建持久层接口UserDao.java

package dao;

import entity.User;

import java.util.List;

/**
 * Classname:mybatisdemo
 * @description:User的dao接口
 * @author: 陌意随影
 * @Date: 2020-07-24 10:35
 */
public interface UserDao {



}

1.7配置UserDao接口的对应映射信息
1.7.1在资源根目录resources中创建一个dao包,然后在这个dao包中创建一个UserDao.xml配置文件。要确保目录结构和UserDao.java所在的目录结构一致。

<?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">
<!--指定UserDao接口的全限定类名-->
<mapper namespace="dao.UserDao">

</mapper>

1.7.2在mybatis-config.xml主配置文件中的mappers标签中声明UserDao的映射配置信息

 <!--  指定Userdao的位置-->
        <mapper resource="dao/UserDao.xml"></mapper>

1.7建立JUnit测试

package dao;

import entity.User;
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 org.junit.jupiter.api.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * Classname:UserDaoTest
 *
 * @description:测试Userdao
 * @author: 陌意随影
 * @Date: 2020-07-24 10:49
 * @Version: 1.0
 **/
public class UserDaoTest {
    @Test
    public void testGetUserAll(){
        try {
            //读取配置文件
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            //实例化SqlSessionFactoryBuilder
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
          //构建SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
           //产生一个SqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //利用SqlSession创建UserDAao的代理对象
            UserDao userDao = sqlSession.getMapper(UserDao.class);


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

到此,完整的环境框架已经搭建好了,其目录结构为:
在这里插入图片描述

2.实现向数据库中插入新的User功能。
2.1首先在UserDao中添加函数 public void saveUser(User user);

 /**
    * @Description :向数据库中插入新的用户保存
    * @Date 12:34 2020/7/28 0028
    * @Param * @param user :需要处入的用户
    * @return void
    **/
    public void saveUser(User user);

2.2在UserDao.xml的mapper标签内添加插入用户信息的sql语句

<!--指定UserDao接口的全限定类名-->
<mapper namespace="dao.UserDao">

<!--    配置插入User的SQL语句,
id对应UserDao的方法名
parameterType对应方法中的参数类型
-->
    <insert id="saveUser" parameterType="entity.User">
        insert into user(name,password,age,createTime) values(#{name},#{password},#{age},#{createTime});
    </insert>
</mapper>

注意参数符号:#{},比如#{id}这就告诉 MyBatis 创建一个预处理语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:
// 近似的 JDBC 代码,非 MyBatis 代码…
String selectPerson = "SELECT * FROM PERSON WHERE id =?;
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
3.实现从数据库中删除User的功能
3.1首先在UserDao中添加函数 public void deleteUser(int id);

   /**
     * @Description :根据主键id从数据库中删除用户
     * @Date 12:58 2020/7/28 0028
     * @Param * @param id :User的主键id
     * @return void
     **/
  public void deleteUser(int id);

3.2在UserDao.xml的mapper标签内添加删除用户信息的sql语句

<!--指定UserDao接口的全限定类名-->
<mapper namespace="dao.UserDao">

<!--    配置插入User的SQL语句,
id对应UserDao的方法名 saveUser
parameterType对应方法中的参数类型
-->
    <insert id="saveUser" parameterType="entity.User">
        insert into user(name,password,age,createTime) values(#{name},#{password},#{age},#{createTime});
    </insert>
<!-- 配置删除User的sql语句
id对应UserDao的方法名 
parameterType对应方法中的参数类型
-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete  from user where id=#{id}
    </delete>
</mapper>

4.实现从数据库中更新User的功能
4.1首先在UserDao中添加函数 public void updateUser(User user);

 /**
   * @Description :更新用户信息
   * @Date 13:08 2020/7/28 0028
   * @Param * @param user :新的用户
   * @return void
   **/
  public  void updateUser(User user);

4.2在UserDao.xml的mapper标签内添加更新用户信息的sql语句

<!--指定UserDao接口的全限定类名-->
<mapper namespace="dao.UserDao">

<!--    配置插入User的SQL语句,
id对应UserDao的方法名 saveUser
parameterType对应方法中的参数类型
-->
    <insert id="saveUser" parameterType="entity.User">
        insert into user(name,password,age,createTime) values(#{name},#{password},#{age},#{createTime});
    </insert>
<!-- 配置删除User的sql语句
id对应UserDao的方法名 
parameterType对应方法中的参数类型
-->
    <delete id="deleteUser">
        delete  from user where id=#{id}
    </delete>
    <!--    配置更新用户的信息-->
    <update id="updateUser" parameterType="entity.User">
        update user set name=#{name},password=#{password},age=#{age},createTime=#{createTime} where id=#{id}
    </update>

</mapper>

5.实现从数据中修改User信息的 功能。
5.1首先在UserDao中添加函数 public User findUser(int id);

  /**
   * @Description :通过主键id查找用户
   * @Date 13:17 2020/7/28 0028
   * @Param * @param id :
   * @return entity.User
   **/
  public User findUser(int id);

5.2在UserDao.xml的mapper标签内添加查找用户信息的sql语句

<!--指定UserDao接口的全限定类名-->
<mapper namespace="dao.UserDao">
<!--    配置插入User的SQL语句,
id对应UserDao的方法名 saveUser
parameterType对应方法中的参数类型
-->
    <insert id="saveUser" parameterType="entity.User">
        insert into user(name,password,age,createTime) values(#{name},#{password},#{age},#{createTime});
    </insert>
<!-- 配置删除User的sql语句
id对应UserDao的方法名 
parameterType对应方法中的参数类型
-->
    <delete id="deleteUser">
        delete  from user where id=#{id}
    </delete>
    <!--    配置更新用户的信息-->
    <update id="updateUser" parameterType="entity.User">
        update  user set name=#{name},password=#{password},age=#{age},createTime=#{createTime} where id=#{id}
    </update>
      <!-- 配置查找用户的sql语句-->
    <select id="findUser" resultType="entity.User">
    select * from User where  id=#{id}
</mapper>

6.在测试类中添加每个方法的测试:

package dao;

import entity.User;
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 org.junit.jupiter.api.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * Classname:UserDaoTest
 *
 * @description:测试Userdao
 * @author: 陌意随影
 * @Date: 2020-07-24 10:49
 * @Version: 1.0
 **/
public class UserDaoTest {
    private  InputStream inputStream ;
    private SqlSession sqlSession ;
    private   UserDao userDao;
    @BeforeEach
    public  void init() throws IOException {
        //读取配置文件
       inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        //实例化SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        //产生一个SqlSession
        sqlSession = sqlSessionFactory.openSession();
        //利用SqlSession创建UserDAao的代理对象
        userDao = sqlSession.getMapper(UserDao.class);


    }
    @AfterEach
    public  void destroy() throws Exception {
        //提交数据库操作
        sqlSession.commit();
        //关闭数据库连接
        sqlSession.close();
        //关闭流
        inputStream.close();
    }
    @Test
    public void testSaveUser(){
        User user = new User();
        user.setAge(52);
        user.setCreateTime(new Date());
        user.setName("GG");
        user.setPassword("GG");
        userDao.saveUser(user);
    }
    @Test
    public  void testDeleteUser(){
        int id = 3;
        userDao.deleteUser(id);
    }
    @Test
    public void testUpdateUser(){
        User user = new User();
        user.setId(5);
        user.setAge(52);
        user.setCreateTime(new Date());
        user.setName("GG");
        user.setPassword("HHHHHHHHHH");
        userDao.updateUser(user);
    }
    @Test
    public void testFindUser(){

         int id =2;
        User user = userDao.findUser(id);
        System.out.println(user);
    }
}

6.1测试testSaveUser方法,运行截图:
在这里插入图片描述
在这里插入图片描述
6.2测试testDeleteUser方法,运行截图
在这里插入图片描述
在这里插入图片描述
6.3测试查找方法testFindUser,运行截图

在这里插入图片描述
6.4测试更新用户方法testUpdateUser,运行截图
在这里插入图片描述
在这里插入图片描述

7.本次的实验项目源代码已经上传到服务器,有需要的请自行下载,解压后导入Idea即可:http://moyisuiying.com/wp-content/uploads/2020/07/mybatisdemo2.rar


繁华落尽,雪花漫天飞舞。