Mybatis框架之创建第一个项目(IDEA)

一、Mybatis简介

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

GitHub地址:https://github.com/mybatis/mybatis-3/releases
在这里插入图片描述

二、下载Mybatis框架支持包

GitHub地址:https://github.com/mybatis/mybatis-3/releases
在这里插入图片描述

三、创建第一个Mybatis项目

相关jar包下载地址:
地址一 https://pan.baidu.com/s/1w8lDco7wTZWBFdsvrTNopw 提取码: faxn
地址二 https://pan.baidu.com/s/1v96WBxYfEpOGu8cAn1zAYQ 提取码: hzba
地址三 https://pan.baidu.com/s/1Xd1Lp-GQyw7R9XQYhlXfrw 提取码: rc1e

1、创建一个普通Java项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、在项目根路径下新建lib文件夹

在这里插入图片描述
在这里插入图片描述

3、复制Mybatis框架支持包到lib文件夹下

在这里插入图片描述

4、复制mysql数据库驱动到lib文件夹

在这里插入图片描述

5、复制junit测试包到lib文件夹

在这里插入图片描述

6、将lib文件夹标记为Library

在这里插入图片描述
在这里插入图片描述

四、创建MySQL数据库

建库建表sql如下:

#创建mybatis_day_01数据库
CREATE DATABASE mybatis_day_01;
#选中mybatis_day_01数据库
use mybatis_day_01;
#创建user表
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
);

在这里插入图片描述

五、编写配置文件

1、在src目录下创建log4j日志配置文件log4j.properties

在这里插入图片描述

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

在这里插入图片描述

2、在src目录下创建Mybatis主配置文件SqlMapConfig.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>
    <!-- 配置mybatis的环境信息 -->
    <environments default="development">
        <environment id="development">
            <!-- 配置JDBC事务控制,由mybatis进行管理 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源,采用dbcp连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_day_01?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

在这里插入图片描述

六、测试

1、编写User实体类

package cn.hestyle.entity;

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

/**
 * description: User模型
 *
 * @author hestyle
 * @version 1.0
 * @className mybatis_day_01->User
 * @date 2020-01-25 10:58
 **/
public class User implements Serializable {
    private Integer id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;

    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                ", address='" + address + '\'' +
                '}';
    }
}

在这里插入图片描述

2、编写UserMapper接口(作用相当于IUserDao接口)

在这里插入图片描述

package cn.hestyle.mapper;

import cn.hestyle.entity.User;

import java.util.List;

/**
 * description:
 *
 * @author hestyle
 * @version 1.0
 * @className mybatis_day_01->UserMapper
 * @date 2020-01-25 18:58
 **/
public interface UserMapper {
    /**
     * 保存一个user对象
     * @param user 待保存的对象
     * @return 受影响的行数
     */
    public Integer save(User user);

    /**
     * 通过id删除一个user
     * @param id user id
     * @return 受影响的行数
     */
    public Integer deleteById(Integer id);

    /**
     * 更新一个User实体对象
     * @param user 待更新的对象
     * @return 受影响的行数
     */
    public Integer update(User user);

    /**
     * 通过id查找
     * @param id 用户id
     * @return User实体类对象
     */
    public User findUserById(Integer id);

    /**
     * 通过usernameKey关键字查找user表
     * @param usernameKey 用户名关键字
     * @return User list
     */
    public List<User> findUsersByUsernameKey(String usernameKey);

    /**
     * 查找user表所有记录
     * @return User list
     */
    public List<User> findAll();
}

2、编写UserMapper.xml映射文件(作用相当于UserDaoImpl实现类)

在这里插入图片描述

<?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:命名空间,它的作用就是对SQL进行分类化管理,可以理解为SQL隔离
	注意:使用mapper代理开发时,namespace有特殊且重要的作用
 -->
<mapper namespace="cn.hestyle.mapper.UserMapper">
	<!--
        [id]:statement的id,要求在命名空间内唯一
        keyProperty="id" useGeneratedKeys="true"用于设置自动增长标识(id字段自动增长)
        [parameterType]:入参的java类型
        [#{}]: 表示一个占位符?,比如#{username},将取出入口参数User.username
     -->
	<insert id="save" keyProperty="id" useGeneratedKeys="true" parameterType="cn.hestyle.entity.User">
		INSERT INTO user(
			username, birthday, sex, address
		) VALUES (
			#{username},#{birthday},#{sex},#{address}
		)
	</insert>

	<!--
		[id]:statement的id,要求在命名空间内唯一
		[parameterType]:入参的java类型
		#{id}表示获取入口参数中的id属性
    -->
	<delete id="deleteById" parameterType="java.lang.Integer">
		DELETE FROM user
		WHERE id = #{id}
	</delete>

	<!--
	更新一个User实体对象
		[id]:statement的id,要求在命名空间内唯一
		[parameterType]:入参的java类型
    -->
	<update id="update" parameterType="cn.hestyle.entity.User">
		UPDATE user
		SET username = #{username},
			birthday = #{birthday},
			sex = #{sex},
			address = #{address}
		WHERE id = #{id}
	</update>

    <!--
    通过id查找user表
        [id]:statement的id,要求在命名空间内唯一
        [parameterType]:入参的java类型
        [resultType]:查询出的单条结果集对应的java类型
        [#{id}]:表示该占位符待接收参数的名称为id。
     -->
    <select id="findUserById" parameterType="java.lang.Integer" resultType="cn.hestyle.entity.User">
		SELECT *
		FROM user
		WHERE id = #{id}
	</select>

	<!--
    通过usernameKey关键字查找user表
        [id]:statement的id,要求在命名空间内唯一
        [parameterType]:入参的java类型
        [resultType]:查询出的单条结果集对应的java类型
     -->
	<select id="findUsersByUsernameKey" parameterType="java.lang.String" resultType="cn.hestyle.entity.User">
		SELECT *
		FROM user
		WHERE username LIKE CONCAT('%', #{username}, '%')
	</select>

	<!--
    查找user表所有记录
        [id]:statement的id,要求在命名空间内唯一
        [resultType]:查询出的单条结果集对应的java类型
     -->
	<select id="findAll" resultType="cn.hestyle.entity.User">
		SELECT *
		FROM user
	</select>
</mapper>

\color{red}注意: 需要在主配置文件SqlMapConfig.xml添加路径

在这里插入图片描述

3、编写测试类

在这里插入图片描述

package cn.hestyle.test;

import cn.hestyle.entity.User;
import cn.hestyle.mapper.UserMapper;
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.Test;

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

/**
 * description:
 *
 * @author hestyle
 * @version 1.0
 * @className mybatis_day_01->Demo01
 * @date 2020-01-25 11:10
 **/
public class Demo01Test {
    private static InputStream inputStream;
    private static SqlSessionFactory sqlSessionFactory;
    private static SqlSession sqlSession;
    private static UserMapper userMapper;

    static {
        try {
            //读取Mybatis配置文件
            inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
            //创建sqlSessionFactory,然后获取sqlSession
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = sqlSessionFactory.openSession();
            userMapper = sqlSession.getMapper(UserMapper.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testSave() throws IOException {
        User user = new User();
        user.setUsername("hestyle_1");
        user.setSex("男");
        user.setBirthday(new Date());
        user.setAddress("太阳系-地球-亚洲");
        Integer rows = userMapper.save(user);
        System.err.println("受影响的行数rows = " + rows);

        user.setUsername("hestyle_2");
        userMapper.save(user);

        user.setUsername("hestyle_3");
        userMapper.save(user);

        user.setUsername("hestyle_4");
        userMapper.save(user);

        //修改了数据库,需要提交事务
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testDeleteById() throws IOException {
        Integer rows = userMapper.deleteById(1);
        System.err.println("rows = " + rows);
        //修改了数据库,需要提交事务
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testFindUserById() throws IOException {
        User user = userMapper.findUserById(2);
        System.err.println(user);
        sqlSession.close();
    }

    @Test
    public void testFindUserByUsername() throws IOException {
        List<User> userList = userMapper.findUsersByUsernameKey("style");
        for (User user : userList) {
            System.err.println(user);
        }
        sqlSession.close();
    }

    @Test
    public void testFindAll() throws IOException {
        List<User> userList = userMapper.findAll();
        for (User user : userList) {
            System.err.println(user);
        }
        sqlSession.close();
    }

    @Test
    public void testUpdate() throws IOException {
        User user = userMapper.findUserById(2);
        user.setUsername("hestyle_2_修改测试");
        userMapper.update(user);
        //修改了数据库,需要提交事务
        sqlSession.commit();
        sqlSession.close();
    }

}

4、依次执行测试方法

①、执行testSave方法在这里插入图片描述

执行后数据库user表:
在这里插入图片描述

②、执行testDeleteById方法

在这里插入图片描述
执行后数据库user表:
在这里插入图片描述

③、执行testFindUserById方法

在这里插入图片描述
执行后控制台输出:
在这里插入图片描述

④、执行testFindUserByUsernameKey方法

在这里插入图片描述
执行后控制台输出:
在这里插入图片描述

⑤、执行testFindAll方法

在这里插入图片描述
执行后控制台输出:
在这里插入图片描述

⑥、执行testUpdate方法

在这里插入图片描述
执行后数据库user表:
在这里插入图片描述
以上就是创建第一个Mybatis项目的主要内容,涉及User实体类的增、删、改、查,Mybatis框架是持久层框,即对数据库操作(增、删、改、查)的封装。顺带提一下,这里的User实体类的属性名与user表中的字段名一一对应,是为了方便演示。实际开发过程中可能出现user表中出现字段名modify_time,User实体类出现属性名modifyTime,这时select语句需要手动一一对应。
在这里插入图片描述

以上只是演示了Mybatis的基本操作,更详细的介绍请参考我的;另外一篇博客 Mybatis框架之快速入门(别再翻了,此篇博客就够了)

发布了976 篇原创文章 · 获赞 230 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/104083034
今日推荐