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


    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 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 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 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 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>
    
    
    	
        <select id="getAll" resultType="student">
            select
                id, name, email, age
            from
                student
        select>
    

    设置日志输出

    • 配置示例
        
        <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 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
    */
    
  • 相关阅读:
    有未经处理的异常: 0xC00000FD: Stack overflow 问题解决
    TypeScript学习
    openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144) - 验证
    谨以此篇纪念我的csdn创作两周年
    PAT (甲级) 2022年夏季考试 c++ 满分题解
    typescript
    关于docker启动时报错binlog权限问题
    【react】fiber解决了什么问题,及diff算法
    c语言练习题80:汉明距离
    pytorch中对nn.BatchNorm2d()函数的理解
  • 原文地址:https://www.cnblogs.com/nefu-wangxun/p/16570615.html