【hibernate/JPA】注解方式实现 复合主键【spring boot】

摘要:
2》 主键类的几个要求:1。使用复合主键的实体类必须实现Serializable接口。打开Hibernate的帮助文档,我们可以找到get和load方法的声明形式如下:ObjectloadObjectget当我们找到复合主键类的对象时,我们需要将主键值传递给get()或load()方法的id参数,而id参数只能接收实现Serializable接口的对象。3》 在hibernate/JPA注释方法中有三种实现复合主键的方法。1.@Embedded+@Id+@Embedded(@Embedded表示该类可以嵌入到其他类中,通常表示其他类的属性。

1》hibernate/JPA实现复合主键的思路:是将所有的主键属性封装在一个主键类中,提供给需要复合主键的实体类使用。

2》主键类的几点要求:

1. 使用复合主键的实体类必须实现Serializable接口。
必须实现Serializable接口的原因很简单,我们查找数据的时候是根据主键查找的。打开Hibernate的帮助文档我们可以找到get与load方法的声明形式如下:
Object load(Class theClass,Serializable id)
Object get(Class theClass,Serializable id)
当我们查找复合主键类的对象时,需要传递主键值给get()或load()方法的id参数,而id参数只能接收一个实现了Serializable接口的对象。而复合主键类的主键不是一个属性可以表示的,所以只能先new出复合主键类的实例(例如:new People()),然后使用主键属性的set方法将主键值赋值给主键属性,然后将整个对象传递给get()或load()方法的id参数,实现主键值的传递,所以复合主键的实体类必须实现Serializable接口。

2. 使用复合主键的实体类必须重写equals和hashCode方法。必须重写equals和hashCode方法也很好理解。这两个方法使用于判断两个对象(两条记录)是否相等的。为什么要判断两个对象是否相等呢?因为数据库中的任意两条记录中的主键值是不能相同的,所以我们在程序中只要确保了两个对象的主键值不同就可以防止主键约束违例的错误出现。也许这里你会奇怪为什么不使用复合主键的实体类不重写这两个方法也没有主键违例的情况出现,这是因为使用单一主键方式,主键值是Hibernate来维护的,它会确保主键不会重复,而复合主键方式,主键值是编程人员自己维护的,所以必须重写equals和hashCode方法用于判断两个对象的主键是否相同。

3. 重写的equals和hashCode方法,只与主键属性有关,普通属性不要影响这两个方法进行判断。这个原因很简单,主键才能决定一条记录,其他属性不能决定一条记录。

4.主键类必须有默认的public无参数的构造方法

3》hibernate/JPA注解方式实现复合主键的方式有三种

1、@Embeddable + @Id + @Embedded(@Embeddable 表示这个类可以嵌入到别的类中去,常以表示其他类的某个属性。@Embedded 它和 @Embeddable 正好相反,它用来表示某个属性是被嵌入进来的。)

2、@Embeddable + @EmbeddedId(@EmbeddedId = @Embedded + @Id)

3、@IdClass + @Id

==========================================第一种注解方式实现复合主键:@Embeddable + @Id + @Embedded====================================================

1》写一个主键类ModelKey【这个主键类有点BUG,想要正确的例子,直接看下面】

【hibernate/JPA】注解方式实现 复合主键【spring boot】第1张【hibernate/JPA】注解方式实现 复合主键【spring boot】第2张
package com.sxd.swapping.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;
import java.util.Objects;

/**
 * 本类 作为 复合主键类 供某个需要复合主键的类使用
 * 必须提供
 * 1》get/set方法
 * 2》无参/全参构造
 * 3》重写equals()、hashCode()方法
 * 4》实现Serializable接口
 *
 * 这里重写的equals()和hashCode()可以在idea中 alt+insert快捷键选择模板进行重写
 */
@Embeddable
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ModelKey implements Serializable{

    private static final long serialVersionUID = -2397232644712659217L;

    private String key1;


    private String key2;


    private String key3;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ModelKey modelKey = (ModelKey) o;
        return Objects.equals(key1, modelKey.key1) &&
                Objects.equals(key2, modelKey.key2) &&
                Objects.equals(key3, modelKey.key3);
    }

    @Override
    public int hashCode() {

        return Objects.hash(key1, key2, key3);
    }
}
View Code

2》实体类ModelEntity使用主键类作为复合主键

【hibernate/JPA】注解方式实现 复合主键【spring boot】第1张【hibernate/JPA】注解方式实现 复合主键【spring boot】第4张
package com.sxd.swapping.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;

@Entity
@Table(name = "model_entity")
@Getter
@Setter
public class ModelEntity{

    @Id
    @Embedded
    private ModelKey modelKey;

    @Column(name = "user_name")
    private String userName;

    @Column(name = "password")
    private String password;

}
View Code

在启动创建过程中,报错:

