
首先mysql 没有guid()函数,oracle才有,mysql的是 uuid()函数,使用方法是:
insert into pub_attachments(vchr_id,vchr_domain)) values(uuid(),'ibm');mybatis自增主键配置:mybatis进行插入 *** 作时,如果表的主键是自增的,针对不同的数据库相应的 *** 作也不同。基本上经常会遇到的就是OracleSequece和Mysql自增主键。主要说明下在mybatis中对于自增主键的配置。1、不返回自增主键值:如果考虑到插入数据的主键不作为其他表插入数据的外键使用,可以考虑这种方式。OracleSequence配置TEST_USERSEQ_TEST_USER_IDnextval insert into (ID,NAME,AGE) values ( ,#{name}, #{age} ) 当插入语句如上配置时,那么针对如下语句 User user = new User(); usersetName("test"); usersetAge(24); userMapperinsert(user); Systemoutprintln(userid); // userid 为空userid为空,也就是说如上的配置并不能在完成插入 *** 作后将插入时的主键值存放到保存的对象中。2、Mysql自增主键配置由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。TEST_USER insert into (NAME,AGE) values (#{name}, #{age} )同样,针对Mysql如此配置mybaits,插入完成后userid为空。插入后获取自增主键值:上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的来单独配置针对自增逐渐的处理。1、OracleSequence配置:TEST_USER SEQ_TEST_USER_IDnextval select from dual insert into (ID,NAME,AGE) values ( #{id}, #{name}, #{age} ) 当使用了后,在实际的插入 *** 作时,mybatis会执行以下两句SQL:select SEQ_TEST_USER_IDnextval from dual; // 语句1 insert into (ID,NAME,AGE) values ( , , ); // 语句2在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后User user = new User(); usersetName("test"); usersetAge(24); userMapperinsert(user); Systemoutprintln(userid); // userid 不为空userid是有值的。2、Mysql自增主键配置针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,TEST_USER insert into ( NAME, AGE ) values ( #{name}, #{age} ) 当然,由于Mysql的自增主键可以通过SQL语句select LAST_INSERT_ID();来获取的。因此针对Mysql,Mybatis也可配置如下:TEST_USER SELECT LAST_INSERT_ID() insert into (ID,NAME,AGE) values ( #{id}, #{name}, #{age} ) 只不过该中配置需要额外的一条查询SQL小结当数据插入 *** 作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销当执行插入 *** 作后需要立即获取插入的自增主键值,比如一次 *** 作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置
mybatis连mysql的url怎么写
最近公司项目要使用myBatis,自己以前没有接触过,就在网上找到了一些资料研究了些。初步做出了基于myBatis连接mysql数据库的jdbc实现的功能。
employeejava
package comorgpositionmodel;
public class employee {
private int employeeId;// 员工id
private String employeeName; //员工姓名
private String employeeSax; //员工性别
private String employeePost; //员工职务
private String employeeDepartment; //员工所在部门
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
thisemployeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
thisemployeeName = employeeName;
}
public String getEmployeeSax() {
return employeeSax;
}
public void setEmployeeSax(String employeeSax) {
thisemployeeSax = employeeSax;
}
public String getEmployeePost() {
return employeePost;
}
public void setEmployeePost(String employeePost) {
thisemployeePost = employeePost;
}
public String getEmployeeDepartment() {
return employeeDepartment;
}
public void setEmployeeDepartment(String employeeDepartment) {
thisemployeeDepartment = employeeDepartment;
}
}
import javasqlConnection ;
import javasqlDriverManager ;
import javasqlSQLException ;
public class ConnectionDemo{
// 定义MySQL的数据库驱动程序
public static final String DBDRIVER = "orggjtmmmysqlDriver" ;
// 定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/mldn" ;
// MySQL数据库的连接用户名
public static final String DBUSER = "root" ;
// MySQL数据库的连接密码
public static final String DBPASS = "mysqladmin" ;
public static void main(String args[]){
Connection conn = null ; // 数据库连接
try{
ClassforName(DBDRIVER) ; // 加载驱动程序
}catch(ClassNotFoundException e){
eprintStackTrace() ;
}
try{
conn = DriverManagergetConnection(DBURL,DBUSER,DBPASS) ;
}catch(SQLException e){
eprintStackTrace() ;
}
Systemoutprintln(conn) ; // 如果此时可以打印表示连接正常
try{
connclose() ; // 数据库关闭
}catch(SQLException e){
eprintStackTrace() ;
}
}
};
为什么mysql数据库对应的字段有数据但是使用mybatis取出是0 或null
首先换数据库,MySQL处理这个数量级数据比较吃力。推荐你用DB2 或ORACLE
如果不能换,检查一下存储引擎用InnoDB,如果是,检查
innodb_flush_log_at_trx_commit 这个选项,是否是1
如果是1 用SET AUTOCOMMIT = 0 ,提高数据修改速度
PHP优化需要
MySQL Slow Log 分析工具分析日志:mysqldumpslow或mysqlsla比较不错。
Explain/ DESC 分析SQL 的执行情况和SHOW PROCESSLIST
使用SHOW PROCESSLIST 看是否有锁表情况,
设置 mycnf 中的long-query-time 和log-slow-queries 记录服务器那些SQL执行速度比较慢
根据上述情况查看对对应的SQL语句进行优化
优化服务器性能,用RAID5(SAN),加内存本身的升级,提高硬盘I/O性能。
数据库总体性能优化:
数据表最好能拆成小表。
数据库切片,分到不用的服务器上,
数据库访问性能优化
修改mycnf, 下面是影响比较大的:
innodb_flush_log_at_trx_commit 设置为0
如果比下面值大就不用调整了:
query_cache_size 设置为16M
sort_buffer_size 设置为16M
record_buffer 设置为16M
key_buffer_size 设置为8M
innodb_buffer_pool_size 设置为32M
下面是建议设置的
table_cache 设置为512
read_buffer_size 设置为16M
myisam_sort_buffer_size设置为16M
innodb_additional_mem_pool_size 设置为128M
innodb_log_file_size 设置为256M
innodb_log_buffer_size设置为8M
数据库表优化,
1 建立相应的INDEX
2 统一编码,MySQL的默认编码是Latin1,不支持中文,需要把数据库的默认编码修改为gbk或者utf8
show variables like 'character%' 查看
另外表的编码也要与数据库统一
`ctrl+alt+shift+T`重构选区,可以将选区抽取成变量,方法等。不同的重构方式有 整合的REPL,由于JetBrains的加成可以实现很多与编辑器内相同的效果 整合
这个错误报文上写的很明确啊。就是在你那个数据库中gettreeobjsV4_result 表根本不存在。所以报的jdbc的错误啊。
你使用mysql fount 看一下 select from gettreeobjsV4_result
有没有问题。
mybatis自增主键配置:
mybatis进行插入 *** 作时,如果表的主键是自增的,针对不同的数据库相应的 *** 作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键。主要说明下在mybatis中对于自增主键的配置。
1、不返回自增主键值:
如果考虑到插入数据的主键不作为其他表插入数据的外键使用,可以考虑这种方式。
Oracle Sequence 配置
<sql id='TABLE_NAME'>TEST_USER</sql><sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_IDnextval</sql>
<!-- 注意这里直接调用sequence的nextval函数 -->
<insert id="insert" parameterType="User">
insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )
</insert>
当插入语句如上配置时,那么针对如下语句
User user = new User();usersetName("test");
usersetAge(24);
userMapperinsert(user);
Systemoutprintln(userid); // userid 为空
userid为空,也就是说如上的配置并不能在完成插入 *** 作后将插入时的主键值存放到保存的对象中。
2、Mysql自增主键配置
由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。
<sql id='TABLE_NAME'>TEST_USER</sql><!-- 注意这里的插入SQL中是没有指明ID字段的! -->
<insert id="insert" parameterType="User">
insert into <include refid="TABLE_NAME" /> (NAME,AGE)
values (#{name}, #{age} )
</insert>
同样,针对Mysql如此配置mybaits,插入完成后userid为空。
插入后获取自增主键值:
上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。
1、Oracle Sequence 配置:
<sql id='TABLE_NAME'>TEST_USER</sql><sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_IDnextval</sql>
<!-- 注意这里需要先查询自增主键值 -->
<insert id="insert" parameterType="User">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select <include refid="TABLE_SEQUENCE" /> from dual
</selectKey>
insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
values ( #{id}, #{name}, #{age} )
</insert>
当使用了<selectKey />后,在实际的插入 *** 作时,mybatis会执行以下两句SQL:
select SEQ_TEST_USER_IDnextval from dual; // 语句1insert into (ID,NAME,AGE) values ( , , ); // 语句2
在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后
User user = new User();usersetName("test");
usersetAge(24);
userMapperinsert(user);
Systemoutprintln(userid); // userid 不为空
userid是有值的。
2、Mysql自增主键配置
针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,
<sql id='TABLE_NAME'>TEST_USER</sql><insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User">
insert into <include refid="TABLE_NAME" /> ( NAME, AGE )
values ( #{name}, #{age} )
</insert>
当然,由于Mysql的自增主键可以通过SQL语句
select LAST_INSERT_ID();来获取的。因此针对Mysql,Mybatis也可配置如下:
<sql id='TABLE_NAME'>TEST_USER</sql><!-- 注意这里需要先查询自增主键值 -->
<insert id="insert" parameterType="User">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT LAST_INSERT_ID()
</selectKey>
insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
values ( #{id}, #{name}, #{age} )
</insert>
只不过该中配置需要额外的一条查询SQL
小结
当数据插入 *** 作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销
当执行插入 *** 作后需要立即获取插入的自增主键值,比如一次 *** 作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置
以上就是关于mybatis在xml中生成guid,插入到mysql数据库,sql怎么写全部的内容,包括:mybatis在xml中生成guid,插入到mysql数据库,sql怎么写、mybatis+mysql运行问题,一直提示Column 'id' not found.、mybatis连mysql的url怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)