mybatis 04: mybatis对象分析 + 测试代码简化 + 配置优化

2年前 (2022) 程序员胖胖胖虎阿
219 0 0

MyBatis对象分析

  • 测试代码示例
package com.example.test;

import com.example.pojo.Student;
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.List;

public class TestStudent {
    @Test
    public void testGetAll() throws IOException {
        //使用文件流获取核心配置文件SqlMapConfig.xml
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //取出sqlSession对象
        SqlSession sqlSession = factory.openSession();
        //完成查询操作
        List<Student> list = sqlSession.selectList("wangxun.getAll");
        list.forEach(System.out::println);
        //关闭sqlSession
        sqlSession.close();
    }

    @Test
    public void testGetById() throws IOException {
        //读取核心配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //按主键查询
        Student student = sqlSession.selectOne("wangxun.getById", 3);
        System.out.println(student);
        //关闭SqlSession
        sqlSession.close();
    }

    @Test
    public void testGetByName() throws IOException {
        //读取核心配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //按照姓名模糊查询
        List<Student> students = sqlSession.selectList("wangxun.getByName", "三");
        students.forEach(System.out::println);
        //关闭SqlSession
        sqlSession.close();
    }

    @Test
    public void testInsert() throws IOException {
        //读取核心配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //插入数据
        int num = sqlSession.insert("wangxun.insert", new Student("小涵", "0321@qq.com", 20));
        //切记:在所有的增删改后,必须手动提交
        sqlSession.commit();
        if (num == 1) {
            System.out.println("插入成功!");
        }else{
            System.out.println("插入失败!");
        }
        //关闭SqlSession
        sqlSession.close();
    }

    @Test
    public void testDelete() throws IOException {
        //读取核心配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //执行删除语句
        int num = sqlSession.delete("wangxun.delete", 5);
        sqlSession.commit();
        if(num == 1){
            System.out.println("删除成功!");
        }else{
            System.out.println("删除失败!");
        }
        //关闭SqlSession
        sqlSession.close();
    }

    @Test
    public void testUpdate() throws IOException {
        //读取核心配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //执行更新语句
        int num = sqlSession.update("wangxun.update", new Student(1, "小何", "hehe@qq.com", 20));
        sqlSession.commit();
        if(num == 1){
            System.out.println("更新成功!");
        }else{
            System.out.println("更新失败!");
        }
        //关闭SqlSession
        sqlSession.close();
    }
}
  • Resources类
    • 解析SqlMapConfig,xml文件,创建出相应的对象
    • InputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
  • SqlSessionFactory接口
    • DefaultSqlSessionFactory是其一个实现类
      • ctrl + h 可以快捷查看本接口的子接口及其实现类
    • SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
  • SqlSession接口
    • DefaultSqlSession是其一个实现类

测试代码简化

  • 简化后的测试代码
package com.example.test;

import com.example.pojo.Student;
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.After;
import org.junit.Before;
import org.junit.Test;

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

public class TestStudent {
    //SqlSession对象
    SqlSession sqlSession;
    
    //获取SqlSession对象
    @Before
    public void createSqlSession() throws IOException {
        //使用文件流获取核心配置文件SqlMapConfig.xml
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //取出sqlSession对象
        sqlSession = factory.openSession();
    }
    
    //归还SqlSession对象
    @After
    public void closeSqlSession(){
        sqlSession.close();
    }
    
    
    @Test
    public void testGetAll() throws IOException {
        //完成查询操作
        List<Student> list = sqlSession.selectList("wangxun.getAll");
        list.forEach(System.out::println);
    }

    @Test
    public void testGetById() throws IOException {
        //按主键查询
        Student student = sqlSession.selectOne("wangxun.getById", 3);
        System.out.println(student);
    }

    @Test
    public void testGetByName() throws IOException {
        //按照姓名模糊查询
        List<Student> students = sqlSession.selectList("wangxun.getByName", "三");
        students.forEach(System.out::println);
    }

    @Test
    public void testInsert() throws IOException {
        //插入数据
        int num = sqlSession.insert("wangxun.insert", new Student("小涵", "0321@qq.com", 20));
        //切记:在所有的增删改后,必须手动提交
        sqlSession.commit();
        if (num == 1) {
            System.out.println("插入成功!");
        }else{
            System.out.println("插入失败!");
        }
    }

    @Test
    public void testDelete() throws IOException {
        //执行删除语句
        int num = sqlSession.delete("wangxun.delete", 5);
        sqlSession.commit();
        if(num == 1){
            System.out.println("删除成功!");
        }else{
            System.out.println("删除失败!");
        }
    }

    @Test
    public void testUpdate() throws IOException {
        //执行更新语句
        int num = sqlSession.update("wangxun.update", new Student(1, "小何", "hehe@qq.com", 20));
        sqlSession.commit();
        if(num == 1){
            System.out.println("更新成功!");
        }else{
            System.out.println("更新失败!");
        }
    }
}

实体类别名注册

  • 单个实体类起别名
    <!-- 为实体类注册别名
         注意标签的出现顺序
    -->
    <typeAliases>
        <typeAlias type="com.example.pojo.Student" alias="student"/>
    </typeAliases>
  • 批量为实体类起别名
    <typeAliases>
        <!-- 包下的所有实体类自动起别名(规范):
              别名是实体类类名的驼峰命名法
        -->
        <package name="com.example.pojo"/>
    </typeAliases>


	<!-- 例如:
		com.example.pojo包下有实体类:Studnet
		则使用到该实体类的sql标签可以如下表示:
	-->
    <select id="getAll" resultType="student">
        select
            id, name, email, age
        from
            student
    </select>

设置日志输出

  • 配置示例
    <!-- 设置日志输出sql语句底层执行的代码-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
  • 测试示例
package com.example.test;

import com.example.pojo.Student;
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.After;
import org.junit.Before;
import org.junit.Test;

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

public class TestStudent {
    //SqlSession对象
    SqlSession sqlSession;

    //获取SqlSession对象
    @Before
    public void createSqlSession() throws IOException {
        //使用文件流获取核心配置文件SqlMapConfig.xml
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //取出sqlSession对象
        sqlSession = factory.openSession();
    }
    //归还SqlSession对象
    @After
    public void closeSqlSession(){
        sqlSession.close();
    }


    @Test
    public void testGetAll() throws IOException {
        //完成查询操作
        List<Student> list = sqlSession.selectList("wangxun.getAll");
        list.forEach(System.out::println);
    }
}

/*
输出结果的部分:
Checking to see if class com.example.pojo.Student matches criteria [is assignable to Object]
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.

Opening JDBC Connection

Created connection 1806880779.

Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6bb2d00b]

==>  Preparing: select id, name, email, age from student
==> Parameters: 
<==    Columns: id, name, email, age
<==        Row: 1, 小何, hehe@qq.com, 20
<==        Row: 2, 李四, lisi@126.com, 21
<==        Row: 3, 王五, wangwu@163.com, 22
<==        Row: 4, 赵六, zhaoliun@qq.com, 24
<==        Row: 6, 小涵, 0321@qq.com, 20
<==      Total: 5
Student{id=1, name='小何', email='hehe@qq.com', age=20}
Student{id=2, name='李四', email='lisi@126.com', age=21}
Student{id=3, name='王五', email='wangwu@163.com', age=22}
Student{id=4, name='赵六', email='zhaoliun@qq.com', age=24}
Student{id=6, name='小涵', email='0321@qq.com', age=20}

Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6bb2d00b]

Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6bb2d00b]

Returned connection 1806880779 to pool.

Process finished with exit code 0
*/

相关文章

暂无评论

暂无评论...