MyBatis--第一个java程序(个人学习笔记from老杜)(一)


一、初识mybatis项目

1. 开发步骤

- 第一步:配置pom.xml文件,配置打包方式jar

~~~
<packing>jar</packing>
~~~

- *第二步:引入依赖

     -mybatis依赖
     -mysql驱动依赖
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

- *第三步:编写mybatis核心配置文件,mybatis-config.xml(可以在mybatis中文网找到相关配置例子)

  • 附上链接:MyBatis中文网

  • 注意:
    第一,这个文件名不是必须叫做mybatis-config.xml,可以叫其他的名字.只是大家都采用这个名字
    第二,这个文件的存放的位置也不是固定的,可以随意,但一般情况下,会放在类的根路下
    mybatis-config.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">
<!--.dtd是文件约束-->
<configuration>
<!--开始mybatis对标准日志的实现-->
<!--    <settings>-->
<!--        <setting name="logImpl" value="SLF4J"/>-->
<!--    </settings>-->

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/powernode"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        在类的根路径下开始查询加载文件(相对路径)-->
        <mapper resource="CarMapper.xml"/>
<!--        在系统路径下开始加载资源(绝对路径)-->
<!--        <mapper url="file:///d:/CarMapper.xml"/>-->
    </mappers>
</configuration>

- *第四步:编写XxxMapper.xml文件

    在这个配置文档中编写SQL语句
    这个文件名也不是固定的,放的位置也不是固定的,我们在这里给他起个名字CarMapper.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="dfja">
<!--    insert语句 ,id是这条sqL语句的唯一标识,这个id就代表了这条SQL语句-->
    <insert id="insertCar">
        insert into t_car
        (id,car_num,brand,guide_price,produce_time,car_type)
            values
        (null,'1003','丰田霸道',30.00,'2000-10-11','燃油车')
    </insert>
</mapper>

- *第五步:在mybatis-config.xml文件指定XxxxMapper.xml文件的路径,

    <mapper resource="CarMapper.xml"/>
注意:resource属性会自动从类的根路径下开始查找资源。

- *第六步:开始编写mybatis程序。(使用mybatis的类库,编写mybatis程序,链接数据库,做增删改查就行了)

    在mybatis中,负责执行SQL语句的对象叫做什么呢?
        SqlSqssion
    SqlSession是专门用来执行SQL语句的,是数据库与java程序之间的一次会话。
    要想获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂生产SqlSession对象
   怎么获取SqlSessionFactory对象呢?
        需要先获取SqlSessionFactoryBuilder对象
        通过SqlSessionFactoryBuilder对象的build方法,来获取SqlSessionFactory对象

        SqlSessionFactoryBuilder -->  SqlSessionFactory    -->SqlSession
package com.mybatis.test.test;

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 java.io.IOException;
import java.io.InputStream;

public class MybatisIntroductionTest {
    public static void main(String[] args) throws IOException {
        //获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
        //获取SqlSessionFactory对象
        /**
         * mybatis核心配置资源的路径()
         * Resources.getResourceAsStream()就是从类的根路径下开始查找资源
         */
        InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
        //一般情况下一个数据库对应一个SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取SqlSession对象
        //如果使用的事务管理器是JDBC的话,底层实际上还是会执行:conn.setAutoCommit(false);
        SqlSession sqlSession = sqlSessionFactory.openSession();//使用JDBC获得是JDBCTransaction
        //执行Sql语句
        int count = sqlSession.insert("insertCar");//影响数据库表当中记录的条数
        System.out.println("插入了几条记录"+count);
        sqlSession.commit();//底层实际上还是会执行conn.commit();
    }
}

其他注意事项

1. 从XML中构建SqlSessionFactory

通过官方的,你能想到什么呢?
    第一,在Mybatis中一定有一个很重要的对象,SqlSessionFactory对象
    第二,SqlSessionFactory对象的创建需要XML
XML是什么?
    它一定是一个配置文件。

2.mybatis中有两个主要的配置文件。

其中一个是,mybatis-config.xml,这是核心配置文件,主要配置链接数据库的信息等。(一个)
另一个是:xxxxMapper.xml,这个文件时专门用来编写SQL语句的配置文件(一个表一个)
    t_user表,一般会对应一个UserMapper.xml
    t_student表,一般会对应一个StudentMapper.xml

