mybatis基本配置详解

mybatis基本配置详解,第1张

中间步骤自行设置

MySQL驱动版本根据自己安装的MySQL选择

我把AppTest改成了MybatisTest,不该也无妨;

其中Student类暂时只设置四个字段:

mapper接口暂时为空

在resources目录下新建File命名为db.peoperties,配置如下内容:

提示:以上配置适用于MySQL8.X版本,5.X版本按照如下配置:

1、transactionManager:事务管理器;

type 事务管理类型

JDBC(JdbcTransactionFactory);

MANAGED(ManagedTransactionFactory)

自定义事务管理器:实现TransactionFactory接口.type指定为全类名

2、dataSource:数据源

type :数据源类型

UNPOOLED(UnpooledDataSourceFactory);POOLED(PooledDataSourceFactory);

JNDI(JndiDataSourceFactory)

自定义数据源:实现DataSourceFactory接口,type是全类名

<mapper>:注册一个sql映射文件

1、注册映射文件

resource:引用类路径下的sql映射文件

mybatis/StudentMapperpper.xml

url:引用网路路径或者磁盘路径下的sql映射文件

file:///var/mappers/AuthorMapper.xml

2、注册接口

class:引用(注册)接口,

① 有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;

② 没有sql映射文件,所有的sql都是利用注解写在接口上

推荐:

比较重要的,复杂的Dao接口我们来写sql映射文件

不重要,简单的Dao接口为了开发快速可以使用注解;

批量注册

需要在资源路径下(resources)建立和dao一样的文件目录来存放想xml映射文件,如:com.example.StudentMapperpper.xml

StudentMapper

在resources的mybatis目录下新建文件夹mapper,新建xml文件StudentMapper.xml

namespace :名称空间指定为接口的全类名

id :唯一标识

resultType :返回值类型

#{id} :从传递过来的参数中取出id值

resources目录(MajorMapper.xml暂时不用创建)如下:

mybatis默认使用log4j,当有self4j这个日志jar包存在时会无法打印sql,请移除或者在工程启动时显示设置mybatis使用的日志类:

log4j.logger.org.apache.ibatis=debug,stdout log4j.logger.java.sql=debug,stdout

这样有时可能却不是个可行的办法,原因在于不可能移除self4j包,因为其他依赖包必须依赖这个包。 mybatis有如下方法来手动选择日志类,调用后成功打印日志 如果引用了slf4j的包,并且要使用log4j需要加入slf4j-log4j12的包,如果没有加入slf4j-log4j12的包是无法打印sql的。。具体log4j文件如下:

log4j.rootCategory=info, stdout , R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.Conversion

Pattern=[QC] %p [%t] %C.%M(%L) | %m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

log4j.appender.R.File=D:\\report.log

log4j.appender.R.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

log4j.logger.com.ibatis=debug

log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug

log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug

log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug

log4j.logger.java.sql.Connection=debug

log4j.logger.java.sql.Statement=debug

log4j.logger.java.sql.PreparedStatement=debug,stdout

现在重启tomcat,执行一条语句看看,sql是不是都出来了

IMESTAMP的变体

1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

在创建新记录和修改现有记录的时候都对这个数据列刷新

2,TIMESTAMP DEFAULT CURRENT_TIMESTAMP 在创建新记录的时候把这个

字段设置为当前时间,但以后修改时,不再刷新它

3,TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在创建新记录的时候把这个字段设置为0,

以后修改时刷新它

4,TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP

在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它

MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期

与时间的功能,你可以使用TIMESTAMP列类型下面就详细说明TIMESTAMP列类型

*TIMESTAMP列类型*

TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。

TIMESTAMP值显示尺寸的格式如下表所示:

+---------------+----------------+

| 列类型| 显示格式  |

| TIMESTAMP(14) | YYYYMMDDHHMMSS | 

| TIMESTAMP(12) | YYMMDDHHMMSS  |

| TIMESTAMP(10) | YYMMDDHHMM |

