【初心者向け/ITスクール58日】Spring Maven3/MyBatis(うんざりした純粋JDBC卒業)
はじめに
今日は、ITスクールに通った58日目の日で、今日学んだ知識を記事にシェアしたいと思います。本記事が、ITを勉強を始めた方々にもロードマップになればいいと思います。
今日はMavenのCentral RepositoryとLocal Repositoryについて、勉強しました。
また、いよいよ純粋JDBCではなく、MyBatisを使ってCRUDを行いました。
おさらば!!!
DriverManager,ResultSet,PreparedStatement,Connection!!!!!!
Maven
Mavenがライブラリを.jarで引っ張る方法を二つあります。
一つ目はCentral repositoryから、二つ目はLocal repositoryからです。
Central Repository
こちらに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