【hibernate/JPA】注解方式实现 复合主键【spring boot】第1张【hibernate/JPA】注解方式实现 复合主键【spring boot】第6张
2018-05-14 14:23:51.949  INFO 7156 --- [  restartedMain] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Hibernate: drop table if exists hua_yang_area
Hibernate: drop table if exists model_entity
Hibernate: create table hua_yang_area (id bigint not null auto_increment, create_date datetime not null, create_id varchar(255) not null, uid varchar(255) not null, update_date datetime, update_id varchar(255), area_name varchar(255) not null, area_person bigint not null, primary key (id)) engine=MyISAM
Hibernate: create table model_entity (key1 varchar(255) not null, key2 varchar(255) not null, key3 varchar(255) not null, password varchar(255), user_name varchar(255), primary key (key1, key2, key3)) engine=MyISAM
2018-05-14 14:23:52.385  WARN 7156 --- [  restartedMain] o.h.t.s.i.ExceptionHandlerLoggedImpl     : GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:440) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:424) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:315) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:155) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:312) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:460) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892) [hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) [spring-orm-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) [spring-orm-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) [spring-orm-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) [spring-orm-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) [spring-orm-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1761) [spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1698) [spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:579) [spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501) [spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) [spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) [spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) [spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1089) ~[spring-context-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:859) ~[spring-context-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395) ~[spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) ~[spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) ~[spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) ~[spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at com.sxd.swapping.SwappingApplication.main(SwappingApplication.java:10) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_171]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.0.1.RELEASE.jar:2.0.1.RELEASE]
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 1000 bytes
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_171]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_171]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_171]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_171]
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2482) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2440) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:845) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:745) ~[mysql-connector-java-5.1.46.jar:5.1.46]
    at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95) ~[HikariCP-2.7.8.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-2.7.8.jar:na]
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    ... 39 common frames omitted
View Code

所以,需要制定创建复合主键的字段长度

只需要保证复合主键的长度总和在【1000bytes/8 = 125】以内即可。

修改:【正确的主键类ModelKey】

【hibernate/JPA】注解方式实现 复合主键【spring boot】第1张【hibernate/JPA】注解方式实现 复合主键【spring boot】第8张
package com.sxd.swapping.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;
import java.util.Objects;

/**
 * 本类 作为 复合主键类 供某个需要复合主键的类使用
 * 必须提供
 * 1》get/set方法
 * 2》无参/全参构造
 * 3》重写equals()、hashCode()方法
 * 4》实现Serializable接口
 *
 * 这里重写的equals()和hashCode()可以在idea中 alt+insert快捷键选择模板进行重写
 */
@Embeddable
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ModelKey implements Serializable{

    private static final long serialVersionUID = -2397232644712659217L;
    @Column(length = 36)
    private String key1;

    @Column(length = 36)
    private String key2;

    @Column(length = 36)
    private String key3;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ModelKey modelKey = (ModelKey) o;
        return Objects.equals(key1, modelKey.key1) &&
                Objects.equals(key2, modelKey.key2) &&
                Objects.equals(key3, modelKey.key3);
    }

    @Override
    public int hashCode() {

        return Objects.hash(key1, key2, key3);
    }
}
View Code

再次启动,成功执行DDL语句,查看数据表,复合主键已经创建成功。

【hibernate/JPA】注解方式实现 复合主键【spring boot】第9张

==========================================第二种注解方式实现复合主键:@Embeddable +@EmbeddedId====================================================

 1》ModelKey主键表不变

【hibernate/JPA】注解方式实现 复合主键【spring boot】第1张【hibernate/JPA】注解方式实现 复合主键【spring boot】第11张
package com.sxd.swapping.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;
import java.util.Objects;

/**
 * 本类 作为 复合主键类 供某个需要复合主键的类使用
 * 必须提供
 * 1》get/set方法
 * 2》无参/全参构造
 * 3》重写equals()、hashCode()方法
 * 4》实现Serializable接口
 *
 * 这里重写的equals()和hashCode()可以在idea中 alt+insert快捷键选择模板进行重写
 */
@Embeddable
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ModelKey implements Serializable{

    private static final long serialVersionUID = -2397232644712659217L;
    @Column(length = 36)
    private String key1;

    @Column(length = 36)
    private String key2;

    @Column(length = 36)
    private String key3;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ModelKey modelKey = (ModelKey) o;
        return Objects.equals(key1, modelKey.key1) &&
                Objects.equals(key2, modelKey.key2) &&
                Objects.equals(key3, modelKey.key3);
    }

    @Override
    public int hashCode() {

        return Objects.hash(key1, key2, key3);
    }
}
View Code

2》ModelEntity实体表中使用@EmbeddedId注解

【hibernate/JPA】注解方式实现 复合主键【spring boot】第1张【hibernate/JPA】注解方式实现 复合主键【spring boot】第13张
package com.sxd.swapping.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;

@Entity
@Table(name = "model_entity")
@Getter
@Setter
public class ModelEntity{

    @EmbeddedId
    private ModelKey modelKey;

    @Column(name = "user_name")
    private String userName;

    @Column(name = "password")
    private String password;

}
View Code

==========================================第三种注解方式实现复合主键:@IdClass + @Id====================================================

1》ModelKey主键类取消注解@Embeddable

【hibernate/JPA】注解方式实现 复合主键【spring boot】第1张【hibernate/JPA】注解方式实现 复合主键【spring boot】第15张
package com.sxd.swapping.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.Column;
import java.io.Serializable;
import java.util.Objects;

/**
 * 本类 作为 复合主键类 供某个需要复合主键的类使用
 * 必须提供
 * 1》get/set方法
 * 2》无参/全参构造
 * 3》重写equals()、hashCode()方法
 * 4》实现Serializable接口
 *
 * 这里重写的equals()和hashCode()可以在idea中 alt+insert快捷键选择模板进行重写
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ModelKey implements Serializable{

    private static final long serialVersionUID = -2397232644712659217L;
    @Column(length = 32)
    private String key1;

    @Column(length = 32)
    private String key2;

    @Column(length = 32)
    private String key3;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ModelKey modelKey = (ModelKey) o;
        return Objects.equals(key1, modelKey.key1) &&
                Objects.equals(key2, modelKey.key2) &&
                Objects.equals(key3, modelKey.key3);
    }

    @Override
    public int hashCode() {

        return Objects.hash(key1, key2, key3);
    }
}
View Code

2》ModelEntity实体类使用@IdClass(value = ModelKey.class)标明使用哪个类作为主键类和@Id分别标记主键属性

【hibernate/JPA】注解方式实现 复合主键【spring boot】第1张【hibernate/JPA】注解方式实现 复合主键【spring boot】第17张
package com.sxd.swapping.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;

@IdClass(value = ModelKey.class)
@Entity
@Table(name = "model_entity")
@Getter
@Setter
public class ModelEntity{


    @Id
    private String key1;

    @Id
    private String key2;

    @Id
    private String key3;

    @Column(name = "user_name")
    private String userName;

    @Column(name = "password")
    private String password;

}
View Code

这里修改了主键类三个属性的长度,可以看到数据库中,已经修改成功!

【hibernate/JPA】注解方式实现 复合主键【spring boot】第18张

===================================最后,实体类的多个字段建立唯一索引,达到复合主键的效果=================================

 当然,一般情况下不推荐使用复合主键,或者不用实现复合主键,对实体类的多个字段建立唯一索引,同样能达到想要的效果

地址:http://www.cnblogs.com/sxdcgaq8080/p/9036249.html

有兴趣可以了解一下!!

免责声明:文章转载自《【hibernate/JPA】注解方式实现 复合主键【spring boot】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【spring boot】mybatis启动报错:Consider defining a bean of type 'com.newhope.interview.dao.UserMapper' in your configuration. 【Mapper类不能被找到】@Mapper 和@MapperScan注解的区别【powerdesign】从mysql数据库导出到powerdesign,生成数据字典下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql学习笔记二

什么是数据库 //关系型数据库 , 依照某种数据模型组织起来并存放二级存储器中的数据集合。 MySQL数据库的三层结构 // B/W/D MySQL数据库的安装和配置 // 数据库软件和服务及客户端的区别,步骤和主要配置项。 数据库命令行的常见操作(启动、连接、操作、关闭等) 启动一般是指启动服务。可以是命令行的方式启动,参...

超越MySQL:三个流行MySQL分支的对比

超越MySQL:三个流行MySQL分支的对比 - 数据库 - 软件研发频道 - CSDN.NET 超越MySQL:三个流行MySQL分支的对比 2011-12-29 16:14 |7560次阅读 |来源:IBM开发者社区【已有6条评论】发表评论 关键词:MySQL |作者:Michael Abernethy |收藏这篇资讯 导读:尽管MySQL是最受...

第一章 初始MyBatis

第一章 初始MyBatis SpringMVC+Spring+MyBatis框架 1.简历制作使用模板的好处: 不用考虑布局,排版等。提高效率 可专心在简历内容上 结构统一,便于人事阅读 新手也可以做出专业的简历 框架技术 是一个应用程序的半成品 提供可重用的公共结构 按一定规则组织的一组组件 优势: 不用再考虑公共问题 专心在业务实现上 结构统一,易于...

如何查找MySQL中查询慢的SQL语句

更多 https://www.cnblogs.com/qmfsun/p/4844472.html 如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_...

【转】shell处理mysql增删改查

这几天做一个任务,比对两个数据表中的数据,昨天用PHP写了一个版本,但考虑到有的机器没有php或者php没有编译mysql扩展,就无法使用mysql系列的函数,脚本就无效了,今天写个shell版本的,这样,在所有linux系列机器上就都可以运行了。 shell操作mysql其实就是通过mysql命令通过参数去执行语句,跟其他程序里面是一样的,看看下面这个参...

MySQL中的各种引擎

数据库中的存储引擎其实是对使用了该引擎的表进行某种设置,数据库中的表设定了什么存储引擎,那么该表在数据存储方式、数据更新方式、数据查询性能以及是否支持索引等方面就会有不同的“效果”。在MySQL数据库中存在着多种引擎(不同版本的MySQL数据库支持的引擎不同),熟悉各种引擎才能在软件开发中应用引擎,从而开发出高性能的软件,MySQL数据库中的引擎有哪些呢?一...