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。

几种类型比较如下:

日期时间类型占用空间日期格式最小值最大值零值表示
DATETIME8 bytesYYYY-MM-DD HH:MM:SS1000-01-01 00:00:009999-12-31 23:59:590000-00-00 00:00:00
TIMESTAMP4 bytesYYYY-MM-DD HH:MM:SS197001010800012038 年的某个时刻00000000000000
DATE4 bytesYYYY-MM-DD1000-01-019999-12-310000-00-00
TIME3 bytesHH:MM:SS-838:59:59838:59:5900:00:00
YEAR1 bytesYYYY190121550000

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 数据类型jdbcTypejava类型
BIT(1) (new in MySQL-5.0)BITjava.lang.Boolean
BIT( > 1) (new in MySQL-5.0)BITbyte[]
TINYINTTINYINTjava.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, BOOLEANTINYINTSee 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)]FLOATjava.lang.Float
DOUBLE[(M,B)]DOUBLEjava.lang.Double
DECIMAL[(M[,D])]DECIMALjava.math.BigDecimal
DATEDATEjava.sql.Date
DATETIMEDATETIMEjava.sql.Timestamp
TIMESTAMP[(M)]TIMESTAMPjava.sql.Timestamp
TIMETIMEjava.sql.Time
`YEAR[(24)]`YEAR
CHAR(M)CHARjava.lang.String (unless the character set for the column is BINARY, then byte[] is returned.
VARCHAR(M) [BINARY]VARCHARjava.lang.String (unless the character set for the column is BINARY, then byte[] is returned.
BINARY(M)BINARYbyte[]
VARBINARY(M)VARBINARYbyte[]
TINYBLOBTINYBLOBbyte[]
TINYTEXTVARCHARjava.lang.String
BLOBBLOBbyte[]
TEXTVARCHARjava.lang.String
MEDIUMBLOBMEDIUMBLOBbyte[]
MEDIUMTEXTVARCHARjava.lang.String
LONGBLOBLONGBLOBbyte[]
LONGTEXTVARCHARjava.lang.String
ENUM('value1','value2',...)CHARjava.lang.String
SET('value1','value2',...)CHARjava.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() 函数生成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值