ITエンジニアぽむのブログ

IT系で気になったことを書き留めておく備忘録です。仕事でよく使っているJavaと自宅で使っているLinuxについて書いていこうと思っています。同じお悩みをお持ちの方のお役に立てたら嬉しいです。

セッションファクトリーの便利な保存方法!

まえがき

SessionFactoryは、O/RマッパでEntityを取得するために必要になります。

(Entity操作を行うDaoは、すべてSessionFactoryをベースとして実装されています。他にEntityManagerを使う方法がありますが、ここではSessionFactoryにフォーカスしてお伝えしたいと思います。)

そのSessionFactoryをサーバ起動時に取得しておこうというのが今回の趣旨となります。

Dao使用時に毎回SessionFactoryを生成してしまうと、Daoを作成した分だけSessionFactory生成処理が必要になってきます。

その分、余分な処理が必要になってくるというわけです。

サーバ起動時に1度、SessionFactoryを生成しておけば、そのSessionFactoryを使い回すことで、余分な処理が必要なくなります!

ServletContextListenerの作成

ServletContextListenerを作成して、サーバ起動時にSessionFactoryをServletContextに保存する処理を追加します。

  • ServletContextListenerをインプリメントしてサーブレットコンテキストを取得しています。
  • hibernate.cfg.xmlから設定内容を読み込んでいます。
  • 設定内容からセッションファクトリーを取得しています。
  • サーブレットコンテキストにセッションファクトリーを保存しています。
package com.pom2019.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateListener implements ServletContextListener {
    private SessionFactory sessionFactory;

    public static final String KEY_NAME = HibernateListener.class.getName();

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        if (sessionFactory != null) {
            sessionFactory.close();
        }
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        try {
            //configures settings from hibernate.cfg.xml
            Configuration configuration = new Configuration().configure();
            StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties());
            SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());

            //save the Hibernate session factory into serlvet context
            arg0.getServletContext().setAttribute(KEY_NAME, sessionFactory);
            
            //ログの出力
            if (sessionFactory != null) {
                System.out.println("セッションファクトリーを取得できました!");
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

※28行目、29行目、30行目でSessionFactoryが取得できた場合は、ログ出力を行っています。

HibernateListenerをリスナー登録

web.xmlでHibernateListenerをリスナー登録して、サーバ起動時にHibernateListenerを呼び出すようにしています。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="struts_blank" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Struts Blank Convention</display-name>

    <listener>
        <listener-class>com.pom2019.Struts2Web.InitListener</listener-class>
    </listener>
    
    <listener>
        <listener-class>com.pom2019.listener.HibernateListener</listener-class>
    </listener>
    
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

実行結果

サーバを再起動して、SessionFactoryを取得できているか確認します。

8 10, 2019 5:30:03 午後 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 2959 ms
セッションファクトリーを取得できました!
8 10, 2019 5:30:10 午後 org.apache.catalina.startup.Catalina start
情報: Server startup in 6482 ms

無事、SessionFactoryを取得できていることが確認できました!

あとがき

SessionFactoryをServletContextに保存しておけば、いつでもSevletContextからSessionFactoryを取得することができます。

Dao操作を頻繁に行う、もしくはコードをシンプルにしたいなどといった場合に有効なので、よかったら活用して下さいね。

最後までお読み頂きありがとうございました。

自動生成したEntityをコンソール上に表示してみよう!

まえがき

自動生成したEntityを使って、テーブルの内容をコンソール上に表示するプログラムをご紹介したいと思います。

Hibernateツールをインストールし、Entityを自動生成する方法については下記リンクを参考にして下さいね。

pom2019.hatenablog.com

Hibernate4.3とMySQLを使ってデータを表示する、自動生成したEntityを使用しない方法については下記リンクを参考にして下さいね。

pom2019.hatenablog.com

開発環境

開発環境は下記の通りです。

Hibernate4.3.0.Final
MySQL8.0.16

hibernate.cfg.xmlの変更

hibernate.cfg.xmlに今回使用するEntityをマッピングします。

※20行目と21行目が今回追加したソースコードです。

※パスワードはマスキングしています。

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/TESTDB?useUnicode=true&amp;characterEncoding=UTF-8</property>
        <property name="connection.username">test</property>
        <property name="connection.password">****</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        
        <!-- Mapping file inclusion -->
        <mapping class="com.pom2019.entity.HouseholdAppliances"/>

    </session-factory>
</hibernate-configuration>

Entityクラスの変更

toStringメソッドをオーバーライドして、指定した文字列をコンソールに表示させます。

※追加コメントが今回追加したソースコードです。

package com.pom2019.entity;
// Generated 2019/07/13 21:16:35 by Hibernate Tools 4.3.5.Final

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * HouseholdAppliances generated by hbm2java
 */
@Entity
@Table(name = "HouseholdAppliances", catalog = "TESTDB")
public class HouseholdAppliances implements java.io.Serializable {

    private static final long serialVersionUID = 3713670612166968592L;
    private Integer id;
    private String householdAppliancesName;
    private Date purchaseDate;

    public HouseholdAppliances() {
    }

    public HouseholdAppliances(String householdAppliancesName, Date purchaseDate) {
        this.householdAppliancesName = householdAppliancesName;
        this.purchaseDate = purchaseDate;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)

    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "HouseholdAppliancesName", length = 100)
    public String getHouseholdAppliancesName() {
        return this.householdAppliancesName;
    }

    public void setHouseholdAppliancesName(String householdAppliancesName) {
        this.householdAppliancesName = householdAppliancesName;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "PurchaseDate", length = 10)
    public Date getPurchaseDate() {
        return this.purchaseDate;
    }

    public void setPurchaseDate(Date purchaseDate) {
        this.purchaseDate = purchaseDate;
    }

    /**
    * !!!追加!!!
    */
    @Override
    public String toString() {
        return "id:"+id+"\thouseholdAppliancesName:"+householdAppliancesName+"\tpurchaseDate:"+purchaseDate;
    }
}

メインメソッドの変更

最後にメインメソッドを変更して、HQLで取得したEntityをコンソール上に表示します。

package com.pom2019;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

import com.pom2019.entity.HouseholdAppliances;

public class App {

    public static void main(String[] args) {
        // configures settings from hibernate.cfg.xml
        Configuration configuration = new Configuration().configure();
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        SessionFactory sf = configuration.buildSessionFactory(builder.build());

        Session ss = sf.openSession();
        @SuppressWarnings("unchecked")
        List<HouseholdAppliances> result = ss.createQuery("FROM HouseholdAppliances").list();
        for (HouseholdAppliances r : result) {
            System.out.println(r);
        }

        if (sf != null) {
            sf.close();
        }
    }
}

出力結果

AppクラスをJavaアプリケーションで実行します。

7 20, 2019 9:18:19 午後 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
7 20, 2019 9:18:19 午後 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.0.Final}
7 20, 2019 9:18:19 午後 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
7 20, 2019 9:18:19 午後 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
7 20, 2019 9:18:19 午後 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
7 20, 2019 9:18:19 午後 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
7 20, 2019 9:18:19 午後 org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
7 20, 2019 9:18:19 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
7 20, 2019 9:18:19 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://127.0.0.1:3306/TESTDB?useUnicode=true&characterEncoding=UTF-8]
7 20, 2019 9:18:19 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=test, password=****}
7 20, 2019 9:18:19 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
7 20, 2019 9:18:19 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
7 20, 2019 9:18:19 午後 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
7 20, 2019 9:18:20 午後 org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
7 20, 2019 9:18:20 午後 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select householda0_.id as id1_0_, householda0_.HouseholdAppliancesName as Househol2_0_, householda0_.PurchaseDate as Purchase3_0_ from TESTDB.HouseholdAppliances householda0_
id:1    householdAppliancesName:冷蔵庫   purchaseDate:2008-12-01
id:2    householdAppliancesName:電子レンジ purchaseDate:2015-08-01
id:3    householdAppliancesName:オーブントースター purchaseDate:2015-08-01
id:4    householdAppliancesName:クーラー    purchaseDate:2011-06-01
id:5    householdAppliancesName:洗濯機   purchaseDate:2012-04-01

あとがき

無事、自動生成したEntityをコンソール上に表示することができました。

自動生成したEntityを使うことで、ソースの見通しが良くなって保守性が上がるし、テーブル名やカラム名を直書きしないといけないSQLよりもクラス名やフィールド名を使ったHQLを使う方がテーブルの内容の変更にも柔軟に対応できて開発しやすいと思います。

O/Rマッパーを初めて使ったときの感動が忘れられない!

最後までお読み頂きありがとうございました。

STSにHibernateツールをインストールし、Entityを自動生成する!(後編)

まえがき

O/RマッパでEntityを作成する場合、手書きで作成するのは、すごく大変です。

Entityファイルに大量にあるカラムの設定をしたり、複数プライマリーキーの設定をしたりなど、手作業でするには、ミスもし易いし、こんなところで時間を使いたくないと思ってしまっても仕方がないです。

今回は、Entityを自動生成する(リバースエンジニアリング)手順について説明したいと思います。

HibernateツールをSTSにインストールする手順は、前編を参考にして下さいね。

pom2019.hatenablog.com

コンソール構成の追加

  • STSを立ち上げ、Hibernateツールパースペクティブを開きます。その後、「新規>Hibernateコンソール構成」をクリックします。下記キャプチャで赤枠内クリックでも追加できます。

f:id:pom2019:20190714132629p:plain

  • 赤枠内を入力もしくはチェックします。
  1. 名前:コンソール構成の名前を入力します。(なんでも構いません。)
  2. 型:注釈(jdk1.5+)をクリックし、Hibernateのバージョンを4.3とします。
  3. プロジェクト:参照ボタンからEntityの自動生成を行うプロジェクトを選択します。
  4. データベース接続:「[Hibernate configured connection]」を選択します。
  5. 構成ファイル:セットアップボタンからhibernate.cfg.xmlファイルを選択します。

f:id:pom2019:20190714132704p:plain

  •  適用後、OKボタンをクリックします。

f:id:pom2019:20190714133326p:plain

  • Hibernate4.3のツリーを辿っていくとDBに接続できたことが分かります。

f:id:pom2019:20190714133351p:plain

リバース・エンジニアリング・ファイルの作成

  • Springパースペクティブを開き、「新規>その他」をクリックします。
  • Hibernate>Hibernateリバース・エンジニアリング・ファイル」を選択し、次へをクリックします。

f:id:pom2019:20190714134131p:plain

  • resourcesフォルダを指定し、hibernate.reveng.xmlとデフォルト表示されるので、次へをクリックします。

f:id:pom2019:20190714134254p:plain

  • コンソール構成に先程のhibernate4.3を選択し、リフレッシュボタンをクリックします。その後、データベース・スキーマから自動生成したいテーブルを選択し、インクルードボタンをクリックします。そうすると、テーブル・フィルターにテーブルが追加されるので、完了をクリックします。f:id:pom2019:20190714134538p:plain
  • リバース・エンジニアリング・ファイルが作成されます。

Entityの自動生成

f:id:pom2019:20190714135211p:plain

  • 赤枠内の新規構成をクリックします。

f:id:pom2019:20190714135619p:plain

  • 赤枠内を入力もしくはチェックします。
  1. ハンドリング名前:構成の名前を入力します。(なんでも構いません。)
  2. コンソール構成:コンソール構成で作成した構成を選択します。(ここではhibernate4.3)
  3. 出力ディレクトリ:参照ボタンからjavaファイルのルートパスを選択します。
  4. JDBC接続からリバース・エンジニアリング:チェックします。
  5. パッケージ:Entityを作成するパッケージを入力します。
  6. reveng.xml:セットアップボタンからhibernate.reveng.xmlファイルを選択します。

f:id:pom2019:20190714135804p:plain

  • エクスポータータブで、赤枠内のチェックをチェックします。その後、適用ボタンをクリックし、実行ボタンをクリックします。

f:id:pom2019:20190714140541p:plain

  •  Entityが自動生成されます。

f:id:pom2019:20190714140802p:plain

あとがき

無事、Entityを自動生成することができました。

テーブルの内容はGUIを使って変更し、Entityへの反映は自動生成で行えば、タイプミスも防げるし、大量に変更を行う場合などにかなり有効になってくると思います。ただ、エラーメッセージの設定を行いたい場合は、Entityファイルを直接変更しないといけないため、自動生成するとすべて消えてしまいます。。

用途によって、自動生成と手動作成を使い分けるのがいいと思います。

最後までお読み頂きありがとうございました。

STSにHibernateツールをインストールし、Entityを自動生成する!(前編)

O/RマッパでEntityを作成する場合、手書きで作成するのは、すごく大変です。

Entityファイルに大量にあるカラムの設定をしたり、複数プライマリーキーの設定をしたりなど、手作業でするには、ミスもし易いし、こんなところで時間を使いたくないと思ってしまいます。

今回は、Entityを自動生成するツールをインストールすることで、この問題を解決したいと思います。

まずは、Entityを自動生成するツールであるHibernateツールをSTSにインストールします。

本ページ引っ越しのご案内

本ページは引っ越しました。

お手数ですが、続きは下記URLまでアクセスください。

iteng-pom.com

 

MySQL Connector/Jの最新版について!

こんにちは、ぽむです。

はじめに

前回のブログでは、pom.xmldependencyに「MySQL Connector/J」8.0.16を設定していました。どうして8.0.16を使っているのかを開発者の観点から説明したいと思います。

MySQL Connector/Jとは、「MySQLJavaを繋ぐドライバ」のことです。(データベースとプログラムを繋ぐ橋渡し役!)

本ページ引っ越しのご案内

本ページは引っ越しました。

お手数ですが、続きは下記URLまでアクセスください。 

iteng-pom.com

Hibernate4.3経由でMySQLのデータを表示する!

まえがき

STS3のMavenプロジェクト使って、Hibernate4.3経由でMySQLのテーブルデータを表示したいと思います。

手順は下記の通りとなります。

  1. Mavenプロジェクトを使ってJavaのコンソールプロジェクトを作成します。
  2. Hibernate4.3とMySQL8.0をpom.xmlに追加します。
  3. データを表示するMainメソッドを作成します。

表示するデータは、前回のブログで作成したテーブルを使用します。

データを作成していない方は下記リンクを参考にして下さいね! pom2019.hatenablog.com

Mavenプロジェクトの作成

必要ファイルの作成

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.pom2019</groupId>
    <artifactId>HibernateTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Archetype - HibernateTest</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.0.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
    </dependencies>

</project>
  • resoucesフォルダ配下に「hibernate.cfg.xml」を作成します。 f:id:pom2019:20190622152930p:plain
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/TESTDB?useUnicode=true&amp;characterEncoding=UTF-8</property>
        <property name="connection.username">test</property>
        <property name="connection.password">****</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

    </session-factory>
</hibernate-configuration>

※パスワードは「****」としていますが、それぞれの環境のパスワードを入力して下さい。

  • メイン文を含むクラスを作成します。 f:id:pom2019:20190622153913p:plain
package com.pom2019;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class App {

    public static void main(String[] args) {
        // configures settings from hibernate.cfg.xml
        Configuration configuration = new Configuration().configure();
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        SessionFactory sf = configuration.buildSessionFactory(builder.build());

        Session ss = sf.openSession();
        @SuppressWarnings("unchecked")
        List<Object[]> result = ss.createSQLQuery("SELECT * FROM HouseholdAppliances").list();
        for (Object[] r : result) {
            for (Object o : r) {
                System.out.print(o + "\t");
            }
            System.out.println();
        }

        if (sf != null) {
            sf.close();
        }
    }
}

実行結果

  • App.javaを右クリックし、「実行>2.Javaアプリケーション」をクリックします。
6 22, 2019 2:59:55 午後 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
6 22, 2019 2:59:55 午後 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.0.Final}
6 22, 2019 2:59:55 午後 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
6 22, 2019 2:59:55 午後 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
6 22, 2019 2:59:55 午後 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
6 22, 2019 2:59:55 午後 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
6 22, 2019 2:59:55 午後 org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
6 22, 2019 2:59:55 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)
6 22, 2019 2:59:55 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://127.0.0.1:3306/TESTDB?useUnicode=true&characterEncoding=UTF-8]
6 22, 2019 2:59:55 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=test, password=****}
6 22, 2019 2:59:55 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
6 22, 2019 2:59:55 午後 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
6 22, 2019 2:59:56 午後 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
6 22, 2019 2:59:56 午後 org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
6 22, 2019 2:59:56 午後 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
6 22, 2019 2:59:56 午後 org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000227: Running hbm2ddl schema export
6 22, 2019 2:59:56 午後 org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate: SELECT * FROM HouseholdAppliances
1   冷蔵庫   2008-12-01  
2   電子レンジ 2015-08-01  
3   オーブントースター 2015-08-01  
4   クーラー    2011-06-01  
5   洗濯機   2012-04-01  

あとがき

家電テーブルの内容が無事表示されました!

ここでは、SQLを直接実行する(ss.createSQLQuery)ことでデータを表示させていますが、エンティティを設定をすれば、HQLで実行させる(ss.createQuery)ことができます。

HQLとはHibernate Query Languageの略で、SQLオブジェクト指向風にラッピングした言語のことです。

今回、MySQLのバージョンになぜ8.0.16を使用したかについては、下記リンクに書いているのでよかったら参考にして下さいね! pom2019.hatenablog.com

最後までお読み頂きありがとうございました。

MySQLワークベンチを使って、テーブルを作成してみた!

まえがき

MySQLワークベンチを使って、テーブルを作成してみます。MySQLワークベンチを使えば、スキーマの作成、テーブルの作成、データの挿入をすべてGUIで実行することができます。GUIを使えば、直感的にこれらの動作を実行することができ、便利なので、皆様もよろしければ参考にして下さいね。

スキーマの作成

  • MySQLワークベンチを立ち上げ、データベースに接続します。データベースの接続方法については、下記URLを参考にして下さい。

pom2019.hatenablog.com

  • 赤枠内の「Create a new schema」をクリックします。

f:id:pom2019:20190617163523p:plain

f:id:pom2019:20190617163554p:plain

  • 実行されるSQLが表示されます。Applyをクリックします。

f:id:pom2019:20190617163815p:plain

テーブルの作成

  • 赤枠内の「Create a new table」をクリックします。

f:id:pom2019:20190617164130p:plain

  • テーブル名とカラム名、データタイプを入力します。idについては、プライマリーキーとNotNullとAutoIncrementにチェックを入れました。また、必要であればコメントを入力します。最後に、Applyをクリックします。

f:id:pom2019:20190617164200p:plain

※プライマリーキーは主キー、NotNullはNullを許容しない、AutoIncrementは自動採番(何も設定しなくても最大数値+1が設定される)です。

  • 実行されるSQLが表示されます。Applyをクリックします。

f:id:pom2019:20190617164458p:plain

データの作成

  • HouseholdAppliancesテーブルを右クリックし、「Selected Rows」をクリックすると、現在のテーブルが表示されます。

f:id:pom2019:20190617164945p:plain

  • データを入力し、Applyをクリックします。idについては、オートインクリメントを設定しているため、自動的に数字が割り振られます。

f:id:pom2019:20190617165027p:plain

  •  実行されるSQLが表示されます。Applyをクリックします。

f:id:pom2019:20190617165258p:plain

  • データが作成されました。

f:id:pom2019:20190617165436p:plain

あとがき

MySQLワークベンチを使って、無事データを作成することができました。

スキーマ/テーブル/データの作成が簡単かつ直感的に作成できたことがお分かり頂けたかと思います。この機会にぜひMySQLワークベンチを活用して下さいね。

最後までお読み頂きありがとうございました。

MySQLワークベンチのDB接続で困ったこと!

MySQLには、テーブル作成やテーブル操作(データの追加や削除など)する際にCUIで操作する方法とGUIで操作する方法があります。

MySQLでテーブル操作するにはGUIの方が便利なので、MySQLGUIで操作できるワークベンチをインストールしたいと思います。

GUIで操作する際も内部的にはCUIで使うコマンドと同じものが実行されています。

GUIグラフィカルユーザーインターフェースの略で画面操作をすることでテーブルやデータを作成できるツールのことです。それとは逆にCUIはキャラクターユーザーインターフェースの略で文字操作のみでテーブルやデータを作成するツールのことです。

本ページ引っ越しのご案内

本ページは引っ越しました。

お手数ですが、続きは下記URLまでアクセスください。

iteng-pom.com

 

 

(Webアプリを構築しよう)MySQL5.7をLinux(Ubuntu18.04LTS)にインストールする!

まえがき

Webアプリケーションを作成する際には必ずデータベースが必要になってきます。なぜなら、Webアプリケーションに表示されているデータは、すべてデータベースに格納されているからです。

本ブログでは、Struts2フレームワークでWebアプリケーションを構築していきたいのですが、その前に必要となるデータベース(今回はMySQL)のサーバー環境とクライアント環境をインストールしたいと思います。

サーバー環境は、実際にデータが格納されているデータベース本体のことです。

クライアント環境は、データベースに格納されているデータを操作する(テーブルを作ったり、見たり、消したりなど)ための環境のことです。

サーバとクライアントのインストール

  • 下記コマンドを実行します。
$sudo apt install mysql-server mysql-client
  • バージョンを確認します。
$mysql --version
mysql Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using EditLine wrapper

※「MySQL 5.7.26」をインストールすることができました。

初期設定

  • 下記コマンドを実行して、MySQLの初期設定を行います。
$sudo mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: n
Please set the password for root here.

New password:

