* iBATIS(mybatis) [#z4e59c0c]
#setlinebreak(on)

#contents
-- 関連
--- [[Hibernate]]

** iBATISとは [#a79d27c6]
#html(<div style="padding-left:20px;">)
SQLを利用する事に注力したO/Rマッピングツール
XMLまたはアノテーションにSQLを記述する事ができる。
#html(</div>)

** インストール [#j03a1940]
#html(<div style="padding-left:20px;">)
https://github.com/mybatis/mybatis-3 から目的のものを取得し、mybatis-X.X.X.jar にCLASSPATH を通す。
#html(</div>)

** テーブル・データの準備 [#w8e1cc61]
#html(<div style="padding-left:20px;">)
#myterm(){{
CREATE TABLE `books` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `isbn` varchar(255) DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  `price` int(11) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into books(isbn,title,price,created_at,updated_at)
 values('978-4822280536', 'デッドライン', 2376, NOW(), NOW())
          ,('978-4873114798', 'プログラマが知るべき97のこと', 2052, NOW(), NOW())
          ,('978-4873115658', 'リーダブルコード', 2592, NOW(), NOW());
}}
#html(</div>)

** 設定ファイルの作成 [#pc999cfe]
#html(<div style="padding-left:20px;">)
mybatis-config.xml(特に規約はないようだがサンプルに習って命名)
#myhtmlcode(){{
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd"&gt;
&lt;configuration&gt;
	&lt;settings&gt;
		&lt;setting name="mapUnderscoreToCamelCase" value="true" /&gt; &lt;!-- アンダースコアとキャメルケースの変換をするかどうか --&gt;
	&lt;/settings&gt;
	&lt;environments default="development"&gt;
		&lt;environment id="development"&gt;
			&lt;transactionManager type="JDBC" /&gt;
			&lt;dataSource type="POOLED"&gt;
				&lt;property name="driver" value="com.mysql.jdbc.Driver" /&gt;
				&lt;property name="url" value="jdbc:mysql://127.0.0.1:3306/example_db?useUnicode=true&amp;characterEncoding=UTF-8" /&gt;
				&lt;property name="username" value="user" /&gt;
				&lt;property name="password" value="pass" /&gt;
			&lt;/dataSource&gt;
		&lt;/environment&gt;
	&lt;/environments&gt;
	&lt;mappers&gt;
		&lt;mapper resource="example/mapper/BookMapper.xml" /&gt;
	&lt;/mappers&gt;
&lt;/configuration&gt;
}}
#html(</div>)

** エンティティクラスの作成 [#jccb2ead]
#html(<div style="padding-left:20px;">)
#mycode(){{
package example.entity;

import java.io.Serializable;

public class Book extends EntityBase implements Serializable {

	private static final long serialVersionUID = 1L;

	private int id;

	private String isbn;

	private String title;

	private int price;

	private java.util.Date createdAt;

	private java.util.Date updatedAt;

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getIsbn() {
		return isbn;
	}
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public java.util.Date getCreatedAt() {
		return createdAt;
	}
	public void setCreatedAt(java.util.Date createdAt) {
		this.createdAt = createdAt;
	}
	public java.util.Date getUpdatedAt() {
		return updatedAt;
	}
	public void setUpdatedAt(java.util.Date updatedAt) {
		this.updatedAt = updatedAt;
	} 
}
}}
#html(</div>)

&br;
SQLはXMLファイル または アノテーションに記述する事ができるが、どちらを選ぶかによって若干処理側の記述方法が変わる。
&br;