| TIMESTAMP(8) | YYYYMMDD  |

| TIMESTAMP(6) | YYMMDD |

| TIMESTAMP(4) | YYMM  |

| TIMESTAMP(2) | YY |

+---------------+----------------+

“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的显示尺寸

创造最常见的显示尺寸是6、8、12、和14。

你可以在创建表时指定一个任意的显示尺寸,但是定义列长为0或比14大均会被强制定义为列长14。

列长在从1~13范围的奇数值尺寸均被强制为下一个更大的偶数。

*列如:*

定义字段长度 强制字段长度

TIMESTAMP(0) -> TIMESTAMP(14)

TIMESTAMP(15)-> TIMESTAMP(14)

TIMESTAMP(1) -> TIMESTAMP(2)

TIMESTAMP(5) -> TIMESTAMP(6)

所有的TIMESTAMP列都有同样的存储大小,使用被指定的时期时间值的完整精度

(14位)存储合法的值不考虑显示尺寸。不合法的日期,将会被强制为0存储

*这有几个含意:

1、虽然你建表时定义了列TIMESTAMP(8),但在你进行数据插入与更新时TIMESTAMP列

实际上保存了14位的数据(包括年月日时分秒),只不过在你进行查询时MySQL返回给

你的是8位的年月日数据。如果你使用ALTER TABLE拓宽一个狭窄的TIMESTAMP列,

以前被“隐蔽”的信息将被显示。

2、同样,缩小一个TIMESTAMP列不会导致信息失去,除了感觉上值在显示时,

较少的信息被显示出。

3、尽管TIMESTAMP值被存储为完整精度,直接 *** 作存储值的唯一函数是UNIX_TIMESTAMP();

由于MySQL返回TIMESTAMP列的列值是进过格式化后的检索的值,这意味着你可能不能使用某些函数来 *** 作TIMESTAMP列(例如HOUR()或SECOND()),除非TIMESTAMP值的相关部分被包含在格式化的值中。

例如,一个TIMESTAMP列只有被定义为TIMESTAMP(10)以上时,TIMESTAMP列的HH部分才会被显示,

因此在更短的TIMESTAMP值上使用HOUR()会产生一个不可预知的结果。

4、不合法TIMESTAMP值被变换到适当类型的“零”值(00000000000000)。(DATETIME,DATE亦然)

*你可以使用下列语句来验证:*

CREATE TABLE test ('id' INT (3) UNSIGNED AUTO_INCREMENT, 'date1'

TIMESTAMP (8) PRIMARY KEY('id'))

INSERT INTO test SET id = 1

SELECT * FROM test

+----+----------------+

| id | date1 |

+----+----------------+

| 1 | 20021114  |

+----+----------------+

ALTER TABLE test CHANGE 'date1' 'date1' TIMESTAMP(14)

SELECT * FROM test

+----+----------------+

| id | date1 |

+----+----------------+

| 1 | 20021114093723 |

+----+----------------+

你可以使用TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的 *** 作。

如果你有多个TIMESTAMP列,只有第一个自动更新。自动更新第一个TIMESTAMP列在下列任何条件下发生:

1、列值没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。

2、列值没有明确地在一个UPDATE语句中指定且另外一些的列改变值。(注意一个UPDATE

设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为

它当前的值,MySQL为了效率而忽略更改。)

3、你明确地设定TIMESTAMP列为NULL.

4、除第一个以外的TIMESTAMP列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()。

CREATE TABLE test ( www.2cto.com

'id' INT (3) UNSIGNED AUTO_INCREMENT,

'date1' TIMESTAMP (14),

'date2' TIMESTAMP (14),

PRIMARY KEY('id')

)

INSERT INTO test (id, date1, date2) VALUES (1, NULL, NULL)

INSERT INTO test SET id= 2

+----+----------------+----------------+

| id | date1 | date2 |

+----+----------------+----------------+

| 1 | 20021114093723 | 20021114093723 |

| 2 | 20021114093724 | 00000000000000 |

+----+----------------+----------------+

