MyBatisの導入

手順

Springプロジェクトで新規プロジェクト作成
テンプレートはSimpleSpringMavenを選択

プロジェクトを作成したらPOMを開きます。
以下を追加
org.mybatis mybatis 3.3.0
mysql mysql –connector-java 5.1.35
org.springframework spring-jdbc 4.1.6 RELEASE
org.mybatis mybatis-spring 1.2.2

MyBatisとは

MyBatisとは、データアクセスのためのフレームワークです。XMLを用いて、SQLとORマッピングを記述できます。また、アノテーションを利用することも可能です。

サンプルを動かしてみます。
今回サンプルに使用したのはmysqlですのでライブラリや設定は、mysqlのもので説明します。
テーブルの仕様は
テーブル名 t_person
カラムがperson_id(int),person_name(varchar),gender(varchar),age(int)となっています。

プロジェクトはSpringの説明で使用したものを使っています。
新規パッケージsample05を作成します。その中に以下のファイルを作成してください。
Appクラス/Personクラス/PersonDaoインタフェース/PersonDaoImplクラス
applicationContext.xml/mybatis-conf.xml/PersonMapper.xml

package sample05;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {

	public static void main(String[] args){
		@SuppressWarnings("resource")
		ApplicationContext context = new ClassPathXmlApplicationContext("sample05/applicationContext.xml");
		PersonDao personDao = context.getBean(PersonDao.class);
		Person person = personDao.getRecodeById(1);
		System.out.println(person.getPersonName());
		//複数
		List<Person> resultList = personDao.selectAll();
		for(Person p : resultList){
			System.out.println(p.getPersonId() + " " + p.getPersonName() + " " + p.getGender() + " " + p.getAge());
		}

		//insert
		person.setPersonId(7);
		person.setPersonName("john");
		person.setGender("male");
		person.setage(10);
		personDao.insertPerson(person);

		resultList = personDao.selectAll();
		for(Person p : resultList){
			System.out.println(p.getPersonId() + " " + p.getPersonName() + " " + p.getGender() + " " + p.getAge());
		}

		//update
		person.setPersonId(7);
		person.setPersonName("Jonathan");
		personDao.updatePerson(person);

		resultList = personDao.selectAll();
		for(Person p : resultList){
			System.out.println(p.getPersonId() + " " + p.getPersonName() + " " + p.getGender() + " " + p.getAge());
		}

		//delete
		personDao.deletePerson(7);

		resultList = personDao.selectAll();
		for(Person p : resultList){
			System.out.println(p.getPersonId() + " " + p.getPersonName() + " " + p.getGender() + " " + p.getAge());
		}

	}
}
package sample05;

public class Person {

	private int personId;
	private String personName;
	private String gender;
	private int age;

	public void setPersonId(int personId){
		this.personId = personId;
	}
	public int getPersonId(){
		return personId;
	}

	public void setPersonName(String personName){
		this.personName = personName;
	}
	public String getPersonName(){
		return personName;
	}

	public void setGender(String gender){
		this.gender = gender;
	}
	public String getGender(){
		return gender;
	}

	public void setage(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}
}
package sample05;

import java.util.List;

public interface PersonDao {

	Person getRecodeById(int id);

	List<Person> selectAll();

	Person insertPerson(Person param);

	Person deletePerson(int id);

	Person updatePerson(Person param);

}
package sample05;

import java.util.List;

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

@Component
public class PersonDaoImpl implements PersonDao{

	@Autowired
	private SqlSession session;

	public Person getRecodeById(int id){
		return session.selectOne("sample05.PersonMapper.selectPerson", id);
	}

	public List<Person> selectAll(){
		return session.selectList("sample05.PersonMapper.selectAll");
	}

	public Person insertPerson(Person param){
		session.insert("sample05.PersonMapper.insertPerson", param);
		return null;
	}

	public Person deletePerson(int id){
		session.delete("sample05.PersonMapper.deletePerson", id);
		return null;
	}