** 処理の作成(SQLをXMLファイルに定義する場合) [#z068c82a]
#html(<div style="padding-left:20px;">)

*** マッパー定義 [#ycccd237]
#html(<div style="padding-left:20px;">)
example/mapper/BookMapper.xml
#myhtmlcode(){{
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"&gt;
&lt;mapper namespace="example.mapper.BookMapper"&gt;

	&lt;resultMap id="bookMap" type="example.entity.Book" /&gt;
	&lt;!-- DBの列名とEntityクラスのフィールド名が異なる場合は、以下のように紐付けも可能
	&lt;resultMap id="bookMap" type="example.entity.Book" /&gt;
		&lt;id property="id" column="id" /&gt;
 		&lt;result property="book_title" column="title" /&gt;
		&lt;result property="book_isbn"  column="isbn" /&gt;
		&lt;result property="book_price"  column="price" /&gt;
		&lt;result property="book_created_at"  column="createdAt" /&gt;
		&lt;result property="book_updated_at"  column="updatedAt" /&gt;
 	&lt;/resultMap&gt;
	 --&gt;

	&lt;select id="selectById" resultType="example.entity.Book"&gt;
		select * from books where id = #{id}
	&lt;/select&gt;

	&lt;select id="selectAll" resultMap="bookMap"&gt;
		select * from books order by id
	&lt;/select&gt;

	&lt;insert id="insert" parameterType="example.entity.Book"&gt;
		insert into books (isbn,title,price,created_at,updated_at) values(#{isbn},#{title},#{price},now(),now())
		&lt;!-- MySQLの場合、以下で自動採番(AUTO_INCREMENT)されたIDをオブジェクトにセットできる --&gt;
		&lt;selectKey resultType="int" keyProperty="id" order="AFTER"&gt;
		select @@IDENTITY   &lt;!-- SELECT LAST_INSERT_ID() でも可 --&gt;
		&lt;/selectKey&gt;
 	&lt;/insert&gt;

	&lt;update id="update" parameterType="example.entity.Book"&gt;
		update books set title = #{title}, price = #{price}, updated_at = now() where id = #{id}
 	&lt;/update&gt;

	&lt;delete id="delete" parameterType="example.entity.Book"&gt;
		delete from books where id = #{id}
 	&lt;/delete&gt;

	&lt;delete id="deleteById" parameterType="int"&gt;
		delete from books where id = #{id}
 	&lt;/delete&gt;

&lt;/mapper&gt;
}}
#html(</div>)

*** 処理の作成 [#p4ac6789]
#html(<div style="padding-left:20px;">)
#mycode(){{
package example.service;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import example.entity.Book;

/**
 * XMLを使用したSQLマッピングによる検索/登録/更新/削除.<br />
 */
public class SampleAll extends SampleBase {

	public static void main(String[] args) throws Exception {
		new SampleAll().execute();
	}

	/**
	 * メイン処理.<br />
	 * @throws Exception
	 */
	public void execute() throws Exception{
		
		SqlSession session = openSqlSession();

		try {

			// 登録
			Book newBook = new Book();
			newBook.setIsbn("TEST1");
			newBook.setTitle("タイトル1");
			newBook.setPrice(1080);
			session.insert("example.mapper.BookMapper.insert", newBook);
			System.out.println("id : " + newBook.getId());

			// 1件取得
			Book book1 = session.selectOne("example.mapper.BookMapper.selectById", newBook.getId());
			System.out.println("id      : " + book1.getId());
			System.out.println("isbn    : " + book1.getIsbn());
			System.out.println("title   : " + book1.getTitle());
			System.out.println("price   : " + book1.getPrice());
			System.out.println("created : " + book1.getCreatedAt());
			System.out.println("updated : " + book1.getUpdatedAt());
			System.out.println("------------------------------");

			// 全件取得
			List<Book> list = session.selectList("example.mapper.BookMapper.selectAll");
			for (int i = 0; i < list.size(); i++) {
				Book book = (Book) list.get(i);
				System.out.println("id      : " + book.getId());
				System.out.println("isbn    : " + book.getIsbn());
				System.out.println("title   : " + book.getTitle());
				System.out.println("price   : " + book.getPrice());
				System.out.println("created : " + book.getCreatedAt());
				System.out.println("updated : " + book.getUpdatedAt());
				System.out.println("------------------------------");
			}
			
			// 更新
			Book updBook = session.selectOne("example.mapper.BookMapper.selectById", newBook.getId());
			updBook.setTitle("タイトル変更");
			updBook.setPrice(1080);
			session.update("example.mapper.BookMapper.update", updBook);

			// 引数にEntityオブジェクトを指定して1件削除
			Book delBook = session.selectOne("example.mapper.BookMapper.selectById", newBook.getId());
			session.delete("example.mapper.BookMapper.delete", delBook);

			// 引数にidを指定して1件削除
			session.delete("example.mapper.BookMapper.deleteById", 20);

			session.commit();
			
		} finally {
			session.close();
		} 
	} 

	public SqlSession openSqlSession() throws Exception{

		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession session = sqlSessionFactory.openSession();
	} 
} 
}}
#html(</div>)
#html(</div>)


