2 MyBatis第一个程序

MyBatis第一个程序

思路流程:搭建环境—>导入MyBatis—>编写代码—>测试

该程序实现CRUD操作,项目完整结构图及常见问题在后文说明。

代码演示

1、 搭建实验所需数据库

CREATE DATABASE `mybatis`;

USE `mybatis`;
# 如果表格存在,则删除
DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `user`(`id`,`name`,`pwd`) values (1,'BG','123456'),(2,'张三','abcdef'),(3,'李四','987654'),(4,'王五','123444');

2、IDEA创建项目

image-20201126112906566

选择Maven项目,选择JDK版本,然后点击Next。

image-20201126113256584

设置项目名称,及GroupId(一般为公司域名),然后点击Finish,完成项目创建。

image-20201126113436936

完成项目创建后的结构图,删除掉src文件夹,将该目录作为父工程,此pom.xml为父工程所有,可供所有子模块使用。

image-20201126114811520

右键当前项目,创建新模块。

image-20201126114903827

输入子模块名称,点击Finish,即完成模块创建。

3、导入相关jar包

  • 在父工程的pom.xml文件中导入相关jar包,在Maven仓库中查找
    <dependencies>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>

        <!--用于测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

    </dependencies>

4、编写MyBatis核心配置文件

  • 查看帮助文档,即Mybatis官方文档

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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?Unicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>

    <!--编写玩Mapper接口及对应的XML配置文件后,需要在MyBatis核心配置文件中注册,以下两种格式都可以-->
    <mappers>
        <mapper class="com.bg.mapper.UserMapper"/>
	<!--<mapper resource="com/bg/mapper/UserMapper.xml"/>-->
    </mappers>

</configuration>

5、编写MyBatis工具类

  • 查看帮助文档

MyBatisTool.java