->第一条指令因设date1、date2为NULL,所以date1、date2值均为当前时间第二条指令

因没有设date1、date2列值,第一个TIMESTAMP列date1为更新为当前时间,

而二个TIMESTAMP列date2因日期不合法而变为“00000000000000”

UPDATE test SET id= 3 WHERE id=1

+----+----------------+----------------+

| id | date1 | date2 |

+----+----------------+----------------+

| 3 | 20021114094009 | 20021114093723 |

| 2 | 20021114093724 | 00000000000000 |

+----+----------------+----------------+

->这条指令没有明确地设定date2的列值,所以第一个TIMESTAMP列date1将被更新为当前时间

UPDATE test SET id= 1,date1=date1,date2=NOW() WHERE id=3 www.2cto.com

+----+----------------+----------------+

| id | date1 | date2 |

+----+----------------+----------------+

| 1 | 20021114094009 | 20021114094320 |

| 2 | 20021114093724 | 00000000000000 |

+----+----------------+----------------+

->这条指令因设定date1=date1,所以在更新数据时date1列值并不会发生改变而

因设定date2=NOW(),所以在更新数据时date2列值会被更新为当前时间此指令等效为

UPDATE test SET id= 1,date1=date1,date2=NULL WHERE id=3

因MySQL返回的 TIMESTAMP 列为数字显示形式,你可以用DATE_FROMAT()函数来格式化 TIMESTAMP 列

SELECT id,DATE_FORMAT(date1,'%Y-%m-%d %H:%i:%s') As date1,

DATE_FORMAT(date2,'%Y-%m-%d %H:%i:%s') As date2 FROM test

+----+---------------------+---------------------+

| id | date1  | date2  |

+----+---------------------+---------------------+

| 1 | 2002-11-14 09:40:09 | 2002-11-14 09:43:20 |

| 2 | 2002-11-14 09:37:24 | 0000-00-00 00:00:00 |

+----+---------------------+---------------------+

SELECT id,DATE_FORMAT(date1,'%Y-%m-%d') As date1,

DATE_FORMAT(date2,'%Y-%m-%d') As date2 FROM test

www.2cto.com

+----+-------------+-------------+

| id | date1  | date2  |

+----+-------------+-------------+

| 1 | 2002-11-14 | 2002-11-14 |

| 2 | 2002-11-14 | 0000-00-00 |

+----+-------------+-------------+

在某种程度上,你可以把一种日期类型的值赋给一个不同的日期类型的对象。

然而,而尤其注意的是:值有可能发生一些改变或信息的损失:

1、如果你将一个DATE值赋给一个DATETIME或TIMESTAMP对象,结果值的时间部分被

设置为'00:00:00',因为DATE值中不包含有时间信息。

2、如果你将一个DATETIME或TIMESTAMP值赋给一个DATE对象,结果值的时间部分被删除,

因为DATE类型不存储时间信息。

3、尽管DATETIME, DATE和TIMESTAMP值全都可以用同样的格式集来指定,

但所有类型不都有同样的值范围。

例如,TIMESTAMP值不能比1970早,也不能比2037晚,这意味着,一个日期例如'1968-01-01',

当作为一个DATETIME或DATE值时它是合法的,但它不是一个正确TIMESTAMP值!

并且如果将这样的一个对象赋值给TIMESTAMP列,它将被变换为0。 www.2cto.com

*当指定日期值时,当心某些缺陷: *

1、允许作为字符串指定值的宽松格式能被欺骗。例如,,因为“:”分隔符的使用,

值'10:11:12'可能看起来像时间值,但是如果在一个日期中使用,上下文将作为年份被

解释成'2010-11-12'。值'10:45:15'将被变换到'0000-00-00',因为'45'不是一个合法的月份。

2、以2位数字指定的年值是模糊的,因为世纪是未知的。MySQL使用下列规则解释2位年值:

在00-69范围的年值被变换到2000-2069。 在范围70-99的年值被变换到1970-1999。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11231485.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存