Java・ツイッタークローン・タスク管理システム①データベースを作成する

##はじめに
Javaを使って初めてアプリケーションを作成する人にむけて記事を書いてみようと思います。
ポートフォリオや、会社の研修課題作成の参考にしていただければ幸いです。
今回は、タスクマネージャーを作成します。
これを応用することで、ツイッタークローンの作成にも活かすことができます。

アプリケーションの機能ごとに記事を投稿していきます。
1.データベース作成
2.ログイン機能
3.タスクの登録機能
4.一覧表示
　　-ソート機能
　　-検索機能
5.編集機能
6.削除機能
7.排他制御について

＊詳しい説明はコード内に書いてありますので、コピペする人は消して使ってください

##実行環境
eclipse4.16.0
Tomcat9
Java11
Mysql5.7

目次
1.データベース概要
2.SQL文
3.Bean作成
4.データベースとの接続
5.次回予告

#データベース概要
データベース名task_db
権利ユーザ名testuser
パスワードpassword
テーブル　ユーザのマスターテーブル
　　　　　カテゴリーのマスターテーブル
　　　　　ステータスのマスターテーブル
　　　　　タスクテーブル（ユーザID、カテゴリーID、ステータスIDのForeignKeyを持ちます）
　　　　　コメントテーブル(ユーザID、タスクIDのForeignKeyを持ちます)

#SQL文
①データベース作成

```task_dbデータベース作成
create databasetask_db
```

②ユーザ作成
　まずrootユーザになってパスワードのバリデーションを変更します

```
Set global validate_password.length=6; パスワードの長さを６に
set global validate_password.policy=LOW;　ポリシーを変更
```

次にパスワード付きでユーザ作成

```
create user testuser identified by 'password'
```

③ユーザへtask_dbの全権限を与える

```
grant all on task_db.* to testuser
```

以上で準備は完了です。

④それぞれのテーブルを作成していきます。


```
--------ユーザのマスターテーブル
create table m_user (
user_id varchar(24) primary key,
password varchar(32) not null,
user_name varchar(20) not null unique,
update_datetime timestamp not null default current_timestamp on update current_timestamp
);
--------カテゴリのマスターテーブル
create table m_category (
category_id int primary key auto_increment,
category_name varchar(20) not null unique,
update_datetime timestamp not null default current_timestamp on update current_timestamp
);
--------ステータスのマスターテーブル
create table m_status (
status_code char(2) primary key,
status_name varchar(20) unique not null,
update_datetime timestamp not null default current_timestamp on update current_timestamp
);
--------タスクテーブル
create table t_task (
 task_id int auto_increment primary key,
task_name varchar(50) not null,
category_id int not null,
limit_date date,
user_id varchar(24) not null,
status_code char(2) not null,
memo varchar(100),
create_datetime timestamp default current_timestamp not null,
update_datetime timestamp default current_timestamp not null on update current_timestamp,
foreign key(category_id) references m_category(category_id),
foreign key(user_id) references m_user(user_id),
foreign key(status_code) references m_status(status_code)
);
--------コメントテーブル
create table t_comment(
comment_id int auto_increment primary key,
task_id int,
user_id varchar(100) not null,
comment varchar(100) not null,
update_datetime timestamp default current_timestamp not null on update current_timestamp,
foreign key(task_id) references t_task(task_id) on delete set null on update cascade,
foreign key(user_id) references m_user(user_id)
);
```

次に初期データを入れておきます。


```
-------カテゴリーレコード作成
insert into m_category (category_name) value("新商品A：開発プロジェクト");
insert into m_category (category_name) value("既存商品B：改良プロジェクト");
select * from m_category;
--------ステータスレコード作成
insert into m_status ( status_code, status_name) values("00", "未着手");
insert into m_status ( status_code, status_name) values("50", "着手");
insert into m_status ( status_code, status_name) values("99", "完了");
select * from m_status;
--------ユーザーレコード作成
insert into m_user(user_id, password, user_name) values("testid", "password", "testuser");
insert into m_user(user_id, password, user_name) values("testid2", "password", "testuser2");
--------タスクレコード作成
insert into t_task(task_name, category_id, limit_date, user_id, status_code, memo) values("サンプルタスク1", 1, "2022-10-01", "testid", "99", "テスト入力");
insert into t_task(task_name, category_id, limit_date, user_id, status_code, memo) values("サンプルタスク2", 2, "2020-07-05", "testid", "50", "テスト入力");
insert into t_task(task_name, category_id, limit_date, user_id, status_code, memo) values("サンプルタスク2", 1, "2020-09-30", "testid", "00", "テスト入力");
insert into t_task(task_name, category_id, limit_date, user_id, status_code, memo) values("サンプルタスク3", 2, "2002-08-30", "testid", "99", "テスト入力");
insert into t_task(task_name, category_id, limit_date, user_id, status_code, memo) values("サンプルタスク4", 1, "2000-09-30", "testid", "00", "テスト入力");
insert into t_task(task_name, category_id, limit_date, user_id, status_code, memo) values("サンプルタスク5", 2, "2025-09-30", "testid", "50", "テスト入力");
insert into t_task(task_name, category_id, limit_date, user_id, status_code, memo) values("サンプルタスク6", 1, "1998-09-30", "testid", "00", "テスト入力");
insert into t_task(task_name, category_id, limit_date, user_id, status_code, memo) values("サンプルタスク7", 2, "2020-09-30", "testid", "99", "テスト入力");
insert into t_task(task_name, category_id, limit_date, user_id, status_code, memo) values("サンプルタスク8", 1, "2020-10-30", "testid", "00", "テスト入力");
```



#Bean作成
ここでは、それぞれのテーブルのBeanを作成していきます。
フィールド、コンストラクタ、getterとsetterを記述しているだけです。
確認したらコピペでオッケーです

```model.entity.TaskBean.java
public class TaskBean {
	/**
	 * フィールド
	 */
	private int task_id;
	private String task_name;
	private int category_id;
	private Date limit_date;
	private String user_id;
	private String status_code;
	private String memo;
	private Timestamp create_datetime;
	private Timestamp update_datetime;
	private int version;

	/**
	 * コンストラクタ
	 */
	public TaskBean(){
	}

	/**
	 * メソッド
	 */

	public int getTask_id() {
		return task_id;
	}
	public void setTask_id(int task_id) {
		this.task_id = task_id;
	}

	public String getTask_name() {
		return task_name;
	}
	public void setTask_name(String task_name) {
		this.task_name = task_name;
	}

	public int getCategory_id() {
		return category_id;
	}
	public void setCategory_id(int category_id) {
		this.category_id = category_id;
	}

	public Date getLimit_date() {
		return limit_date;
	}
	public void setLimit_date(Date limit_date) {
		this.limit_date = limit_date;
	}

	public String getUser_id() {
		return user_id;
	}
	public void setUser_id(String user_id) {
		this.user_id = user_id;
	}

	public String getStatus_code() {
		return status_code;
	}
	public void setStatus_code(String status_code) {
		this.status_code = status_code;
	}

	public String getMemo() {
		return memo;
	}
	public void setMemo(String memo) {
		this.memo = memo;
	}

	public Timestamp getCreate_datetime() {
		return create_datetime;
	}
	public void setCreate_datetime(Timestamp create_datetime) {
		this.create_datetime = create_datetime;
	}

	public Timestamp getUpdate_datetime() {
		return update_datetime;
	}
	public void setUpdate_datetime(Timestamp update_datetime) {
		this.update_datetime = update_datetime;
	}

	public int getVersion() {
		return version;
	}
	public void setVersion(int version) {
		this.version = version;
	}
}
```

```model.entity.UserBean.java
public class UserBean {
	/**
	 * フィールド
	 */
	private String user_id;
	private String password;
	private String user_name;

	/**
	 * コンストラクタ
	 */
	public UserBean(){
	}

	/**
	 * メソッド
	 */
	public String getUser_id() {
		return user_id;
	}
	public void setUser_id(String user_id) {
		this.user_id = user_id;
	}

	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}

}
```

```model.entity.StatusBean.java
public class StatusBean {
	/**
	 * フィールド
	 */
	private String status_code;
	private String status_name;

	/**
	 * コンストラクタ
	 */
	public StatusBean(){
	}

	/**
	 * メソッド
	 */
	public String getStatus_code() {
		return status_code;
	}

	public void setStatus_code(String status_code) {
		this.status_code = status_code;
	}

	public String getStatus_name() {
		return status_name;
	}

	public void setStatus_name(String status_name) {
		this.status_name = status_name;
	}
}
```

```model.entity.CategoryBean.java
public class CategoryBean {

	/**
	 * フィールド
	 */
	private int category_id;
	private String category_name;

	/**
	 * コンストラクタ
	 */
	public CategoryBean(){
	}

	/**
	 * メソッド
	 */
	public int getCategory_id() {
		return category_id;
	}

	public void setCategory_id(int category_id) {
		this.category_id = category_id;
	}

	public String getCategory_name() {
		return category_name;
	}

	public void setCategory_name(String category_name) {
		this.category_name = category_name;
	}
}
```

```model.entity.CommentBean.java
public class CommentBean {
	/**
	 * フィールド
	 */
	private int comment_id;
	private int task_id;
	private String user_id;
	private String comment;
	private Timestamp update_datetime;

	/**
	 * コンストラクタ
	 */
	public CommentBean() {
	}

	/**
	 * メソッド
	 */
	public int getComment_id() {
		return comment_id;
	}
	public void setComment_id(int comment_id) {
		this.comment_id = comment_id;
	}

	public int getTask_id(){
		return task_id;
	}
	public void setTask_id(int task_id) {
		this.task_id = task_id;
	}

	public String getUser_id() {
		return user_id;
	}
	public void setUser_id(String user_id) {
		this.user_id = user_id;
	}

	public String getComment() {
		return comment;
	}
	public void setComment(String comment) {
		this.comment = comment;
	}

	public Timestamp getUpdate_datetime() {
		return update_datetime;
	}
	public void setUpdate_datetime(Timestamp update_datetime) {
		this.update_datetime = update_datetime;
	}
}
```

#データベースとの接続
①JDBCをプロジェクトのWebContent-Web-INF-libの中に入れる
②ビルドパスの構成から追加をしておきます
③コネクションマネージーを作成
変数USERと変数PASSWORDはパスワードとユーザ名はそれぞれtestuserとpasswordでやっております。

```model.dao.ConnectionManager.java
public class ConnectionManager {
	//データベースの情報
		private final static String URL = "jdbc:mysql://localhost:3306/task_db?useSSL=false&serverTimezone=JST";
		private final static String USER = "testuser";
		private final static String PASSWORD = "password";

		//データベースへの接続メソッド
		public static Connection getConnection() throws SQLException, ClassNotFoundException{
			Class.forName("com.mysql.cj.jdbc.Driver");
			return DriverManager.getConnection(URL, USER, PASSWORD);
		}
}
```


#次回予告
今回は、データベースの作成からBean作成とmysqlとの接続までやってまいりました。
作成いしたm_userテーブルを使って次回は、ログイン機能をつけていきます。