• Mybatis


    Mybaits

    一、开发我的第一个Mybaits程序

    1. resources目录:
      放在这个目录当中的,一般都是资源文件,配置文件,直接放到resources目录下的资源,等同于放到了类的根路径。

    2. 开发步骤:

      1. 创建maven模块
      2. 打包方式jar
      3. 引入依赖:
        1. mybatis依赖
        2. MySQL驱动
      4. 编写mybatis核心配置文件,mybatis-config.xml
        • 注意:1.这个文件不是必须叫mybatis-config.xml 2. 这个文件的存放位置也不是固定的
        • mybatis-config.xml文件中先把数据库的信息修改一下
      5. 编写xxxMapper.xml文件,编写sql语句
      6. 在mybatis—config.xml文件中指定XxxNapper.xml文件的路径
        • 注意:resource属性会自动从类的根目录下开始查找资源
      7. 编写mybatis程序(使用mybatis的类库,编写mybatis程序,连接数据库,做增删改查)
        • 在MyBatis当中,负责执行SQL语句的对象叫做SqlSession
        • SqlSession是专门用来执行SQL语句的,是一个java程序和数据库之间的一次会话
        • 要想获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂来生产SqlSession对象。
        • 怎么获取SqlSessionFactory对象?
          1. 需要首先获取SqlSessionFactoryBuilder对象
          2. 通过SqlSessionFactoryBuilder对象的build方法来获取一个SqlSessionFactory对象
        • mybatis的核心对象包括:
          SqlSessionFactoryBuilder -->SqlSessionFactory --> SqlSession
    3. 从XML中创建SqlSessionFactory

      • 第一:在mybatis中一定是有一个很重要的对象,这个对象是。SqlSessionFactory对象
      • 第二:SqlSessionFactrory对象的创建需要创建XML
      • XML是一个配置文件
    4. mybatis中有两个主要的配置文件

      • 其中一个是:mybatis-config.xml,这是核心配置文件,主要配置连接数据库的连接信息等.(一个)
      • 另一个是:xxxMapper.xml这个文件是专门用来编写SQL语句的配置文件.(一个表一个)
        • t_user表:一般会对应一个userMapper.xml
        • t_student表:一般会对应一个StudentMapper.xml
    5. 关于第一个小程序的细节

      • mybatis中sql语句的结尾";"可以省略
      • Resources.getResourceAsStream:
        • 小技巧:以后凡是遇到resource这类单词,大部分情况下,这种加载资源的方式就是从类的根路径下开始加载。
      • InputStream is = new FileInputStream(“xxxx路径”)也可以,但可移植性差,程序不够健壮,移植到其他系统时,需要修改java代码,违背OCP原则。
      • InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(“mybatis-config.xml”);
        • ClassLoder.getSystemClassLoader() 获取系统的类加载器。
        • 系统类加载器有一个方法叫:getResourceAsStream,它就是从类路径当中加载资源的。
        • 通过源代码分析发现: InputStream = Resources.getResourceAsStream(“xxx”) 底层就是 InputStream is =
          ClassLoader.getSystemClassLoader().getResourceAsStream(“mybatis-config.xml”);
      • CarMapper.xml
        • / / resource属性:从类路径当中加载资源
        • / / url属性:从绝对路径当中加载资源,不建议使用,可移植性差
    6. 关于mybatis的事务管理机制。(深度剖析)

      • 在mybatis-comfig.xml文件中,可以通过以下的配置进行mybats的事务管理,
        • / /
        • type属性值只包含两个,且不区分大小写
        • JDBC事务管理器:mybatis框架自己管理事务,自己采用原生的JDBC代码去管理事务,底层创建的事务管理器对象:JdbcTransaction对象
          • conn.setAutoCommit(false);开启事务
          • conn.commit;手动提交事务
          • SqlSession sqlSession = SqlSessionFactory.openSession(true):表示没有开启事务,
            • 因为这条语句压根不会执行:conn.setAutoCommit(false)【注:其实底层没执行任何语句】
            • 在jdbc中没有执行:conn.setAutoCommit(false),则默认为True,表示没有开启事务,只要执行任意一条sql就会自动提交。
        • MANAGED事务管理器:
          • mybatis不再负责事务的管理,则事务交给其他容器负责,例如spring
          • 对于当前学习来说,若设置为MANAGED则表示事务没人管理,即事务没有被开启
    7. 关于mybatis集成日志组件

      1. mybatis常见的集成的日志组件

        1. SLF4J

        2. LOG4J

        3. LOG4J2

        4. STDOUT_LOGGING:是标准日志,mybatis已经实现了这种标准日志,只许在配置文件中开启即可

                  <settings>
                      <setting name="logImpl" value="STDOUT_LOGGING"/>
                  settings>
        
        • 1
        • 2
        • 3
      2. logback日志框架的实现

        1. 引入logback的依赖
                    <groupId>ch.qos.logbackgroupId>
                    <artifactId>logback-classicartifactId>
                    <version>1.2.11version>
        
        • 1
        • 2
        • 3
        1. 创建logback所必须的xml配置文件,
        • 名字必须为:logback.xml或logback-test.xml,

        • 位置必须为:类的根路径下

          
          
          
          <configuration debug="false">
          
              
              <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
                  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
                      
                      <pattern>[%thread] %-5level %logger{50} - %msg%npattern>
                  encoder>
              appender>
          
              
              <logger name="com.apache.ibatis" level="TRACE"/>
              <logger name="java.sql.Connection" level="DEBUG"/>
              <logger name="java.sql.Statement" level="DEBUG"/>
              <logger name="java.sql.PreparedStatement" level="DEBUG"/>
          
          
              
              <root level="DEBUG">
                  <appender-ref ref="STDOUT"/>
                  <appender-ref ref="FILE"/>
              root>
          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

    二、使用mybatis完成CRUD

    1. 在mybatis中与JDBC中占位符 ?等效的写法是:#{}
    ```xml
    <!--insert语句-->
    <insert id="insertCar">
            insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
            value(null,'1003','丰田霸道',30.0,'2000-10-11','燃油车')
    </insert>
            上面这样写的问题是?
            值 不能写在配置文件中,一定是前端的form表单提交过来的数据,然后将值传给sql语句。
    
            JDBC的代码怎么写?
            String sql="insert into t_car(id,car,num,brand,guide_price,
            produce_time,car_type)value(null,?,?,?,?,?)";
            ps.setString(1,xxx);
            ps.setString(2,yyy);
    
            正确规范
    <insert id="insertCar">insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
            value(null,#{k1},#{k2},#{k3},#{k4},#{k5})</insert>
            注意:#{}里面写map集合的key,
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    1. 使用map可以给Sql语句的占位符传值
    
    <insert id="insertCar">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
        value(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    insert>
    
    • 1
    • 2
    • 3
    • 4
    • 5
            // 这个对象我们先使用Map集合进行数据的封装
            Map<String, Object> map=new HashMap<>();
            map.put("carNum","1111");
            map.put("brand","比亚迪汉");
            map.put("guidePrice",10.0);
            map.put("produceTime","2020-11-11");
            map.put("carType","电车");
            // 执行sql语句
            // insert方法的参数:
            // 第一个参数:sqlId,从CarMapper.xml文件中复制。
            // 第二个参数:封装数据的对象。
            int count=sqlSession.insert("insertCar",map);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 使用PDJOl类可以给Sql语句的占位符传值
    
    <insert id="insertCar">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
        value(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    insert>
            # 注意:严格意义上来说,#{}中写的是get方法的方法名去掉前面get三个字母
            eg:getUsername --> #{Username+}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
        public void testMapperCarByPojo(){
            SqlSession sqlSession=SqlSessionUtil.openSession();
            // 封装数据
            Car car=new Car(null,"2223","比亚迪秦",30.0,"2020-11-11","新能源");
            // 执行Sql语句
            int count=sqlSession.insert("insertCar",car);
            System.out.println(count);
            sqlSession.commit();
            sqlSession.close();
    
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    数据库定时备份winserver2012篇
    MyBatis之xml配置的解析
    MySQL之数据库三大范式
    Mac 本地部署thinkphp8【配置环境】
    百年难遇,3款良心好用的国产软件,常被误以为是外国佬开发
    Linux(一)Linux理论、Shell
    C语言订餐管理系统
    SpringCloud 学习笔记总结 (二)
    记-数据库事务隔离级别
    【IC刷卡数据专题】IC刷卡数据分析的技术要点
  • 原文地址:https://blog.csdn.net/Ustinianljm/article/details/127870287