3-持久層開發

schema-mysql.sql

/* 創建數據庫 */

# drop database if exists webstart;
# create database webstart default character set utf8;
# use webstart;


/* 創建表 */

-- 用戶表
create table t_user
(
    id         bigint auto_increment,
    login_name varchar(255),
    real_name  varchar(255),
    password   varchar(255),
    primary key (id)
);

然後複製腳本在 Navicat 執行即可。

jdbc.properties

# jdbc info
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/webstart?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root

jdbc.pool.maximumPoolSize=10
jdbc.pool.minimumIdle=1
jdbc.pool.idleTimeout=6000
jdbc.pool.initialSize=5

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">

<!--
MBG生成的文件
User.java
UserExample.java
UserMapper.java
UserMapper.xml
-->

<generatorConfiguration>

    <!--加載jdbc屬性文件-->
    <properties resource="jdbc.properties"/>

    <context id="DB2Tables" targetRuntime="MyBatis3">

        <!--緩存-->
        <plugin type="org.mybatis.generator.plugins.CachePlugin"/>

        <!--重寫equals()和hashCode()-->
        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>

        <!-- 分頁 -->
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"/>

        <!--序列化-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

        <!--重寫toString()-->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>

        <!-- 註釋 -->
        <commentGenerator>
            <!-- 是否取消註釋 -->
            <property name="suppressAllComments" value="true"/>
            <!-- 是否生成註釋代時間戳-->
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!--數據庫鏈接URL,用戶名、密碼 -->
        <jdbcConnection driverClass="${jdbc.driverClass}"
                        connectionURL="${jdbc.url}"
                        userId="${jdbc.username}"
                        password="${jdbc.password}"/>

        <!-- 類型解析器 -->
        <!--  默認false:把JDBC DECIMAL 和 NUMERIC 類型解析爲java.lang.Integer
                  true:把JDBC DECIMAL 和 NUMERIC 類型解析爲java.math.BigDecimal
        -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 生成實體類的包名和位置 -->
        <javaModelGenerator targetPackage="org.yun.webstart.model"
                            targetProject="src\main\java">
            <!-- 是否讓schema作爲包的後綴 -->
            <property name="enableSubPackages" value="true"/>
            <!-- 從數據庫返回的值被清理前後的空格  -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 生成 XxxMapper.xml 文件的包名和位置 -->
        <sqlMapGenerator targetPackage="org.yun.webstart.mapper"
                         targetProject="src\main\resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- 生成 XxxMapper.java 文件的包名和位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="org.yun.webstart.mapper"
                             targetProject="src\main\java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 要生成哪些表 -->
        <table tableName="t_user" domainObjectName="User"/>

    </context>
</generatorConfiguration>

點擊如圖所示,生成 mybatis 相關代碼 image

自定義 Mapper

org.yun.webstart.mapper 包下定義 UserExtMapper 接口 代碼如下:

public interface UserExtMapper {
    String findRealNameByLoginName(String loginName);
}

與其對應的 xml 文件爲 UserExtMapper.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-->
<mapper namespace="org.yun.webstart.mapper.UserExtMapper">
    <cache /> <!--配置緩存-->
    <select id="findRealNameByLoginName" parameterType="java.lang.String" resultType="java.lang.String">
        select
            real_name
        from t_user
        where login_name = #{loginName}
    </select>
</mapper>

建議:所有自定義的 Mapper 文件以 實體類名 + Ext + Mapper 的方式命名。

spring-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/jdbc
                           http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd"
       default-lazy-init="true">


    <!--scanner package-->
    <context:component-scan base-package="org.yun.webstart">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>

    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- dataSource -->
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maximumPoolSize" value="${jdbc.pool.maximumPoolSize}"/>
        <property name="minimumIdle" value="${jdbc.pool.minimumIdle}"/>
        <property name="idleTimeout" value="${jdbc.pool.idleTimeout}"/>
        <property name="autoCommit" value="false"/>
        <!-- <property name="connectionTestQuery" value="SELECT 1"/> -->
    </bean>

    <!--<jdbc:embedded-database id="dataSource" type="H2">
        <jdbc:script location="classpath:sql/schema-h2.sql"/>
        <jdbc:script location="classpath:sql/cleanup-data.sql"/>
        <jdbc:script location="classpath:sql/import-data.sql"/>
    </jdbc:embedded-database>-->

    <!--sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="org.yun.webstart.model"/>
        <property name="mapperLocations" value="classpath:org/yun/webstart/mapper/*Mapper.xml"/>

        <!--mybatis的相關配置-->
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                <!--映射爲駝峯命名。例:my_name → myName-->
                <property name="mapUnderscoreToCamelCase" value="true"/>
            </bean>
        </property>

        <property name="plugins">
            <array>
                <!--引入PageHelper分頁插件-->
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>reasonable=true</value>
                    </property>
                </bean>
            </array>
        </property>

    </bean>

    <!--mybatis-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="org.yun.webstart.mapper"/>
    </bean>

</beans>
  • 數據庫連接池使用的是:Hikari,聽過它是 Spring Boot 默認的數據庫連接池
  • 還是用了 H2 作爲 數據源。(註釋掉的代碼),自測使用。

log4j.properties

# Output pattern : date [thread] priority category - message
#日誌級別 ERROR>WARN>INFO>DEBUG
log4j.rootLogger=INFO, Console, RollingFile
#Console
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
#RollingFile
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.RollingFile.File=logs/webstart.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#print log
#log4j.logger.org.yun.webstart.mapper=TRACE
#log4j.logger.org.yun.webstart.controller=TRACE
log4j.logger.org.yun.webstart=TRACE
  • 使用log4j.logger.項目根包名=TRACE即可在控制檯打印 SQL 語句

總結:通過上述代碼發現,持久層的開發基本是各種配置文件的編寫,而 Java 代碼基本都是用 Mybatis-Generator(MBG) 生成的。這樣,可以將更多的精力集中在業務層與控制層的開發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章