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 相關代碼
自定義 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) 生成的。這樣,可以將更多的精力集中在業務層與控制層的開發。