** 処理の作成(SQLをアノテーションに記述する場合) [#z068c82a]
#html(<div style="padding-left:20px;">)

*** マッパー定義 [#ycccd237]
#html(<div style="padding-left:20px;">)
example/mapper/BookMapper.java
#mycode(){{
package example.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectKey;
import org.apache.ibatis.annotations.Update;

import example.entity.Book;

public interface BookMapper {

	/**
	 * 引数のidを条件にして1件取得.<br />
	 * @param id
	 * @return Bookオブジェクト
	 */
	@Select("select * from books where id = #{id}")
	Book selectById(int id);

	/**
	 * 全件取得.<br />
	 * @return Bookオブジェクトのリスト
	 */
	@Select("select * from books order by id")
	List<Book> selectAll();

	/**
	 * 登録.<br />
	 * @param book Bookオブジェクト
	 */
	@Insert("insert into books (isbn,title,price,created_at,updated_at) values (#{isbn},#{title},#{price},now(),now())")
	@SelectKey(statement="select LAST_INSERT_ID()", keyProperty="id", before=false, resultType=int.class)
	void insert(Book book);

	/**
	 * 更新.<br />
	 * @param book Bookオブジェクト
	 */
	@Update("update books set title = #{title}, price = #{price}, updated_at = now() where id = #{id}")
	void update(Book book);

	/**
	 * 引数のidを条件にして削除.<br />
	 * @param id
	 */
	@Delete("delete from books where id = #{id}")
	void deleteById(int id);

	/**
	 * 引数のBookオブジェクトに設定されたidを条件にして削除.<br />
	 * @param id
	 */
	@Delete("delete from books where id = #{id}")
	void delete(Book book);
	
} 
}}
#html(</div>)

*** 処理の作成 [#p4ac6789]
#html(<div style="padding-left:20px;">)
#mycode(){{
package example.service;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import example.entity.Book;
import example.mapper.BookMapper;

/**
 * XMLを使用したSQLマッピングによる検索/登録/更新/削除.<br />
 */
public class SampleAll extends SampleBase {

	public static void main(String[] args) throws Exception {
		new SampleAll().execute();
	}

	/**
	 * メイン処理.<br />
	 * @throws Exception
	 */
	public void execute() throws Exception{
		
		SqlSession session = openSqlSession();

		try {

			BookMapper mapper = session.getMapper(BookMapper.class);

			// 登録
			Book newBook = new Book();
			newBook.setIsbn("TEST1");
			newBook.setTitle("タイトル1");
			newBook.setPrice(1080);
			mapper.insert(newBook);
			System.out.println("id : " + newBook.getId());

			// 1件取得
			Book book1 = mapper.selectById(newBook.getId());
			System.out.println("id      : " + book1.getId());
			System.out.println("isbn    : " + book1.getIsbn());
			System.out.println("title   : " + book1.getTitle());
			System.out.println("price   : " + book1.getPrice());
			System.out.println("created : " + book1.getCreatedAt());
			System.out.println("updated : " + book1.getUpdatedAt());
			System.out.println("------------------------------");

			// 全件取得
			List<Book> list = mapper.selectAll();
			for (int i = 0; i < list.size(); i++) {
				Book book = (Book) list.get(i);
				System.out.println("id      : " + book.getId());
				System.out.println("isbn    : " + book.getIsbn());
				System.out.println("title   : " + book.getTitle());
				System.out.println("price   : " + book.getPrice());
				System.out.println("created : " + book.getCreatedAt());
				System.out.println("updated : " + book.getUpdatedAt());
				System.out.println("------------------------------");
			}
			
			// 更新
			Book updBook = mapper.selectById(newBook.getId());
			updBook.setTitle("タイトル変更");
			updBook.setPrice(1080);
			mapper.update(updBook);

			// 引数にEntityオブジェクトを指定して1件削除
			Book delBook = mapper.selectById(newBook.getId());
			mapper.delete(delBook);

			// 引数にidを指定して1件削除
			mapper.deleteById(20);

			session.commit();
			
		} finally {
			session.close();
		} 
	} 

	public SqlSession openSqlSession() throws Exception{

		Properties properties = new Properties();
		// DB接続設定
		properties.setProperty("driverClassName", "com.mysql.jdbc.Driver");
		properties.setProperty("url"            , "jdbc:mysql://127.0.0.1:3306/example_db?useUnicode=true&characterEncoding=UTF-8");
		properties.setProperty("username"       , "user");
		properties.setProperty("password"       , "pass");
		properties.setProperty("initialSize"    , "30");
		properties.setProperty("maxActive"      , "100");
		properties.setProperty("maxIdle"        , "30");
		properties.setProperty("maxWait"        , "5000");
		properties.setProperty("validationQuery", "select 1");

		// プロパティファイルから読む場合
		//InputStream is = ClassLoader.getSystemResourceAsStream("mybatis-config.properties");
		//properties.load(is);

		DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);

		TransactionFactory transactionFactory = new JdbcTransactionFactory();
		Environment environment = new Environment("development", transactionFactory, dataSource);
		Configuration configuration = new Configuration(environment);

		// アンダースコアとキャメルケースを変換する
		configuration.setMapUnderscoreToCamelCase(true);

		// Mapperの指定
		configuration.addMappers("example.mapper");                  // パッケージ指定
		//configuration.addMapper(example.mapper.BookMapper.class);  // クラス指定

		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
		
		return sqlSessionFactory.openSession();
	} 
} 
}}
#html(</div>)
#html(</div>)


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS