• mybatis 单框架实现数据库查询


    mybatis 单框架实现数据库查询

    1 准备工作

    1.1 导入依赖

    <dependencies>
            <dependency>
                <groupId>org.mybatisgroupId>
                <artifactId>mybatisartifactId>
                <version>3.5.9version>
            dependency>
            
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>8.0.29version>
            dependency>
            
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <version>1.18.24version>
            dependency>
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.13.2version>
                
                <scope>testscope>
            dependency>
            
            <dependency>
                <groupId>log4jgroupId>
                <artifactId>log4jartifactId>
                <version>1.2.17version>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    1.2 配置java文件夹和resource资源文件夹都能输出到target目录中

     <build>
            
            <resources>
                <resource>
                    <directory>src/main/javadirectory>
                    <includes>
                        
                        <include>**/**include>
                    includes>
                resource>
                <resource>
                    <directory>src/main/resourcesdirectory>
                    <includes>
                        
                        <include>**/**include>
                    includes>
                resource>
            resources>
        build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    1.3 创建需要查询的实体类(全部引用数据类型)

    package entity;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    //属性必须是引用数据类型 数据库Null值 动态sql都是判断属性是否为空
    public class Emp {
        private Integer empno;
        private String ename;
        private String job;
        private Integer mgr;
        private String hiredate;
        private Double sal;
        private Double comm;
        private Integer deptno;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    1.4 在resource资源文件夹下面创建jdbc.properties文件

    # key-value 形式的文件 注意:笔者使用的mysql8版本的数据库
    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://127.0.0.1:3306/数据库名称
    jdbc.username=账户
    jdbc.password=密码
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.5 在resource资源文件夹下创建log4j.properties文件

    #代表root节点整个工程下所有输出日志的地方配置的输出的级别和输出的位置。
    log4j.rootLogger=DEBUG,Console,D
    #代表配置控制台的类。
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
    log4j.logger.org.apache=INFO
    
    log4j.logger.java.sql.ResultSet=INFO
    log4j.logger.java.sql.Connection=DEBUG  
    log4j.logger.java.sql.Statement=DEBUG  
    log4j.logger.java.sql.PreparedStatement=DEBUG
    ### 输出到日志文件 ###
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.File = logs/mybatis.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = DEBUG
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss}  [ %t\:%r ] - [ %p ]  %m%n
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    1.6 在resource资源文件夹下面创建mybatis-config.xml文件

    
    DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        
        <properties resource="jdbc.properties">properties>
        
        <typeAliases>
            <package name="entity"/>
        typeAliases>
        
        <environments default="mysql">
            
            <environment id="mysql">
                
                <transactionManager type="JDBC"/>
                
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}"/>
                    <property name="url" value="${jdbc.url}"/>
                    <property name="username" value="${jdbc.username}"/>
                    <property name="password" value="${jdbc.password}"/>
                dataSource>
            environment>
        environments>
        
        <mappers>
        
            
            <package name="mapper"/>
        mappers>
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    注意: mybatis-config.xml文件中导入jdbc.properties文件的指令
    
    <properties resource="jdbc.properties">properties>
    
    
    • 1
    • 2
    • 3

    1.7 创建SqlSessionFactoryFactory工具类

    package util;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.InputStream;
    
    public class SqlSessionFactoryUtil {
        /*加载主配置文件*/
        private static String resource = "mybatis-config.xml";
        /*定义在外面*/
        private static SqlSessionFactory sf=null;
        static {
            /*加载主配置文件 得到SqlSessionFactory对象
            * 该对象是一个连接工厂对象
            * */
            try {
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sf = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static SqlSessionFactory sf(){
           return sf;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    1.8 创建EmpMapper接口和EmpMapper.xml文件

    在这里插入图片描述

    1.9 主配置文件引入其他配置文件(扫描该配置文件的根目录)

    
    <mappers>
        <package name="mapper"/>
    mappers>
    
    • 1
    • 2
    • 3
    • 4

    2 查询全部

    2.1 在EmpMapper接口中的方法名

    List<Emp> findAll();
    
    • 1

    2.2 在EmpMapper.xml中准备的sql语句

    <select id="findAll" resultType="entity.Emp">
        select * from emp
    select>
    
    • 1
    • 2
    • 3

    2.3 在test文件夹下写的测试代码

     public void t1(){
            //连接工厂
            SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
            /*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
            SqlSession sqlSession = sf.openSession();
            //调用mapper中的sql 参数写命名空间.id
            /*调用自己的mapper 后面写接口.class*/
            EmpMapper em = sqlSession.getMapper(EmpMapper.class);
            List<Emp> all = em.findAll();
            for (Emp emp : all) {
                System.out.println(emp);
            }
            sqlSession.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.4 查询结果

    在这里插入图片描述

    2.5 知识点总结

    接口里面的方法名必须与xml中select标签中的id值保持一致,不然查询的时候就会报错
    select标签中必须要有id和resultType,其resultType是查询结果的返回类型,不支持多表多字段查询
    
    • 1
    • 2

    3 带条件查询

    3.1 在EmpMapper接口中的方法名

     Emp findById(int id);
    
    • 1

    3.2 在EmpMapper.xml中准备的sql语句

    <select id="findById" resultType="emp">
    	select * from emp WHERE empno=#{id}
    select>
    
    • 1
    • 2
    • 3

    3.3 在test文件夹下写的测试代码

     @org.junit.Test
        public void t2(){
            //连接工厂
            SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
            /*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
            SqlSession sqlSession = sf.openSession();
            //调用mapper中的sql 参数写命名空间.id
            /*调用自己的mapper 后面写接口.class*/
            EmpMapper em = sqlSession.getMapper(EmpMapper.class);
            Emp byId = em.findById(7369);
            System.out.println(byId);
            sqlSession.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.4 查询结果

    在这里插入图片描述

    3.5 知识点总结

     
    
    • 1
    • 2
    • 3
    • 4

    4 模糊查询

    4.1 单参数查询

    4.1.1 在EmpMapper接口中的方法名
    List<Emp> likeEname(String name);
    
    • 1
    4.1.2 在EmpMapper.xml中准备的sql语句
     <select id="likeEname" resultType="emp">
         /*模糊查询两个%拼接在一起*/
         select * from emp WHERE ename like '%${name}%'
     </select>
    
    • 1
    • 2
    • 3
    • 4
    4.1.3 在test文件夹下写的测试代码
      public void t2(){
            //连接工厂
            SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
            /*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
            SqlSession sqlSession = sf.openSession();
            //调用mapper中的sql 参数写命名空间.id
            /*调用自己的mapper 后面写接口.class*/
            EmpMapper em = sqlSession.getMapper(EmpMapper.class)
            //模糊查找
            List<Emp> a = em.likeEname("A");
            for (Emp emp : a) {
                System.out.println(emp);
            }
            sqlSession.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    4.1.4 查询结果

    在这里插入图片描述

    4.1.5 知识点总结
    模糊查找只能用${name}的形式
    其是采用'%${模糊查找的值}%'去进行模糊查找的
    虽然是一个参数,但是xml文件(mapper文件夹下)中的字段名必须与接口中方法的形参的字段名保持一致
    
    • 1
    • 2
    • 3

    4.2 多参数查询(采用@Para注解的方式)

    4.2.1 在EmpMapper接口中的方法名
      List<Emp> like(@Param("a")String name, @Param("b")String job);
    
    • 1
    4.2.2 在EmpMapper.xml中准备的sql语句
      <select id="like" resultType="emp">
            /*模糊查询两个%拼接在一起*/
            select * from emp WHERE ename like '%${a}%' OR job like '%${b}%'
      select>
    
    • 1
    • 2
    • 3
    • 4
    4.2.3 在test文件夹下写的测试代码
     public void t2(){
            //连接工厂
            SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
            /*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
            SqlSession sqlSession = sf.openSession();
            //调用mapper中的sql 参数写命名空间.id
            /*调用自己的mapper 后面写接口.class*/
            EmpMapper em = sqlSession.getMapper(EmpMapper.class);
            List<Emp> a = em.like("A","B");
            for (Emp emp : a) {
                System.out.println(emp);
            }
            sqlSession.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    4.2.4 查询结果

    在这里插入图片描述

    4.2.5 知识点总结
    mybatis有多个参数时,有以下三种方式
    /*多个形参 
        方式一 arg0 表示第一个 arg1 表示第二个
        方式二 param1 表示第一个 param2表示第二个
        方式三 在接口里面使用注解@para,本次示例里面所采用的就是第三种
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    CTE(公共表表达式)和视图在查询时的性能影响
    WEB渲染模式——CSR SSR SSG ISR DPR区别
    一次 MySQL 误操作导致的事故,「高可用」都顶不住了
    系列五、GC垃圾回收【四大垃圾算法-复制算法】
    MSE 结合 Dragonwell,让 Java Agent 更好用
    Java 8新特性
    C++常见容器实现原理
    K8S pod资源、探针
    日志分析系统——ELK
    中国ui设计师年终工作总结
  • 原文地址:https://blog.csdn.net/SSS4362/article/details/127705039