3关于第一程序的小细节

  • mybatis中sql语句结尾的";"可以省略

  • Resource.getResourceAsSream()
    小技巧:一般情况下,遇到resource这个单词,大部分情况下,这种加载资源的方式就是从类的根路径下开始加载。(开始查找)
    优点:采用这种方式,从类路径中加载资源,项目的移植性很强。项目从windows移植到linux,代码不需要修改,因为这个资源文件一直都在类路径当中。
    InputStream is=new FileInputStream(“d:\mybatis-config.xml”)
    采用这种方法也可以
    缺点:可移植性太差,程序不够健壮,可能会移植到其他的操作系统中。导致以上路径无效,还需要修改java代码中的路径,这样违背了OCP原则。
    *已经验证了:
    mybatis核心配置文件的名字,不一定是mybatis-config.xml,可以是其他名字。
    mybatis核心配置文件存放的路径,也不一定是在类的根路径下,可以放在其他位置。但为了项目的移植性,健壮性,最好将这个配置文件放到类路径下。
    *InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream(“mybatis-config.xml”)
    ClassLoder.getSystemClassLoder() 获取系统的类加载器
    系统类加载器有一个方法叫做:getResourceAsStream
    它就是从类路径当中加载资源的
    通过源代码分析
    InputStream is=Resource.getResourceAsStream(“mybatis-config.xml”)
    底层的源代码其实就是:
    InputStream is=ClassLoder.getSystemClassLoder.getResourceAsStream(“mybatis-config.xml”)
    *CarMapper.xml的文件名字是固定的码?CarMapper.xml的路径是固定的码?
    答:都不是固定的
    相对路径resource是在类路径中加载文件
    绝对路径 url是在系统路径加载文件

4. 关于mybatis的事务管理机制(深度剖析)

4.1在mybatis-config.xml文件中,可以通过一下的配置进行mybatis的事务管理

        <transactionManager type="JDBC">
  • type的属性包括两个
    JDBC
    MANAGED
    注意:type后面的值,只有以上两个值可选,不区分大小写

4.2 在mybatis中提供了两种事务管理机制:

        第一种:JDBC事务管理器
        第二种:MANAGED事务管理器
4.2.1JDBC事务管理器:
        mybatis框架自己管理实务,自己采用原生的JDBC代码去管理实务
        conn.setAutoCommit(false);//开启事务
        ......业务处理.......
        conn.commit();手动提交事务
    使用JDBC事务管理器的话,底层创建的事务管理器对象:JdbcTransaction

    如果编写的代码是下面的代码:
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        表示没有开启事务,因为这种方式压根不会执行:conn.setAutoCommit(false);

        在JDBC事务中,没有执行conn.setAutoCommit(false);那么autoCommit就是true
        如果autoCommit是true,就表示没有开启事务。只要执行任意一条DML语句就提交一次。
4.2.2MANAGED事务管理器
        mybatis不再负责事务管理了。事务交给其他容器负责。例如:spring

        对于我们单mybatis的情况下,如果配置为MANAGED
        那么事务这块是没人管的。没人管理事务表示事务没有开启。
    *JDBC中的事务
        如果你没有在JDBC代码中执行:conn.setAutoCommit(false);的话,默认autoCommit是true;

5. 关于mybatis集成的日志组件。让我们调试起来更加方便

5.1mybatis常见的集成日志组件有哪些?

    SLF4J(沙拉风) :沙拉风是一个日志标准,其中一个框架叫做logback,它实现了沙拉风规范。
    LOG4J
    LOG4J2
    STDOUT_LOGGING(标准日志)
    ……

注意:LOG4J,LOG4J2,logback都是同一个作者开发的。

5.2其中STDOUT_LOGGING是标准日志,mybatis已经实现了这种标准日志,mybatis框架本身已经实现了这种标准。

5.2.1只要开启即可,怎么开启呢?在mybatis-config.xml文件中使用setttings标签进行配置开启。
        <settings>
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>

这个标签在编写时要注意,他应该出现在environments这个标签前。注意顺序。当然,不需要记忆这个顺序。
因为有dtd文件进行约束,我们只要参考dtd约束即可。
这种实现也是可以的,可以看到一些信息,比如:链接对象是什么时候创建,什么时候关闭,sql语句是怎样的。
但是没有详细的日期,线程名字,等,如果你想使用更加丰富的配置,可以继承第三方log组件。

5.2.2继承logback日志框架
    logback日志框架实现了slf4j标准。(沙拉风:日志门面。日志标准)
    第一步:引入logback依赖。
    第二步:引入logback所必须的xml配置文件。

这个配置文件的名字必须叫做logback.xml或者logback-test.xml,不能是其他的名字。
这个配置文件必须放到类的根路径下,不能是其他位置。
主要配置日志输出相关的级别及日志具体的格式。

<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="false">
    <!--定义⽇志⽂件的存储地址-->
    <property name="LOG_HOME" value="/home"/>
     控制台输出 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:⽇志消息,%n是换⾏符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    日志保存在本地,生成文件
        <!-- 按照每天⽣成⽇志⽂件 -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--⽇志⽂件输出的⽂件名-->
                <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
                <!--⽇志⽂件保留天数-->
                <MaxHistory>30</MaxHistory>
            </rollingPolicy>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncode
    r">
                <!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5
                个字符宽度%msg:⽇志消息,%n是换⾏符-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logge
                    r{50} - %msg%n</pattern>
            </encoder>
            <!--⽇志⽂件最⼤的⼤⼩-->
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <MaxFileSize>100MB</MaxFileSize>
            </triggeringPolicy>
        </appender>

    <!--mybatis log configure-->
    <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"/>
    <!-- ⽇志输出级别,logback⽇志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值