	public Person updatePerson(Person param){
		session.update("sample05.PersonMapper.updatePerson", param);
		return null;
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">

	<!-- datasource -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/java_test01" />
		<property name="username" value="root" />
		<property name="password" value="" />
	</bean>

	<!-- SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="sample05/mybatis-conf.xml" />
		<property name="mapperLocations">
			<list>
				<value>sample05/PersonMapper.xml</value>
			</list>
		</property>
	</bean>

	<!-- SqlSessionをインジェクション -->
	<bean class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory" />
	</bean>

	<!-- ComponentをBeanに設定 -->
	<context:component-scan base-package="sample05"
		use-default-filters="false">
		<context:include-filter type="aspectj"
			expression="sample05.PersonDaoImpl" />
	</context:component-scan>

</beans>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<setting name="jdbcTypeForNull" value="NULL" />
	</settings>
	<typeAliases>
		<typeAlias alias="Person" type="sample05.Person" />
	</typeAliases>

</configuration>
<?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="sample05.PersonMapper">

	<resultMap type="Person" id="personResultMap">
		<id property="personId" column="person_id" />
		<result property="personName" column="person_name" />
		<result property="gender" column="gender" />
		<result property="age" column="age" />
	</resultMap>

	<select id="selectPerson" resultMap="personResultMap">
		SELECT * FROM t_person WHERE person_id = #{presonId}
	</select>

	<select id="selectAll" resultMap="personResultMap">
		SELECT * FROM t_person
	</select>

	<insert id="insertPerson" parameterType="Person">
		INSERT INTO
		t_person ( person_id, person_name, gender, age  ) VALUES ( #{personId}, #{personName}, #{gender}, #{age} )
	</insert>

	<delete id="deletePerson" parameterType="int">
		DELETE FROM t_person WHERE person_id = #{personId}
	</delete>

	<update id="updatePerson" parameterType="Person">
		UPDATE t_person SET person_name = #{personName} WHERE person_id = #{personId}
	</update>

</mapper>

サンプルはSpringの連携を前提で作成しています。

SQLのクエリは設定したResultMapへ格納されさらにPersonBeanと紐付いているためBeanへ格納されます。
なので、そのBeanを利用すれば、DBの参照等ができます。

アノテーションを利用したやり方を記載します。

新規パッケージsample06を作成します。その中に以下のファイルを作成してください。
Appクラス/Personクラス/PersonMapperインターフェース/applicationContext.xml/

package sample06;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {

	public static void main(String[] args){
		ApplicationContext context = new ClassPathXmlApplicationContext("sample06/applicationContext.xml");
		PersonMapper personMapper = (PersonMapper)context.getBean("personMapper");
		Person person = personMapper.getById(1);
		System.out.println(person.getPersonId() + " " + person.getPersonName());
	}
}
package sample06;

public class Person {

	int person_id;
	String person_name;
	String gender;
	int age;

	public int getPersonId(){
		return person_id;
	}

	public String getPersonName(){
		return person_name;
	}

	public void setPersonId(int personId){
		this.person_id = personId;
	}

	public void setPersonName(String personName){
		this.person_name = personName;
	}

	public void gender(String gender){
		this.gender = gender;
	}

	public void age(int age){
		this.age = age;
	}
}
package sample06;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface PersonMapper {

	@Select("SELECT * FROM t_person where person_id = #{personId}")
	Person getById(@Param("personId") int id);
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">

	<!-- datasource -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/java_test01" />
		<property name="username" value="root" />
		<property name="password" value="" />
	</bean>

	<!-- SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- Mapper -->
	<bean id="personMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="mapperInterface" value="sample06.PersonMapper" />
		<property name="sqlSessionFactory" ref="sqlSessionFactory" />
	</bean>

</beans>

マッピングファイルで設定していたSQLやORマッピングをアノテーションで行っています。@Selectアノテーションの他にも20個以上のアノテーションが提供されているので、マッピングファイルでの設定と同等のことを行えます。

この記事を読んだ人は以下の記事も読んでいます

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA