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对象,就能得到这个接口的实例。

原文地址:https://www.cnblogs.com/8593l/p/12533174.html