java,sqliteでdto,daoもどきを作った話

こんにちは、某社エンジニアです。
swing,javaでタスク管理アプリケーションを作るにあたりdto,daoもどきを作ったので備忘録。
関連する過去記事はこちらです↓
https://qiita.com/Ohtak/items/1be20a4b06b5833c3d61
https://qiita.com/Ohtak/items/f9a47b9be26c93fedaf9

#1.コード
まずはdtoファイルから。
といっても変わったことは何もしていませんが…

```java:TaskDto.java
public class TaskDto {

	//タスクID
	Integer id;
	
	//タスクの名前
	String title;
	
	//タスクの備考
	String discription;
	
	//タスクの期限
	String limitDate;
	
	//タスクのステータス
	Integer status;
	
	/**
	 * @return id
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * @param id セットする id
	 */
	public void setId(Integer id) {
		this.id = id;
	}
	
	/**
	 * @return title
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * @param title セットする title
	 */
	public void setTitle(String title) {
		this.title = title;
	}
	
	/**
	 * @return discription
	 */
	public String getDiscription() {
		return discription;
	}

	/**
	 * @param discription セットする discription
	 */
	public void setDiscription(String discription) {
		this.discription = discription;
	}
	
	/**
	 * @return title
	 */
	public String getLimitDate() {
		return limitDate;
	}

	/**
	 * @param title セットする title
	 */
	public void setLimitDate(String limitDate) {
		this.limitDate = limitDate;
	}
	
	/**
	 * @return status
	 */
	public Integer getStatus() {
		return status;
	}

	/**
	 * @param status セットする status
	 */
	public void setStatus(Integer status) {
		this.status = status;
	}
}
```
ただこれだけです。

次にdaoもどき。daoの体裁はあまりなしていないので勝手なクラス名つけてます。

```java:DBAccesser.java
public class DBAccesser {
	public Connection con = null;
	public Statement smt = null;
	
	public List<TaskDto> selectAll(){
		try {
    		// データベースに接続する なければ作成される
    		con = DriverManager.getConnection("jdbc:sqlite:/Users/taskManager.sqlite");
    		smt = con.createStatement();
    		String sql = "select * from task";
    		ResultSet rs = smt.executeQuery(sql);
    		List<TaskDto> tasks = new ArrayList<TaskDto>();
    		while( rs.next() ) {
    			TaskDto task = new TaskDto();
    			task.setId(rs.getInt(1));
        		task.setTitle(rs.getString(2));
        		task.setDiscription(rs.getString(3));
        		task.setLimitDate(rs.getString(4));
        		task.setStatus(rs.getInt(5));
        		tasks.add(task);
    		}
    		con.close();
    		return tasks;
    	}
		catch (SQLException e) {
    		// TODO 自動生成された catch ブロック
    		e.printStackTrace();
    		return null;
    	}
	}
	
	public int selectLastId(){
		try {
    		// データベースに接続する なければ作成される
    		con = DriverManager.getConnection("jdbc:sqlite:/Users/taskManager.sqlite");
    		smt = con.createStatement();
    		String sql = "select id from task order by id desc limit 1";
    		ResultSet rs = smt.executeQuery(sql);
    		int id = rs.getInt(1);
    		con.close();
    		return id;
    	}
		catch (SQLException e) {
    		// TODO 自動生成された catch ブロック
    		e.printStackTrace();
    		return 0;
    	}
	}
	
	public void insert(TaskDto task){
		try {
    		// データベースに接続
    		con = DriverManager.getConnection("jdbc:sqlite:/Users/taskManager.sqlite");
    		smt = con.createStatement();
    		String sql = "insert into task (id, name, limit_date, comment) values(" + String.valueOf(task.getId()) + ", '" + task.getTitle() + "', '" + task.getLimitDate() + "', '" + task.getDiscription() + "');";
    		smt.executeUpdate(sql);
    		con.close();
    	} catch (SQLException e) {
    		// TODO 自動生成された catch ブロック
    		e.printStackTrace();
    	}
	}
	
	public void update(TaskDto task){
		try {
			// データベースに接続
			con = DriverManager.getConnection("jdbc:sqlite:/Users/taskManager.sqlite");
			smt = con.createStatement();
			String sql = "update task set name='"+ task.getTitle() + "', limit_date='" + task.getLimitDate() + "', comment='"+ task.getDiscription() + "', status = " + task.getStatus() + " where id=" + task.getId() + ";";
			smt.executeUpdate(sql);
			con.close();
		} catch (SQLException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}
	
	public void delete(int id){
		try {
			// データベースに接続
			con = DriverManager.getConnection("jdbc:sqlite:/Users/taskManager.sqlite");
			smt = con.createStatement();
			String sql = "DELETE FROM task WHERE id=" + id + ";";
			smt.executeUpdate(sql);
			con.close();
		} catch (SQLException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}
}
```
基本的な４つに加えてオリジナルのメソッド一つだけです。
こちらもそんなに難しいことはやっていないです。
ただsqliteのマニュアル通りにやっただけ。

#2.呼び出し側
呼び出すときはこんな感じです。

```java:taskRegisterPanel.java
DBAccesser dbAccesser = new DBAccesser();
TaskDto task = new TaskDto();
task.setId(Integer.parseInt(taskId.getText()));
task.setTitle(taskTitle.getText());
task.setLimitDate(taskLimit.getText());
task.setDiscription(taskDiscription.getText());
task.setStatus(0);
dbAccesser.update(task);
```

こちらも簡単ですね。

#3.所感
これを使う利点として、操作をまとめて呼び出し側が簡単に呼び出せるようにする点があります。
上で簡単にすんでいるのはこれを使ってるからです。
初めは使っていなかったせいでとてもめんどくさかったです…

dtoファイルを使うことでDBにアクセスするときの引数とか結果とかも簡単に操作できるようにしてます。

書けば書くほど今更感すごいですがこれからも頑張ります。