Re-enter new password: 
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.

- Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

※「VALIDATE PASSWORD pluginを設定する」は「n」で、残りはすべて「y」で設定しました。adminのパスワードの設定も行っています。

接続の確認

  • 下記コマンドを実行します。
$sudo mysql -u root -p

※初期設定で設定したパスワードを入力します。

  • 接続後、下記コマンドを実行します。
mysql> status
--------------
mysql Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using EditLine wrapper

Connection id: 5
Current database: 
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.26-0ubuntu0.18.04.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 14 min 54 sec

Threads: 1 Questions: 19 Slow queries: 0 Opens: 113 Flush tables: 1 Open tables: 106 Queries per second avg: 0.021
--------------

※Server charactersetとDb charactersetがlatin1、Client charactersetとConn. charactersetがutf8となっています。サーバ側とクライアント側で文字コードが違うので、このまま使うとテーブル内の日本語が文字化けしてしまいます。

文字コードの変更

  •  設定ファイルをバックアップします。
$sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.org.cnf
  • 設定ファイルに2行追加します。
character-set-server = utf8
default_password_lifetime = 0

[mysqld]セクションに追加してください。
※「character-set-server」はサーバ側の文字コードを設定しています。
※「default_password_lifetime」はパスワードの有効期限を無制限に設定しています。

  • MySQLサービスを再起動します。
$sudo systemctl restart mysql
  • 再度、MySQLに接続後、ステータスを確認すると、サーバ側文字コードもutf8となっています。
mysql> status
--------------
mysql Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using EditLine wrapper

Connection id: 2
Current database: 
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.26-0ubuntu0.18.04.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 9 sec

Threads: 1 Questions: 5 Slow queries: 0 Opens: 105 Flush tables: 1 Open tables: 98 Queries per second avg: 0.555
--------------

あとがき

MySQL 5.7を無事インストールすることができました。

これで、データベース本体やデータベースを操作する環境が整ったことになります。

実際にテーブルを作成したりやデータを登録したりする方法については、下記リンクを参考にして下さいね。

MySQLワークベンチのDB接続で困ったこと! - ITエンジニアぽむの備忘録

MySQLワークベンチを使って、テーブルを作成してみた! - ITエンジニアぽむの備忘録

最後までお読み頂きありがとうございました。

Struts2ブランクプロジェクトのエラーを解消する!

まえがき

STSStruts2のブランクプロジェクトを作成すると、エラーが出ており実行することができません。

エラーを解消し、実際に画面表示させるまでの手順を今回説明したいと思います。

Struts2でのブランクプロジェクトの作成方法については、下記リンクを参考にして下さいね。

pom2019.hatenablog.com

サーバにプロジェクトを追加

  • サーバエディタの「ローカルホストのTomcat v.9.0サーバー」を右クリックして、追加および除去をクリックします。

f:id:pom2019:20190518164153p:plain

  • 「使用可能」内のStruts2プロジェクトを選択して、追加をクリックします。

f:id:pom2019:20190518164251p:plain

  • Struts2プロジェクトが構成済みに移動します。
  • 完了をクリックします。

f:id:pom2019:20190518165110p:plain

Mavenプロジェクトの更新

  • Struts2プロジェクトを右クリックして、Maven>プロジェクトの更新をクリックします。

f:id:pom2019:20190518165345p:plain

  • 使用可能なMavenコードベース内で、Struts2プロジェクトが選択されていることを確認して、OKをクリックします。

エラーの解消

  • 「ローカルホストのTomcat v.9.0サーバー」を始動します。
  • log4j-coreをクラスパスに追加してください」とエラーが出て、正常に始動できません。

f:id:pom2019:20190518170050p:plain

  • log4j-coreをpox.xmlに追加して、Mavenプロジェクトを更新します。

f:id:pom2019:20190518173731p:plain

  • 再度、「ローカルホストのTomcat v.9.0サーバー」を始動します。

f:id:pom2019:20190518173921p:plain

f:id:pom2019:20190518174046p:plain

あとがき

Struts2ブランクプロジェクトを画面表示させることができました。

Struts2ブランクプロジェクトを作成したけど実行できない」とお悩みの方に役立てれば嬉しいです。

今回はサーバー起動時に出るエラーに関する修正だったのですが、ブランクプロジェクトを作成したら、pom.xmlの依存関係が間違っていてMavenの更新が通らないなんてこともあります。

最後までお読み頂きありがとうございました。