在这篇文章中,我们将为您详细介绍通过SQL更新单个记录并获取已更新记录的ID的最佳方法是什么?的内容,并且讨论关于Java/MSSQL的相关问题。此外,我们还会涉及一些关于ibatis自动生成键sel
在这篇文章中,我们将为您详细介绍通过SQL更新单个记录并获取已更新记录的ID的最佳方法是什么?的内容,并且讨论关于Java / MSSQL的相关问题。此外,我们还会涉及一些关于ibatis 自动生成键 selectkey(Oracle、MYSQL、MSSQL、SQLITE)、Java / MSSQL:java.sql.SQLException无效的对象名称“ TableName”、java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结、Linux 系统下 ThinkPHP5 链接 MsSQL的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 通过SQL更新单个记录并获取已更新记录的ID的最佳方法是什么?(Java / MSSQL)
- ibatis 自动生成键 selectkey(Oracle、MYSQL、MSSQL、SQLITE)
- Java / MSSQL:java.sql.SQLException无效的对象名称“ TableName”
- java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结
- Linux 系统下 ThinkPHP5 链接 MsSQL
通过SQL更新单个记录并获取已更新记录的ID的最佳方法是什么?(Java / MSSQL)
我知道我可以像这样更新一条记录-但是如何获取已更新记录的ID?(我正在使用MSSQL,所以不能使用Oracle的RowId)
update myTableset myCol = ''foo''where itemId in (select top 1 itemId from myTable )
如果我要执行插入操作,则可以使用getGeneratedKeys来获取id字段值,但是我不认为有等效的更新吗?
我知道我可以使用可滚动的结果集来做我想做的事
即
stmt = conn.prepareStatement("select top 1 myCol, itemId from myTable", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);ResultSet resultSet = stmt.executeQuery();if(resultSet.first()){ resultSet.updateString(1, "foo"); resultSet.updateRow(); String theItemId = resultSet.getString(1)}resultSet.close();
但是我担心性能,因为测试显示负载下的锁定超时,我想知道是否有更好/更简单的方法?
-编辑:为了最终解决这个问题…当我们迁移到MSSQL2005时,我们将升级代码以使用Rich的答案。在当前版本中,我们使用了锁定提示:(UPDLOCK ROWLOCK READPAST)来减轻原始代码显示的性能问题。
答案1
小编典典这个例子在MSSQL 2005中确实很好用…
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGODROP TABLE [dbo].[TEST_TABLE]GOCREATE TABLE [dbo].[TEST_TABLE]( [id] [int] IDENTITY(1,1) NOT NULL, [name] [nvarchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, CONSTRAINT [PK_TEST_TABLE] PRIMARY KEY CLUSTERED ( [id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]-- An insert which will return the identityINSERT INTO [dbo].[TEST_TABLE] ([name]) OUTPUT inserted.idVALUES(''Test 1'')-- Another insert which will return the identityINSERT INTO [dbo].[TEST_TABLE] ([name]) OUTPUT inserted.idVALUES(''Test 2'')-- Now an update which will return the identityUPDATE [dbo].[TEST_TABLE]SET [name] = ''Updated Test 1''OUTPUT inserted.idWHERE [name] = ''Test 1''SELECT id, [name] FROM [dbo].[TEST_TABLE]
更具体地说是您的查询…
update myTableset myCol = ''foo''output inserted.itemidwhere itemId in (select top 1 itemId from myTable )
ibatis 自动生成键 selectkey(Oracle、MYSQL、MSSQL、SQLITE)
我们在数据库插入一条数据的时候,经常是需要返回插入这条数据的主键。但是数据库供应商之间生成主键的方式都不一样。有些是预先生成 (pre-generate) 主键的,如 Oracle 和 PostgreSQL;有些是事后生成 (post-generate) 主键的,如 MySQL 和 SQL Server。但不管是哪种方式,我们都可以用 ibatis 的节点来获取语句所产生的主键。
oracle 例子:
<insert id="insertProduct-ORACLE" parameterClass="product">
<selectKey resultClass="int" type="pre" keyProperty="id" >
SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL
</selectKey>
insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)
</insert>
sql-server 例子:
<insert id="insertProduct-MS-SQL" parameterClass="product">
insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
<selectKey resultClass="int" type="post" keyProperty="id" >
select @@IDENTITY as value
</selectKey>
</insert>
mysql 例子:
<insert id="insertProduct-MYSQL" parameterClass="product">
insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
<selectKey resultClass="int" type="post" keyProperty="id" >
select LAST_INSERT_ID() as value
</selectKey>
</insert>
SQLite 例子:
<insert id="Create" parameterClass="Subject">
INSERT INTO SUBJECT
(SubjectName,QuestionCount,IsNowPaper)
VALUES(#SubjectName#,#QuestionCount#,#IsNowPaper#)
<selectKey resultClass="int" type="post" property="SubjectId">
SELECT seq
FROM sqlite_sequence
WHERE (name = ''SUBJECT'')
</selectKey>
</insert>
注意:name = ''SUBJECT''中SUBJECT为表名称
Java / MSSQL:java.sql.SQLException无效的对象名称“ TableName”
我正在尝试将Java应用程序从旧服务器移动到新服务器。该应用程序在Tomcat上运行,使用Microsoft SQL
Server作为后端数据库,并使用在数据源(ODBC)中定义的系统DSN来确定连接到的位置。旧服务器使用Windows 2000 / SQL Server
2000,新服务器使用Windows 2003 / SQL Server 2005。
服务器之间的ODBC定义相同,并且定义了要使用的数据库。
在新服务器上,当用户尝试登录时,stdout.log中将显示以下内容:
正在检查用户 错误:java.sql.SQLException:[Microsoft] [ODBC SQL Server驱动程序] [SQL
Server]对象名称’UserTable’无效。
DB中确实存在一个名为 UserTable 的表,但通过管理界面显示为“ dbo.USerTable ”。
我应该调整一下MSSQL中的某个设置,以使其对“ dbo”感到满意。缺少前缀,或者还有其他我想念的东西?
[编辑]使用Windows身份验证,并且作为故障排除步骤,已将公共角色和来宾角色赋予数据库所有权限。
答案1
小编典典数据库登录是否不同?dbo“前缀”只是对象所定义的架构。因此,如果您的ODBC连接器使用dbo凭据登录,则该对象应位于其默认架构中。
java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结
在 web 开发中,避免不了对日期的操作,就几种常见的日期操作做个总结 (部分参考网络,在此表示感谢):
java.util.Date、Java.util.Calendar、java.sql.Date、java.sql.Time、java.sql.Timestamp
java.lang.Object
....|__java.util.Date
..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time
....|__java.security.Timestamp
java.util.Date 日期格式为:年月日时分秒
java.sql.Date 日期格式为:年月日 [只存储日期数据不存储时间数据]
java.sql.Time 日期格式为:时分秒
java.sql.Timestamp 日期格式为:年月日时分秒纳秒(毫微秒)
关系:
java.util.Date 这个类是 java.sql.Date, java.sql.Time, java.slq.Timestamp 这三个类的父类。这三个类对 java.util.Date 类进行了包装。
联系:
java.sql.Date 类屏蔽了 java.util.Date 类的时间有关的方法(形如:hh:mm:ss), 因此,不可以通过这个类访问时间有关的信息,比如,如果你通过 sqlDate.getHour () 方法去访问小时信息,此方法会抛出一个 IllegalArgumentException
异常。这是因为java.sql.Date在继承java.util.Date类的时候对父类进行了重写,禁用了时间访问的方法。之所以这么处理,是为了和数据库的Date数据类型相匹配,数据库的Date数据类行只是保存日期有关的字段。
Java.sql.Time 类屏蔽了 java.util.Date 的日期有关的字段(形如:yyyy-MM-dd), 因此,不能通过这个类访问日期有关的信息,比如:如果你通过 sqlTime.getYear () 方法去获取年有关的信息,此方法会抛出一个 IllegalArgumentException
异常。这是因为java.sql.Time在继承java.util.Date类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的Time数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。
Java.sql.Timestamp
字段则对java.util.Date这个类进行了扩充,它在java.util.Date类的基础上增加了毫秒的时间访问控制,因此,你可以通过
getNanos()方法去获取时间的毫微秒数(注意此处获取的时间是以毫微秒为单位的,1 秒等于十亿毫微秒),同样的,这也是为了和数据库中的 Timestamp 数据类型进行匹配。
理清了上述四个类的关系,那么 java.util.Date 和 java.util.Calendar 类有什么关系呢?
Java.util.Calendar 类是 java.util.Date 类的一个更加深入,更加全面的替代。Java.util.Calendar 类支持 java.util.Date 的所有功能,此外,Calendar 还引入了多语言,多区域的特性,可以根据需要获取不同区域,不同时区的时间,Calendar 还增加了比 Date 更加方便和快捷的许多操作,如获取一年当中的第几个星期,各个月的天数等便捷的方法。
注意:
Java.util.Calendar 区别与 java.util.Date 的几个地方也需要注意一下:首先,Calendar 增加了毫秒的时间段,通过它可以获取时间点的毫秒值,而 java.util.Date 只是精确到秒。其次,Calendar 过去年的时候是当前年份比如:2010,而 Date 获取年份的时获取到的是当前年份 - 1900 的一个值(2010-1900=110,因此,你调用 getYear 后过去的值就是 110)。最后 Calendar 是一个抽象类,之所以能够实例化,是因为此处的 Calendar 充当了一个类似于工厂的作用,在 getInstance 方法中实例化了 Calendar 子类 GregorianCalendar,并把它返回给用户使用。
针对不同的数据库选用不同的日期类型
・Oracle 的 Date 类型,只需要年月日,选择使用 java.sql.Date 类型
・MS Sqlserver 数据库的 DateTime 类型,需要年月日时分秒,选择 java.sql.Timestamp 类型
String 日期格式转换成 Date 日期格式
//java.util.Date 时间格式的转换
SimpleDateFormat f_utilDate=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str="2011-5-31 14:40:50";
try {
java.util.Date utilDate=f_utilDate.parse(str);
System.out.println(f_utilDate.format(utilDate));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//java.sql.Date 时间格式的转换
SimpleDateFormat f_sqlDate=new SimpleDateFormat("yyyy-MM-dd");
java.sql.Date sqlDate = java.sql.Date.valueOf("2010-08-20");
System.out.println(f_sqlDate.format(sqlDate));
//java.sql.Time sqltime 时间格式的转换
SimpleDateFormat f_sqlTime=new SimpleDateFormat("hh:mm:ss");
java.sql.Time sqltime = java.sql.Time.valueOf("13:44:53");
System.out.println(f_sqlTime.format(sqltime));
//java.sql.Timestamp 时间格式的转换
SimpleDateFormat f_timestamp=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2010-08-20 14:06:27.186");
System.out.println(f_timestamp.format(timestamp));
//java.util.Date 转换成 java.sql.Date 格式
try{
SimpleDateFormat DateFormate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
java.util.Date date1 = DateFormate.parse("2011-5-31 14:40:50");
java.sql.Date sqlDate = new java.sql.Date(date1.getTime());
System.out.println(DateFormate.format(sqlDate));
}catch (Exception ex) {
System.out.println(ex.getMessage());
}
//java.sql.Date 转换成 java.util.Date 格式
java.sql.Date sqlDate1=java.sql.Date.valueOf("2005-12-12");
java.util.Date utilDate1=new java.util.Date(sqlDate1.getTime());
System.out.println ("java.sql.Date 转换成 java.util.Date 格式:"+f.format (utilDate1));
//java.util.Date 转换 java.sql.Timestamp
new java.sql.Timestamp (new java.util.Date ().getTime ());// 此处 IDE 报错
//java.util.Date 转换 java.sql.Time
new java.sql.Time(new java.util.Date().getTime());
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
我们可以使用 DateFormat 处理字符串来定义时间日期的格式
注:String 都是先转换为 java.util.Date,然后再转换成所需的格式
try{
String dateString = "2010-08-20 12:00:00.125";
DateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd kk:mm:ss.SSS",Locale.ENGLISH);// 设定格式
dateFormat.setLenient(false);
java.util.Date utilDate = dateFormat.parse (dateString);//util 类型
java.sql.Timestamp dateTime = new java.sql.Timestamp (utilDate.getTime ());//Timestamp 类型,timeDate.getTime () 返回一个 long 型
System.out.println(dateTime);
}catch(Exception ex){
ex.printStackTrace();
}
Java MySQL 数据类型对照
类型名称 | 显示长度 | 数据库类型 | JAVA 类型 | JDBC 类型索引 (int) | 描述 |
VARCHAR | L+N | VARCHAR | java.lang.String | 12 | |
CHAR | N | CHAR | java.lang.String | 1 | |
BLOB | L+N | BLOB | java.lang.byte[] | -4 | |
TEXT | 65535 | VARCHAR | java.lang.String | -1 | |
INTEGER | 4 | INTEGER UNSIGNED | java.lang.Long | 4 | |
TINYINT | 3 | TINYINT UNSIGNED | java.lang.Integer | -6 | |
SMALLINT | 5 | SMALLINT UNSIGNED | java.lang.Integer | 5 | |
MEDIUMINT | 8 | MEDIUMINT UNSIGNED | java.lang.Integer | 4 | |
BIT | 1 | BIT | java.lang.Boolean | -7 | |
BIGINT | 20 | BIGINT UNSIGNED | java.math.BigInteger | -5 | |
FLOAT | 4+8 | FLOAT | java.lang.Float | 7 | |
DOUBLE | 22 | DOUBLE | java.lang.Double | 8 | |
DECIMAL | 11 | DECIMAL | java.math.BigDecimal | 3 | |
BOOLEAN | 1 | 同 TINYINT | |||
ID | 11 | PK (INTEGER UNSIGNED) | java.lang.Long | 4 | |
DATE | 10 | DATE | java.sql.Date | 91 | |
TIME | 8 | TIME | java.sql.Time | 92 | |
DATETIME | 19 | DATETIME | java.sql.Timestamp | 93 | |
TIMESTAMP | 19 | TIMESTAMP | java.sql.Timestamp | 93 | |
YEAR | 4 | YEAR | java.sql.Date | 91 |
对于 bolb,一般用于对图片的数据库存储,原理是把图片打成二进制,然后进行的一种存储方式,在 java 中对应 byte[]数组。
对 Boolean 类型的解释
mysql 不支持 bool 类型。
1 2 3 4 5 |
|
这样可以创建成功,但检查表结构会发现 mysql 把它替换成 tinyint (1)。
即当把一个数据设置成 bool 类型的时候,数据库会自动转换成 tinyint (1) 的数据类型,其实这个就是变相的 bool。 默认值也就是 1,0 两种,分别对应了 bool 的 true 和 false
在 Java 对应的 POJO 类中,可以根据实际情况使用 java.lang.Boolean 或者 java.lang.Integer。
转自:
http://langgufu.iteye.com/blog/2202744
https://yq.aliyun.com/articles/38115
Linux 系统下 ThinkPHP5 链接 MsSQL
案例
CentOS6.8 系统 ThinkPHP5 链接 MsSQL 数据库。
分析
ThinkPHP5 提供了 Mysql、Pgsql、Sqlite 和 Sqlsrv 四种数据库驱动。Window 系统下有现成的 php_sqlsrv.dll 扩展可用,但 Linux 系统中没有 (本人没有找到)。
尝试 1 未成功,写来以备其它用途
安装 freetds
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz
tar -zxvf freetds-patched.tar.gz
cd freetds-*
./configure --prefix=/usr/local/freetds --with-tdsver=auto --enable-msdblib --with-gnu-ld --enable-shared --enable-static
make && make install
安装 mssql
wget http://cn2.php.net/distributions/php-5.6.22.tar.gz
tar -zxvf php-5.6.22.tar.gz
cd php-*/ext/mssql
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-mssql=/usr/local/freetds
make && make install
修改 php.ini,添加如下配置 (路径请根据环境不同而定)
extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/mssql.so"
修改 ThinkPHP5 配置文件 database.php
// 数据库类型
''type'' => ''sqlsrv'',
// 服务器地址
''hostname'' => ''192.168.1.210'',
// 数据库名
''database'' => ''dbname'',
// 用户名
''username'' => ''sa'',
// 密码
''password'' => ''123456'',
// 端口
''hostport'' => ''1433'',
测试
这种方式在 ThinkPHP 中是行不通的,在其它应用环境可以。
尝试 2 成功
安装 freetds
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz
tar -zxvf freetds-patched.tar.gz
cd freetds-*
./configure --prefix=/usr/local/freetds --with-tdsver=auto --enable-msdblib --with-gnu-ld --enable-shared --enable-static
make && make install
安装 pdo_dblib
wget http://cn2.php.net/distributions/php-5.6.22.tar.gz
tar -zxvf php-5.6.22.tar.gz
cd php-*/ext/pdo_dblib
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-dblib=/usr/local/freetds
make && make install
修改 php.ini,添加如下配置 (路径请根据环境不同而定)
extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/pdo_dblib.so"
修改 ThinkPHP5 配置文件 database.php
// 数据库类型
''type'' => ''dblib'',
// 服务器地址
''hostname'' => ''192.168.1.210'',
// 数据库名
''database'' => ''dbname'',
// 用户名
''username'' => ''sa'',
// 密码
''password'' => ''123456'',
// 端口
''hostport'' => ''1433'',
下载 ThinkPHP 数据库驱动 Dblib 文件
将文件拷贝到 thinkphp/library/think/db
目录。
测试
成功。
关于通过SQL更新单个记录并获取已更新记录的ID的最佳方法是什么?和Java / MSSQL的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ibatis 自动生成键 selectkey(Oracle、MYSQL、MSSQL、SQLITE)、Java / MSSQL:java.sql.SQLException无效的对象名称“ TableName”、java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结、Linux 系统下 ThinkPHP5 链接 MsSQL等相关知识的信息别忘了在本站进行查找喔。
本文标签: