spring+mybatis+mysql 使用时需要注意的几点

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_idUUID() 函数生成。

猜你喜欢

转载自blog.csdn.net/hbtj_1216/article/details/81510352