Mybatis框架01

1 概述

MyBatis 是一个基于Java的持久层框架。它提供的持久层框架包括SQL Maps和Data Access Objects(DAOs);
三个主要特点:

  1. 简单: 比起原生jdbc,不需要关注加载驱动,创建连接, 创建statement等操作;
  2. 解耦: 将sql语句和java语句彻底解耦, 修改sql语句不需要修改java代码,只需要修改配置文件即可;
  3. 自动封装结果集, 不需要我们手动去配置接收结果集和占位符参数;

2 入门操作

2.1 操作步骤

步骤1: 添加MyBatis的坐标, 即:jar包依赖
步骤2: 准备数据库环境
步骤3: 编写User实体类
步骤4: 编写核心文件SqlMapConfig.xml
步骤5: 编写映射文件 UserMapper.xml
步骤6: 编写测试类

2.2 添加jar包

<dependencies>
        <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>
    </dependencies>

2.3 准备数据库

CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(32) NOT NULL COMMENT '用户名称',
  `sex` CHAR(1) DEFAULT NULL COMMENT '性别',
  `address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `user` (`id`, `username`, `sex`, `address`) VALUES(NULL,'Tom','男','北京');
INSERT INTO `user` (`id`, `username`, `sex`, `address`) VALUES(NULL,'Jack','男','上海');
INSERT INTO `user` (`id`, `username`, `sex`, `address`) VALUES(NULL,'Rose','女','西安');
INSERT INTO `user` (`id`, `username`, `sex`, `address`) VALUES(NULL,'Poll','女','利比亚');

2.3 编写User实体类


@Data
public class User {
     

    private Integer id;
    private String username;
    private String sex;
    private String address;
}

2.4 编写核心文件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>

    <!--配置数据库运行环境-->
    <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://127.0.0.1:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--配置关联的SQL语句的映射文件-->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

2.5 编写映射文件 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="userMapper">

    <!--查询所有用户,sql语句不要使用分号,resultType是返回查询结果封装的类型-->
    <select id="findAll" resultType="com.mybatis.pojo.User">
        select * from user
    </select>
</mapper>

2.6 编写测试类测试

public class UserTest {
     

    @Test
    public void findAllTest() throws IOException {
     

        //加载核心配置文件SqlMapConfig.xml
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //构造SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //构造SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行查询语句
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        for (User user:userList){
     

            System.out.println("user="+user);
        }
        //释放资源
        sqlSession.close();
    }
}

2.7 结果验证

执行测试类,控制台打印查询结果:
Mybatis框架01_第1张图片

3 在IDEA中增加日志诊断功能

(1) 定义一个log4j.properties文件, 保存在resources目录下, 内容编辑为:

log4j.rootLogger =debug,systemOut,logFile

#输出到控制台
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout
log4j.appender.systemOut.layout.ConversionPattern = %d [%t] %-5p %c - %m%n
log4j.appender.systemOut.Target = System.out

#输出到文件
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = %d{
     ABSOLUTE} %5p %c{
     1}:%L - %m%n
log4j.appender.logFile.File = D:/log/log4j.log

(2) 在pom.xml中增加log4j的jar包依赖

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

(3) 运行测试类会显示日志在控制台, 显示详细的步骤
Mybatis框架01_第2张图片

4. Mybatis实现增删查数据库操作

4.1 插入数据

(1) UserMapper.xml文件增加insert的映射,如下红框内容;
Mybatis框架01_第3张图片
(2)编写一个插入测试类,注意要提交事务才能成功

//插入用户
    @Test
    public void insertTest() throws IOException {
     
        //加载核心文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

        //构造工厂类对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //从工厂类中打开一个数据库会话
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //执行插入数据
        User user=new User();
        user.setUsername("张三");
        user.setSex("男");
        user.setAddress("北京");
        int count = sqlSession.insert("userMapper.insert", user);
        System.out.println("新增加的行数为:"+count);

        //提交事务, 否则数据库无法添加成功
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

4.2 插入需求

需求: 插入完成后, 将数据库中的user的id赋值给pojo中user的id属性.

步骤1: 在UserMapper.xml文件中插入标签中增加selectKey标签,具体如下:

    <!--插入,插入完成后,需要查询最后一次插入成功的id值, order 为After意思是插入语句执行完成后执行此操作,resultType查询的返回值-->
    <insert id="insert" parameterType="com.mybatis.pojo.User">
        insert into user values(#{
     id},#{
     username},#{
     sex},#{
     address})
        <selectKey keyProperty="id" order="AFTER" resultType="integer">
            select LAST_INSERT_ID()
        </selectKey>
    </insert>

在这里插入图片描述

步骤2: 在刚才插入测试类中加一行代码查询user的id值,可以查询成功;
Mybatis框架01_第4张图片
注: 如果是uuid, 可以在UserMapper中设置如下操作:

Mybatis框架01_第5张图片

4.3 基于id删除用户

在UserMapper.xml文件中增加:

<!--删除用户-->
    <delete id="delete" parameterType="integer">

        delete from user where id=#{
     id}
    </delete>

新建删除测试类

//删除用户
    @Test
    public void deleteTest() throws IOException {
     
        //加载核心文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //构造工厂类对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //从工厂类中打开一个数据库会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //删除
        sqlSession.delete("userMapper.delete",7);
        //提交事务, 否则数据库无法添加成功
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

4.4 更新

在UserMapper.xml中增加:



update user set username=#{username},sex=#{sex},address=#{address}
where id=#{id}

新建更新测试类:

//更新用户
    @Test
    public void updateTest() throws IOException {
     
        //加载核心文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

        //构造工厂类对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //从工厂类中打开一个数据库会话
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //执行插入数据
        User user=new User();
        user.setId(6);
        user.setUsername("张惠妹");
        user.setSex("女");
        user.setAddress("马来西亚");
        sqlSession.update("userMapper.update",user);

        //提交事务, 否则数据库无法添加成功
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

4.5 基于用户id查询用户信息

在UserMapper.xml中增加:


新建查询测试类

//基于用户id查询用户信息
    @Test
    public void findById() throws IOException {
     

        //加载核心配置文件SqlMapConfig.xml
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //构造SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //构造SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行查询语句
        User user = sqlSession.selectOne("userMapper.findById", 6);
        System.out.println(user.toString());

        //释放资源
        sqlSession.close();
    }

4.6 基于用户名模糊查询

在UserMapper.xml中增加:


新建模糊查询测试类:

//基于用户名模糊查询
    @Test
    public void findByName() throws IOException {
     

        //加载核心配置文件SqlMapConfig.xml
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //构造SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //构造SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行查询语句
        List<User> userList = sqlSession.selectList("userMapper.findByName");
        for (User user:userList){
     
            System.out.println(user.toString());
        }


        //释放资源
        sqlSession.close();
    }

你可能感兴趣的:(Java入门)