package com.bg.tools;

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 MyBatisTool {

    private static InputStream inputStream;
    private static SqlSessionFactory sqlSessionFactory;
    static{

        try {
            String resource = "mybatis-config.xml";
            // 加载MyBatis核心配置文件
            inputStream = Resources.getResourceAsStream(resource);
            // 通过输入流构建SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            // 关闭输入流
            if(inputStream == null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    // 获取SqlSession实例,用来操作数据库
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

}

6、创建实体类

User.java

package com.bg.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接口类

UserMapper.java

package com.bg.mapper;

import com.bg.pojo.User;

import java.util.List;

public interface UserMapper {

    // 查询表格中的所有用户
    List<User> getUserList();

    // 根据Id查询用户
    User getUserById(int userId);

    // 增加一个用户
    int addUser(User user);

    // 修改一个用户
    int updateUser(User user);

    // 删除一个用户
    int deleteUser(int userId);
}

8、编写Mapper.xml配置文件

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">
<!--绑定接口-->
<mapper namespace="com.bg.mapper.UserMapper">
    <!--绑定函数和返回对象类型-->
    <select id="getUserList" resultType="com.bg.pojo.User">
        SELECT * FROM user
    </select>

    <select id="getUserById" resultType="com.bg.pojo.User">
        SELECT * FROM user WHERE id = #{userId}
    </select>

    <!--返回类型为基本类型,可以省略-->
    <insert id="addUser" parameterType="com.bg.pojo.User">
        INSERT INTO user(id, name, pwd) VALUES (#{id}, #{name}, #{pwd})
    </insert>

    <update id="updateUser" parameterType="com.bg.pojo.User">
        UPDATE user SET name = #{name}, pwd = #{pwd} WHERE id = #{id}
    </update>

    <!--输入参数为基本数据类型,也可以省略不写-->
    <delete id="deleteUser" parameterType="int">
        DELETE FROM user WHERE id = #{userId};
    </delete>

</mapper>

9、编写测试类

  • Junit包测试

MyTest.java

import com.bg.mapper.UserMapper;
import com.bg.pojo.User;
import com.bg.tools.MyBatisTool;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class MyTest {

    // 使用junit进行测试,需要添加该注解
    @Test
    public void getUserList(){
        // 首先获得SqlSession对象
        SqlSession sqlSession = MyBatisTool.getSqlSession();
        // 通过SqlSession对象获取Mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 调用mapper中的函数,执行sql
        List<User> userList = mapper.getUserList();

        // 遍历结果集,并输出
        for (User user : userList) {
            System.out.println(user.toString());
        }

        // 使用完毕后,关闭SqlSession对象
        sqlSession.close();
    }

    @Test
    public void getUserById(){
        // 首先获得SqlSession对象
        SqlSession sqlSession = MyBatisTool.getSqlSession();
        // 通过SqlSession对象获取Mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 调用mapper中的函数,执行sql
        User user = mapper.getUserById(3);

        // 遍历结果,并输出
        System.out.println(user.toString());


        // 使用完毕后,关闭SqlSession对象
        sqlSession.close();
    }

    @Test
    public void addUser(){
        // 首先获得SqlSession对象
        SqlSession sqlSession = MyBatisTool.getSqlSession();
        // 通过SqlSession对象获取Mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 调用mapper中的函数,执行sql
        User user = new User(5, "赵六", "9527");

        int i = mapper.addUser(user);
        if(i == 1){
            System.out.println("插入数据成功");
            // 因为SqlSession默认关闭事务自动提交,因此插入数据成功后,我们需要手动提交事务,才能在数据库中完成插入
            sqlSession.commit();
        }else{
            System.out.println("插入数据失败");
        }

        // 使用完毕后,关闭SqlSession对象
        sqlSession.close();
    }

    @Test
    public void updateUser(){
        // 首先获得SqlSession对象
        SqlSession sqlSession = MyBatisTool.getSqlSession();
        // 通过SqlSession对象获取Mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 调用mapper中的函数,执行sql
        User user = new User(3, "张飞", "00222555");

        int i = mapper.updateUser(user);
        if(i == 1){
            System.out.println("更新数据成功");
            // 因为SqlSession默认关闭事务自动提交,因此更新数据成功后,我们需要手动提交事务,才能在数据库中完成插入
            sqlSession.commit();
        }else{
            System.out.println("更新数据失败");
        }

        // 使用完毕后,关闭SqlSession对象
        sqlSession.close();
    }

    @Test
    public void deleteUser(){
        // 首先获得SqlSession对象
        SqlSession sqlSession = MyBatisTool.getSqlSession();
        // 通过SqlSession对象获取Mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 调用mapper中的函数,执行sql

        int i = mapper.deleteUser(2);
        if(i == 1){
            System.out.println("删除数据成功");
            // 因为SqlSession默认关闭事务自动提交,因此删除数据成功后,我们需要手动提交事务,才能在数据库中完成插入
            sqlSession.commit();
        }else{
            System.out.println("删除数据失败");
        }

        // 使用完毕后,关闭SqlSession对象
        sqlSession.close();
    }
}

10、运行测试,成功查询数据

项目完整结构图

image-20201126152933310

image-20201126152951513

问题说明

Maven静态资源过滤问题

通常编译maven项目时,只能过滤resources下面的配置文件,当我们把配置文件写到java文件夹下面时,需要在pom.xml中,显示的开启资源过滤,使java文件夹下的配置文件能够被读取并编译。

    <!--在build中配置resource,来防止我们资源导出失败的问题,true代表允许过滤-->
    <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>true</filtering>
            </resource>
        </resources>
    </build>

配置文件中文注释问题

因为在配置文件中添加了中文注释,会导致乱码,故会报错。

### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。

为了解决该问题,需要在父类的pom.xml中配置项目编码。

  <properties>
        <project.build.sourceEncoding>UTF8</project.build.sourceEncoding>
  </properties>

在父类中pom.xml中添加的所有配置信息,在所有子模块中均生效。

posted @ 2020-11-26 17:41  Zzb01  阅读(89)  评论(0)    收藏  举报