MYSQL使用时需要注意的几点
一、spring+mybatis+mysql集成的关键点
1、所需要的驱动包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
2、database.properties的一般写法
# mysql database config
myspring.jdbc.driver=com.mysql.jdbc.Driver
myspring.jdbc.url=jdbc:mysql://localhost:3306/myspring?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
myspring.jdbc.user=root
myspring.jdbc.password=password
3、集成pagehelper分页插件时的配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 配置mybatis全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- mybatis分页插件PageHelper -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=mysql
reasonable=true
</value>
</property>
</bean>
</array>
</property>
<!-- 自动扫描所有SQL映射的xml文件!!!!!! -->
<property name="mapperLocations" value="classpath*:com/tao/myspring/dao/xml/*Dao.xml"/>
</bean>
二、mysql数据库中的时间类型选择的问题
mysql(5.7)所支持的日期时间类型有:DATETIME、 TIMESTAMP、DATE、TIME、YEAR。
几种类型比较如下:
日期时间类型 | 占用空间 | 日期格式 | 最小值 | 最大值 | 零值表示 |
---|---|---|---|---|---|
DATETIME | 8 bytes | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 bytes | YYYY-MM-DD HH:MM:SS | 19700101080001 | 2038 年的某个时刻 | 00000000000000 |
DATE | 4 bytes | YYYY-MM-DD | 1000-01-01 | 9999-12-31 | 0000-00-00 |
TIME | 3 bytes | HH:MM:SS | -838:59:59 | 838:59:59 | 00:00:00 |
YEAR | 1 bytes | YYYY | 1901 | 2155 | 0000 |
DATETIME
- DATETIME 用于表示 年月日 时分秒,是 DATE 和 TIME 的组合,并且记录的年份(见上表)比较长久。如果实际应用中有这样的需求,就可以使用 DATETIME 类型。
TIMESTAMP
- TIMESTAMP 用于表示 年月日 时分秒,但是记录的年份(见上表)比较短暂。
- TIMESTAMP 和时区相关,更能反映当前时间。当插入日期时,会先转换为本地时区后再存放;当查询日期时,会将日期- 转换为本地时区后再显示。所以不同时区的人看到的同一时间是 不一样的。
- 表中的第一个 TIMESTAMP 列自动设置为系统时间(CURRENT_TIMESTAMP)。当插入或更新一行,但没有明确给 TIMESTAMP 列赋值,也会自动设置为当前系统时间。如果表中有第二个 TIMESTAMP 列,则默认值设置为0000-00-00 00:00:00。
- TIMESTAMP 的属性受 Mysql 版本和服务器 SQLMode 的影响较大。
如果记录的日期需要让不同时区的人使用,最好使用 TIMESTAMP。
DATE
- DATE 用于表示 年月日,如果实际应用值需要保存 年月日 就可以使用 DATE。
TIME
- TIME 用于表示 时分秒,如果实际应用值需要保存 时分秒 就可以使用 TIME。
YEAR
- YEAR 用于表示 年份,YEAR 有 2 位(最好使用4位)和 4 位格式的年。 默认是4位。如果实际应用只保存年份,那么用 1 bytes 保存 YEAR 类型完全可以。不但能够节约存储空间,还能提高表的操作效率。
三、mysql、jdbcType、java类型对应关系
MySQL 数据类型 | jdbcType | java类型 |
---|---|---|
BIT(1) (new in MySQL-5.0) | BIT | java.lang.Boolean |
BIT( > 1) (new in MySQL-5.0) | BIT | byte[] |
TINYINT | TINYINT | java.lang.Boolean if the configuration property tinyInt1isBit is set to true (the default) and the storage size is 1, or java.lang.Integer if not. |
BOOL , BOOLEAN | TINYINT | See TINYINT , above as these are aliases for TINYINT(1) , currently. |
SMALLINT[(M)] [UNSIGNED] | SMALLINT [UNSIGNED] | java.lang.Integer (regardless of whether it is UNSIGNED or not) |
MEDIUMINT[(M)] [UNSIGNED] | MEDIUMINT [UNSIGNED] | java.lang.Integer (regardless of whether it is UNSIGNED or not) |
INT,INTEGER[(M)] [UNSIGNED] | INTEGER [UNSIGNED] | java.lang.Integer , if UNSIGNED java.lang.Long |
BIGINT[(M)] [UNSIGNED] | BIGINT [UNSIGNED] | java.lang.Long , if UNSIGNED java.math.BigInteger |
FLOAT[(M,D)] | FLOAT | java.lang.Float |
DOUBLE[(M,B)] | DOUBLE | java.lang.Double |
DECIMAL[(M[,D])] | DECIMAL | java.math.BigDecimal |
DATE | DATE | java.sql.Date |
DATETIME | DATETIME | java.sql.Timestamp |
TIMESTAMP[(M)] | TIMESTAMP | java.sql.Timestamp |
TIME | TIME | java.sql.Time |
`YEAR[(2 | 4)]` | YEAR |
CHAR(M) | CHAR | java.lang.String (unless the character set for the column is BINARY , then byte[] is returned. |
VARCHAR(M) [BINARY] | VARCHAR | java.lang.String (unless the character set for the column is BINARY , then byte[] is returned. |
BINARY(M) | BINARY | byte[] |
VARBINARY(M) | VARBINARY | byte[] |
TINYBLOB | TINYBLOB | byte[] |
TINYTEXT | VARCHAR | java.lang.String |
BLOB | BLOB | byte[] |
TEXT | VARCHAR | java.lang.String |
MEDIUMBLOB | MEDIUMBLOB | byte[] |
MEDIUMTEXT | VARCHAR | java.lang.String |
LONGBLOB | LONGBLOB | byte[] |
LONGTEXT | VARCHAR | java.lang.String |
ENUM('value1','value2',...) | CHAR | java.lang.String |
SET('value1','value2',...) | CHAR | java.lang.String |
四、uuid问题
mysql中内置的生成uuid 的函数是 UUID()
因为mysql的主键不能设置默认生成uuid,所以需要在插入数据的时候调用mysql的UUID()函数生成uuid,并且主键不能设置成自增。
mybatis中插入单条数据返回生成的uuid主键的写法
<!-- 插入数据,并返回主键 -->
<insert id="insert" parameterType="com.tao.myspring.entity.Person">
<selectKey order="BEFORE" resultType="java.lang.String" keyColumn="person_id" keyProperty="personId">
SELECT UUID() AS personId
</selectKey>
INSERT INTO tb_person (
person_id,
name,
age,
birthday
)
VALUES (
#{personId, jdbcType=VARCHAR},
#{name, jdbcType=VARCHAR},
#{age, jdbcType=INTEGER},
#{birthday, jdbcType=VARCHAR}
)
</insert>
mybatis中批量插入时为每条数据生成uuid
<!-- 批量插入数据 -->
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO tb_person (
person_id,
name,
age,
birthday
)
VALUES
<foreach collection="personList" item="pojo" index="index" separator=",">
(
UUID(),
#{pojo.name, jdbcType=VARCHAR},
#{pojo.age, jdbcType=INTEGER},
#{pojo.birthday, jdbcType=VARCHAR}
)
</foreach>
</insert>
每一个 person_id
由 UUID()
函数生成。