🐡

【初心者向け/ITスクール58日】Spring Maven3/MyBatis(うんざりした純粋JDBC卒業)

2023/10/06に公開

はじめに

今日は、ITスクールに通った58日目の日で、今日学んだ知識を記事にシェアしたいと思います。本記事が、ITを勉強を始めた方々にもロードマップになればいいと思います。

今日はMavenのCentral RepositoryとLocal Repositoryについて、勉強しました。
また、いよいよ純粋JDBCではなく、MyBatisを使ってCRUDを行いました。
おさらば!!!
DriverManager,ResultSet,PreparedStatement,Connection!!!!!!

Maven

Mavenがライブラリを.jarで引っ張る方法を二つあります。
一つ目はCentral repositoryから、二つ目はLocal repositoryからです。

Central Repository

https://mvnrepository.com/

こちらにspring projectにおいて必要なlibraryがあります。
pom.xmlに入っているものを全部ひっぱてきます。


<repositories>
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>http://maven.jahia.org/maven2</url>
</repository>
</repositories>


<dependencies>
    <!-- Spring -->
	<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>${org.springframework-version}</version>
	<exclusions>
	<!-- Exclude Commons Logging in favor of SLF4j -->
		<exclusion>
		<groupId>commons-logging</groupId>
		<artifactId>commons-logging</artifactId>
			   </exclusion>
			</exclusions>
	</dependency>
		.
		.
		.     
	</dependencies>

<dependencies> : プロジェクトから依存するプライブラリの集合
<dependency> : プロジェクトから依存するプライブラリ
<repositories> : プロジェクトのDBMSの集合
<repositories> : プロジェクトのDBMSのオブジェクト

Local Repository

Mavenサイトにないライブラリ、もしくは直接作ったライブラリは
Local Repositoryに登録し、pom.xmlに保存する必要があります。

Maven local repository: C:\Users\i.m2\repository

Maven local repository 登録

projectをrmouseでclick - Configure - Conver to Maven Project
Group Idはpackage name 例:com.hyon(最上位packageは叙階)
Artifact Idはライブらに指定するname 例:jsonconverter`を付けます。

Maven local repository import

projectをrmouseで`click - import - maven - => install or deploy ~~ をclickすると設定可能

Browse => libararyがあるdirectory => Group Id, Artifact Id 設定 => version名設定 => Packaging=jar

importしたものをプロジェクトに(to pom.xml)

pom.xml => Dependencies=> Add => Artifact Idで検索-> 選択

エラー対処方法

eclipse終了 => local repositoryを削除 => eclipse再起動
=>projectをrmouseで`click = > maven => update project

Mybatis

xml にqueryを作成し、interfaceと連携して、オブジェクト(Bean)を通して、DBをアクセスするライブラリです。
重複コードがなくなるので、とても便利です!

下準備としてJava Resourceにsql文書を作成し、tableを作成します。私の場合、Studentというテーブルを作成しました。

DTO

public class Student {
	private BigDecimal s_no;
	private String s_name;
	private String s_nickname;
	
	public Student() {
		
	}
  .
  .
  .

OracleのNumberと異なり、Javaは実数と整数が分かれているため、BigDecimalというクラスを利用します。

xxxMapper.xml

同じResourceフォルダに以下のようなxmlを作成してみます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hyon.oct062.student.StudentMapper">
   <insert id="regStudent" parameterType="com.hyon.oct062.student.Student">
        insert into oct06_student values(
             oct06_student_seq.nextval,#{s_name}, #{s_nickname})
   </insert>
   <select id="readAllStudents" resultType="com.hyon.oct062.student.Student">
   	select * from oct06_student order by s_no	
   </select>
</mapper>

xmlの原理

mapper namespace= mappingするインターフェースです。
こちらに宣言した抽象メソッドがidになります。

例)com.hyon.oct062.student.StudentMapper

StudentMapperというインターフェースとMappingします。

package com.hyon.oct062.student;

public interface StudentMapper {	
    
}

I,U,D

<insert id="regStudent" parameterType="com.hyon.oct062.student.Student">
	     insert into oct06_student values(
	          oct06_student_seq.nextval,#{s_name}, #{s_nickname})
	</insert>

動的Queryは#{属性名}にします。 以前は?にマークし、色々な厄介な過程がありましたが、とても便利でした。


package com.hyon.oct062.student;


public interface StudentMapper {
	public abstract int regStudent(Student s);

PreparedStatementがexecuteUpdate()時に、intをリターンするように、mybatisからリターン値もintです!

★R★

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hyon.oct062.student.StudentMapper">
	<insert id="regStudent" parameterType="com.hyon.oct062.student.Student">
	     insert into oct06_student values(
	          oct06_student_seq.nextval,#{s_name}, #{s_nickname})
	</insert>
	<select id="readAllStudents" resultType="com.hyon.oct062.student.Student">
		select * from oct06_student order by s_no	
	</select>
</mapper>
package com.hyon.oct062.student;

import java.util.List;

public interface StudentMapper {
	public abstract int regStudent(Student s);
	public abstract List<Student> readAllStudents(); 
}

DAO

package com.hyon.oct062.student;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class StudentDAO {
	
   @Autowired
   private SqlSession ss;
	
   public void regStudent(Student s, HttpServletRequest req) {
  try {				


  StudentMapper sm = ss.getMapper(StudentMapper.class);

プロジェクト時、設定からSqlSessionTemplateというものを事前にbeanに登録しました。そのため、最初は@Autowiredで引っ張ってきます。SqlSessionTemplateにより、connect(),close()が要らなくなってので、必須です! 
まだ、こちらのオブジェクトのgetMapper()メソッドが**StudentMapper.classを受けることでreflectionし、Springがオブジェクトを生成します。
そのオブジェクトをポリモーフィズムで、インターフェース変数に入れます。
**

   if(sm.regStudent(s) == 1) {
	req.setAttribute("r", "학생 등록 성공!");
	//ss.commit(); => commitは自動に!
			}
	}catch(Exception e) {
		e.printStackTrace();
		req.setAttribute("r", "학생 등록 실패!");
	   }	

	}

先ほど宣言した抽象クラスを呼び出すことで、xmlにしてし、メソッドと一致するidをマッピングしてQueryを実行します。
これによってデーターがDBに入ります!

public void readAllStudents(HttpServletRequest req) {
	try {
	 List<Student> sList =    ss.getMapper(StudentMapper.class).readAllStudents();
		req.setAttribute("sList", sList);	
			
	}catch(Exception e) {
		e.printStackTrace();
		req.setAttribute("r", "학생 검색 실패!");
		}
	}
	
}

view

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	${r }
	<form action="student.reg">
		이름: <input name="s_name"><p>
		별명: <input name="s_nickname"><p>
		<button>등록</button>
	</form>
	<c:forEach var="s" items="${sList }">
	    ${s.s_name } - ${s.s_nickname }<p>
	</c:forEach>
	<hr>
</body>
</html>

以上です!

Discussion