• Mybatis第一篇


      Mybatis系列是学习笔记,是阅读路人甲java的原创博客,然后跟着步骤写的,主要是为了加深理解。有兴趣的同学可以直接去原创作者处查看博客:

      链接如下:https://home.cnblogs.com/u/itsoku123/

      本文是Mybatis学习系列的第一篇博客,分为两部分:一部分是Mybatis入门,Mybatis-generator逆向工程的使用,另一部分是Mybatis的部分基础内容。

    一、Mybatis-generator逆向工程。

      1、创建maven项目。

      2、往pom文件中添加配置。<configurationFile>标签注意填写全路径名称,我这跑项目的时候写相对路径名称会提示找不到配置文件。 

    <build>
            <plugins>
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.4.0</version>
                    <dependencies>
                        <dependency>
                            <groupId>mysql</groupId>
                            <artifactId>mysql-connector-java</artifactId>
                            <version>5.1.40</version>
                        </dependency>
                        <dependency>
                            <groupId>org.mybatis.generator</groupId>
                            <artifactId>mybatis-generator-core</artifactId>
                            <version>1.4.0</version>
                        </dependency>
                    </dependencies>
                    <executions>
                        <execution>
                            <id>Generate MyBatis Artifacts</id>
                            <phase>package</phase>
                            <goals>
                                <goal>generate</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <!--允许移动生成的文件 -->
                        <verbose>true</verbose>
                        <!-- 是否覆盖 -->
                        <overwrite>true</overwrite>
                        <!-- 自动生成的配置 -->
                        <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                    </configuration>
                </plugin>
            </plugins>
        </build>

      3、在resources文件下,创建generatorConfig.xml文件。并增加配置。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
        <!--加载配置文件,为下面读取数据库信息准备-->
        <properties resource="application.properties"/>
    
        <!--defaultModelType="flat" 大数据字段,不分表 -->
        <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
            <property name="autoDelimitKeywords" value="true" />
            <property name="beginningDelimiter" value="`" />
            <property name="endingDelimiter" value="`" />
            <property name="javaFileEncoding" value="utf-8" />
            <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
    
            <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
    
            <!-- 注释 -->
            <commentGenerator >
                <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
                <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳-->
            </commentGenerator>
    
            <!-- 数据库链接地址账号密码 -->
            <jdbcConnection driverClass="${spring.datasource.driver-class-name}"
                            connectionURL="${spring.datasource.url}"
                            userId="${spring.datasource.username}"
                            password="${spring.datasource.password}">
            </jdbcConnection>
    
            <!-- 类型转换 -->
            <javaTypeResolver>
                <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
                <property name="forceBigDecimals" value="true"/>
            </javaTypeResolver>
    
            <!-- 生成Model类存放位置 -->
            <javaModelGenerator targetPackage="entity" targetProject="src/main/java">
                <property name="enableSubPackages" value="true"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
    
            <!-- 生成mapxml文件 -->
            <!-- 配置存放dao层的包名为dao -->
            <sqlMapGenerator targetPackage="dao" targetProject="src/main/java" >
                <property name="enableSubPackages" value="false" />
            </sqlMapGenerator>
    
            <!-- 生成mapxml对应client,也就是接口dao -->
            <javaClientGenerator targetPackage="dao" targetProject="src/main/java" type="XMLMAPPER" >
                <property name="enableSubPackages" value="false" />
            </javaClientGenerator>
    
            <!-- domainObjectName用来自定义生成的实体类名 -->
            <!-- mapperName用来自定义生成的dao接口和xml文件名字 -->
            <table tableName="t_user"
                   domainObjectName="User"
                   mapperName="UserDao"
                   enableCountByExample="true"
                   enableUpdateByExample="true"
                   enableDeleteByExample="true"
                   enableSelectByExample="true"
                   selectByExampleQueryId="true">
                <generatedKey column="id" sqlStatement="Mysql" identity="true" />
            </table>
    
        </context>
    </generatorConfiguration>

      4、在resources文件下,创建application.properties,与generatorConfig.xml的<properties resource="application.properties"/>相关,用来设置数据的相关信息。

    spring.datasource.url=jdbc:mysql://localhost:3306/code2020?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

      5、在MavenProject中选中Plugins,运行mybatis-generator插件下的mybatis-gennerator:generator命令。

      

      6、生成的结果如下所示,选中文件将其复制到具体路径下。

      

     二、Mybatis相关基础

      1、maven项目搭建

     

       2、添加pom文件的依赖,若是pom文件中没有添加<resources>,mybatis默认获取解析resources文件下的xml文件,添加了这个标签之后,可以解析存放在src/java路径下的其他xml文件。

    <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>
            <!--日志相关-->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                </resource>
            </resources>
        </build>

     3、在resources文件下,添加mybatis-config.xml及log4j.properties相关配置文件,用来添加mybatis和日志打印的配置。

      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">
    <configuration>
        <properties>
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/code2020?characterEncoding=UTF-8"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </properties>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <mappers>
            <!--此处用的是引用到具体xml文件的方式-->
            <!--<mapper resource="dao/UserDao.xml"/>-->
            <package name="dao"/>
        </mappers>
    </configuration>

      log4j.properties文件

    log4j.debug=true   
    log4j.rootLogger=INFO,D,E,stdout
    
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.E.File = D:/logs/mybatis_chat02_log.log
    log4j.appender.E.Append = true
    log4j.appender.E.Threshold = DEBUG
    log4j.appender.E.layout = org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.File = D:/logs/mybatis_chat02_error.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = ERROR
    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
    
    
    # Direct log messages to stdout
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    #log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

      4、编写简单的test方法,进行数据库的操作。

    @Test
        public void  test1() throws Exception {
            SqlSession sqlSession = null;
            try {
    
                //1.获取sqlSessionFactory对象
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
                log.info("factory" +  sqlSessionFactory);
                //2.获取sqlSession创建
                //设置自动提交
                sqlSession = sqlSessionFactory.openSession(true);
                UserDao dao = sqlSession.getMapper(UserDao.class);
                //封装对象
                User user = new User().builder().name("chat025").age(Short.valueOf("18")).salary(BigDecimal.TEN).startWorkDate(new Date()).build();
                int i = dao.insert(user);
                log.info("插入影响行数:" + i);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (NumberFormatException e) {
                e.printStackTrace();
            } finally {
                sqlSession.close();
            }
        }

      从test方法中可以看出,mybatis操作数据库只要是如下的步骤:

    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession(true);
    UserDao dao = sqlSession.getMapper(UserDao.class);

      SqlSessionFactoryBuilder:用来构建SqlSessionFactory对象,SqlSessionFactoryBuilder对mybatis配置文件、mapper xml文件、mapper xml文件和Mapper 接口的映射关系,进行解析,解析配置之后,生成了SqlSessionFactory对象,创建这个是比较耗时的,所以一般我们的服务在启动时会根据db配置生成一个SqlSessionFactory对象,然后在系统运行过程中会一直存在,而SqlSessionFactoryBuilder用完了就可以释放了。

      SqlSessionFactory:是一个接口,这个接口有2个实现DefaultSqlSessionFactory(DefaultSqlSessionFactory只实现了SqlSessionFactory)SqlSessionManager(SqlSessionManager同时实现SqlSessionFactory和SqlSession),一般都是通过SqlSessionFactoryBuilder来创建SqlSessionFactory对象。SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。如果我们多次的创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。 为此,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单列模式。 

      SqlSession:sql会话对象,一个db的操作需要创建一个SqlSession对象。

      Mapper接口: 可以直接使用SqlSession直接调用xml中的db操作,不过更简单的以及推荐的方式是使用Dao层接口,接口中的方法和xml文件中的db操作建立了映射关系,接口完整名称 + 方法名称xml中的namespace + 具体操作的id来进行关联的,然后直接调用接口的方法就可以进行db操作了,接口需要通过SqlSession获取,传入接口对应的Class对象,就能得到这个接口的实例。

  • 相关阅读:
    java 单向链表实现
    super、this
    Java程序员们最常犯的10个错误
    Codeforces-1323D Present
    Codeforces-1323E Instant Noodles
    Codeforces-1312E Array Shrinking
    Codeforces-1327D Infinite Path
    Codeforces-1326D Prefix-Suffix Palindrome
    HDU-5885 XM Reserves
    NTT(快速数论变换)用到的各种素数及原根
  • 原文地址:https://www.cnblogs.com/8593l/p/12533174.html
Copyright © 2020-2023  润新知