Más contenido relacionado La actualidad más candente (20) Similar a システムアーキテクト~My batis編~ (20) Más de Shinichi Kozake (20) システムアーキテクト~My batis編~36. MyBatis
MyBatis #とは
用意したDB
ID INT (PK)
NAME VARCHAR(100)
SEX CHAR(1)
COMMENT CLOB
CREATED TIMESTAMP
ユーザ(USER)
ID INT (PK)
NAME VARCHAR(100)
アイテム(ITEM)
USER_ID INT (PK)
ITEM_ID INT (PK)
ユーザ所有アイテム
(USER_BELONG_ITEMS)1
*
1
*
39. MyBatis
MyBatis入門
MyBatisの設定ファイル
DB接続定義やMapper SQL Statementなどの定義
<?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 >
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:tcp://localhost/C:MyFilesormdaoh2db;schema=orm"/>
<property name="username" value="ORM"/>
<property name="password" value="orm"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sample/sql/UserMap.xml" />
<mapper class="sample.mapper.ItemMapper" />
</mappers>
</configuration>
40. MyBatis
MyBatis入門
MyBatisの設定ファイル
DB接続定義やMapper SQL Statementなどの定義
<?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 >
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:tcp://localhost/C:MyFilesormdaoh2db;schema=orm"/>
<property name="username" value="ORM"/>
<property name="password" value="orm"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sample/sql/UserMap.xml" />
<mapper class="sample.mapper.ItemMapper" />
</mappers>
</configuration>
Databaseへの接続設定
41. MyBatis
MyBatis入門
MyBatisの設定ファイル
DB接続定義やMapper SQL Statementなどの定義
<?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 >
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:tcp://localhost/C:MyFilesormdaoh2db;schema=orm"/>
<property name="username" value="ORM"/>
<property name="password" value="orm"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sample/sql/UserMap.xml" />
<mapper class="sample.mapper.ItemMapper" />
</mappers>
</configuration>
SqlMapの情報
43. MyBatis
MyBatis入門 SQLとオブジェクトとのマッピング定義
<?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="sample.mapper.UserMapper" >
<select id="selectUser" resultType="sample.entity.User" >
select * from USER where id =#{id}
</select>
</mapper>
44. MyBatis
MyBatis入門 SQLとオブジェクトとのマッピング定義
<?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="sample.mapper.UserMapper" >
<select id="selectUser" resultType="sample.entity.User" >
select * from USER where id =#{id}
</select>
</mapper>
Sqlの定義
パラメータや戻り値との
Mapping指定
46. MyBatis
MyBatis入門
Javaオブジェクト
public class User {
private Integer id;
private String name;
private String sex;
private Date created;
private String comment;
// Define setter and getter
}
public class Item {
private Integer id;
private String name;
// Define setter and getter
}
48. MyBatis
MyBatis入門
ユーザーコード
public class MapperTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init() throws IOException {
String resource = "sample/context/sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test1() {
SqlSession session = sqlSessionFactory.openSession();
try {
User user = (User) session.selectOne("sample.mapper.UserMapper.selectUser", 1);
assertThat(user.getName(), is("小酒"));
} finally {
session.close();
}
}
}
49. MyBatis
MyBatis入門
ユーザーコード
public class MapperTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init() throws IOException {
String resource = "sample/context/sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test1() {
SqlSession session = sqlSessionFactory.openSession();
try {
User user = (User) session.selectOne("sample.mapper.UserMapper.selectUser", 1);
assertThat(user.getName(), is("小酒"));
} finally {
session.close();
}
}
}
sqlMapConfigの設定から
sqlSessionFactoryを生成
通常システム起動時に行えばよい
50. MyBatis
MyBatis入門
ユーザーコード
public class MapperTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init() throws IOException {
String resource = "sample/context/sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test1() {
SqlSession session = sqlSessionFactory.openSession();
try {
User user = (User) session.selectOne("sample.mapper.UserMapper.selectUser", 1);
assertThat(user.getName(), is("小酒"));
} finally {
session.close();
}
}
}
sqlSessionFactoryから
SqlSessionオブジェクトの生成
SqlSessionオブジェクトは
トランザクション制御から
Query実行、Mapper提供
などのAPIを提供する、
MyBatisの主要オブジェクト
51. MyBatis
MyBatis入門
ユーザーコード
@Test
public void test1() {
SqlSession session = sqlSessionFactory.openSession();
try {
User user = (User) session.selectOne("sample.mapper.UserMapper.selectUser", 1);
assertThat(user.getName(), is("小酒"));
} finally {
session.close();
}
}
}
<mapper namespace="sample.mapper.UserMapper" >
<select id="selectUser" resultType="sample.entity.User" >
select * from USER where id =#{id}
</select>
</mapper>
SqlMapで定義されたSQL
を呼び出し、オブジェクトに
Mappingした結果を受け取れる。
52. MyBatis
MyBatis入門
ユーザーコード
@Test
public void test2() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectUser(1);
assertThat(user.getName(), is("小酒"));
} finally {
session.close();
}
}
public interface UserMapper {
User selectUser(int id);
}
53. MyBatis
MyBatis入門
ユーザーコード
@Test
public void test2() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectUser(1);
assertThat(user.getName(), is("小酒"));
} finally {
session.close();
}
}
public interface UserMapper {
User selectUser(int id);
}
Javaインタフェースを定義して、
型安全にSql定義と紐付けることも可能。
内部ではProxyを用いて実現している。
54. MyBatis
MyBatis入門
ユーザーコード
@Test
public void test3() {
SqlSession session = sqlSessionFactory.openSession();
try {
ItemMapper itemMapper = session.getMapper(ItemMapper.class);
List<Item> items = itemMapper.selectByName("天空%");
assertThat(items.size(), is(2));
assertThat(items.get(0).getName(), is("天空の剣"));
assertThat(items.get(1).getName(), is("天空の鎧"));
} finally {
session.close();
}
}
public interface ItemMapper {
@Select("select * from ITEM where name like #{id} order by id")
List<Item> selectByName(String name);
}
55. MyBatis
MyBatis入門
ユーザーコード
@Test
public void test3() {
SqlSession session = sqlSessionFactory.openSession();
try {
ItemMapper itemMapper = session.getMapper(ItemMapper.class);
List<Item> items = itemMapper.selectByName("天空%");
assertThat(items.size(), is(2));
assertThat(items.get(0).getName(), is("天空の剣"));
assertThat(items.get(1).getName(), is("天空の鎧"));
} finally {
session.close();
}
}
public interface ItemMapper {
@Select("select * from ITEM where name like #{id} order by id")
List<Item> selectByName(String name);
}
アノーテーションを用いてSQLを定義
することも可能。
58. MyBatis
DB
MyBatis Generater
Mapper XML
Entityオブジェクト
Criteriaオブジェクト
Mapperインターフェース
自動生成設定(XMLファイル)
自動生成リソース
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="sample2" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<jdbcConnection driverClass="org.h2.Driver"
connectionURL="jdbc:h2:tcp://localhost/C:MyFilesormdaoh2db;schema=hoge"
userId="ORM" password="orm">
</jdbcConnection>
<javaModelGenerator targetPackage="sample.entity"
targetProject="gen" />
<sqlMapGenerator targetPackage="sample.sql"
targetProject="gen" />
<javaClientGenerator targetPackage="sample.mapper"
targetProject="gen" type="XMLMAPPER" />
<table tableName="USER" />
<table tableName="ITEM" />
</context>
</generatorConfiguration>
MyBatis入門
59. MyBatis
DB
MyBatis Generater
Mapper XML
Entityオブジェクト
Criteriaオブジェクト
Mapperインターフェース
自動生成設定(XMLファイル)
自動生成リソース
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="sample2" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<jdbcConnection driverClass="org.h2.Driver"
connectionURL="jdbc:h2:tcp://localhost/C:MyFilesormdaoh2db;schema=hoge"
userId="ORM" password="orm">
</jdbcConnection>
<javaModelGenerator targetPackage="sample.entity"
targetProject="gen" />
<sqlMapGenerator targetPackage="sample.sql"
targetProject="gen" />
<javaClientGenerator targetPackage="sample.mapper"
targetProject="gen" type="XMLMAPPER" />
<table tableName="USER" />
<table tableName="ITEM" />
</context>
</generatorConfiguration>
MyBatis入門
自動生成するためのスキーマ定義を提供する
Databaseへの接続定義
60. MyBatis
DB
MyBatis Generater
Mapper XML
Entityオブジェクト
Criteriaオブジェクト
Mapperインターフェース
自動生成設定(XMLファイル)
自動生成リソース
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="sample2" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<jdbcConnection driverClass="org.h2.Driver"
connectionURL="jdbc:h2:tcp://localhost/C:MyFilesormdaoh2db;schema=hoge"
userId="ORM" password="orm">
</jdbcConnection>
<javaModelGenerator targetPackage="sample.entity"
targetProject="gen" />
<sqlMapGenerator targetPackage="sample.sql"
targetProject="gen" />
<javaClientGenerator targetPackage="sample.mapper"
targetProject="gen" type="XMLMAPPER" />
<table tableName="USER" />
<table tableName="ITEM" />
</context>
</generatorConfiguration>
MyBatis入門
生成リソースのpackageや生成フォルダ、
生成リソースの種類などを定義
61. MyBatis
DB
MyBatis Generater
Mapper XML
Entityオブジェクト
Criteriaオブジェクト
Mapperインターフェース
自動生成設定(XMLファイル)
自動生成リソース
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="sample2" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<jdbcConnection driverClass="org.h2.Driver"
connectionURL="jdbc:h2:tcp://localhost/C:MyFilesormdaoh2db;schema=hoge"
userId="ORM" password="orm">
</jdbcConnection>
<javaModelGenerator targetPackage="sample.entity"
targetProject="gen" />
<sqlMapGenerator targetPackage="sample.sql"
targetProject="gen" />
<javaClientGenerator targetPackage="sample.mapper"
targetProject="gen" type="XMLMAPPER" />
<table tableName="USER" />
<table tableName="ITEM" />
</context>
</generatorConfiguration>
MyBatis入門
生成するテーブルやビューを指定
63. MyBatis
public class MapperTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init() throws IOException {
String resource = "sample/context/sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test1() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectByPrimaryKey(1);
assertThat(user.getName(), is("小酒"));
assertThat(user.getComment(), is("こんにちは"));
} finally {
session.close();
}
}
}
MyBatis入門
64. MyBatis
public class MapperTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init() throws IOException {
String resource = "sample/context/sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test1() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectByPrimaryKey(1);
assertThat(user.getName(), is("小酒"));
assertThat(user.getComment(), is("こんにちは"));
} finally {
session.close();
}
}
}
MyBatis入門
主キーによる検索メソッドが
自動生成されている。
65. MyBatis
@Test
public void test2() {
SqlSession session = sqlSessionFactory.openSession();
try {
ItemMapper itemMapper = session.getMapper(ItemMapper.class);
ItemExample itemEx = new ItemExample();
itemEx.createCriteria().andNameLike("天空%");
itemEx.or().andNameEqualTo("こんぼう");
itemEx.setOrderByClause("ID desc");
List<Item> items = itemMapper.selectByExample(itemEx);
assertThat(items.size(), is(3));
assertThat(items.get(0).getName(), is("天空の鎧"));
assertThat(items.get(1).getName(), is("天空の剣"));
assertThat(items.get(2).getName(), is("こんぼう"));
} finally {
session.close();
}
}
}
MyBatis入門
66. MyBatis
@Test
public void test2() {
SqlSession session = sqlSessionFactory.openSession();
try {
ItemMapper itemMapper = session.getMapper(ItemMapper.class);
ItemExample itemEx = new ItemExample();
itemEx.createCriteria().andNameLike("天空%");
itemEx.or().andNameEqualTo("こんぼう");
itemEx.setOrderByClause("ID desc");
List<Item> items = itemMapper.selectByExample(itemEx);
assertThat(items.size(), is(3));
assertThat(items.get(0).getName(), is("天空の鎧"));
assertThat(items.get(1).getName(), is("天空の剣"));
assertThat(items.get(2).getName(), is("こんぼう"));
} finally {
session.close();
}
}
}
MyBatis入門
Criteriaによる検索条件を指定可能。上記の例では
select * from ITEM
where name like '天空%' or name = 'こんぼう'
ordery by ID desc
のクエリーが発行されている。
67. MyBatis
@Test
public void test3() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
UserExample userEx = new UserExample();
userEx.createCriteria().andNameEqualTo("小酒");
List<User> users = userMapper.selectByExample(userEx);
assertThat(users.size(), is(1));
assertThat(users.get(0).getName(), is("小酒"));
assertThat(users.get(0).getComment(), is(nullValue()));
users = userMapper.selectByExampleWithBLOBs(userEx);
assertThat(users.get(0).getComment(), is("こんにちは"));
} finally {
session.close();
}
}
MyBatis入門
68. MyBatis
@Test
public void test3() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
UserExample userEx = new UserExample();
userEx.createCriteria().andNameEqualTo("小酒");
List<User> users = userMapper.selectByExample(userEx);
assertThat(users.size(), is(1));
assertThat(users.get(0).getName(), is("小酒"));
assertThat(users.get(0).getComment(), is(nullValue()));
users = userMapper.selectByExampleWithBLOBs(userEx);
assertThat(users.get(0).getComment(), is("こんにちは"));
} finally {
session.close();
}
}
MyBatis入門
テーブルにBlobやClobなどのLarge Object情報が
ある場合、BlobありとBlobなしの二種類の
検索方法が自動生成で用意される。
※性能的な理由によるものと思われる。
69. MyBatis
@Test
public void test4() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setId(3); user.setName("にゃんこ先生"); user.setSex("M"); user.setCreated(new java.util.Date());
userMapper.insert(user);
session.commit();
assertThat(userMapper.countByExample(new UserExample()), is(3));
:
} finally {
session.close();
}
}
MyBatis入門
70. MyBatis
@Test
public void test4() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setId(3); user.setName("にゃんこ先生"); user.setSex("M"); user.setCreated(new java.util.Date());
userMapper.insert(user);
session.commit();
assertThat(userMapper.countByExample(new UserExample()), is(3));
:
} finally {
session.close();
}
}
MyBatis入門
追加はinsertメソッドで
sessionオブジェクトのcommitメソッドおよび
rollbackメソッドでトランザクションを制御できる。
71. MyBatis
@Test
public void test4() {
SqlSession session = sqlSessionFactory.openSession();
try {
:
user.setComment("にゃー!");
userMapper.updateByPrimaryKeyWithBLOBs(user);
session.commit();
user = userMapper.selectByPrimaryKey(3);
assertThat(user.getName(), is("にゃんこ先生"));
assertThat(user.getComment(), is("にゃー!"));
userMapper.deleteByPrimaryKey(3);
session.commit();
assertThat(userMapper.countByExample(new UserExample()), is(2));
} finally {
session.close();
}
}
MyBatis入門
72. MyBatis
@Test
public void test4() {
SqlSession session = sqlSessionFactory.openSession();
try {
:
user.setComment("にゃー!");
userMapper.updateByPrimaryKeyWithBLOBs(user);
session.commit();
user = userMapper.selectByPrimaryKey(3);
assertThat(user.getName(), is("にゃんこ先生"));
assertThat(user.getComment(), is("にゃー!"));
userMapper.deleteByPrimaryKey(3);
session.commit();
assertThat(userMapper.countByExample(new UserExample()), is(2));
} finally {
session.close();
}
}
MyBatis入門
更新はupdateメソッドで
Blobあり/なしで二種類のメソッドが自動生成されている。
主キーを用いた更新や、Criteriaを用いた条件による更新が可能
73. MyBatis
@Test
public void test4() {
SqlSession session = sqlSessionFactory.openSession();
try {
:
user.setComment("にゃー!");
userMapper.updateByPrimaryKeyWithBLOBs(user);
session.commit();
user = userMapper.selectByPrimaryKey(3);
assertThat(user.getName(), is("にゃんこ先生"));
assertThat(user.getComment(), is("にゃー!"));
userMapper.deleteByPrimaryKey(3);
session.commit();
assertThat(userMapper.countByExample(new UserExample()), is(2));
} finally {
session.close();
}
}
MyBatis入門
削除はdeleteメソッドで
主キーを用いた削除や、Criteriaを用いた条件による削除が可能
79. MyBatis
Sessionを管理したい
MyBatisの活用事例
private static SqlSessionManager sessionManager;
@BeforeClass
public static void init() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sample/context/MapperConfig.xml");
sessionManager = SqlSessionManager.newInstance(new SqlSessionFactoryBuilder().build(inputStream));
}
@Before
public void before() { sessionManager.startManagedSession(); }
@After
public void after() { sessionManager.close(); }
@Test
public void test() {
UserMapper userMapper = sessionManager.getMapper(UserMapper.class);
User user = new User();
user.setId(3); user.setName("にゃんこ先生"); user.setSex("M"); user.setCreated(new java.util.Date());
userMapper.insert(user);
sessionManager.rollback();
assertThat(userMapper.countByExample(new UserExample()), is(2));
}
80. MyBatis
Sessionを管理したい
MyBatisの活用事例
private static SqlSessionManager sessionManager;
@BeforeClass
public static void init() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sample/context/MapperConfig.xml");
sessionManager = SqlSessionManager.newInstance(new SqlSessionFactoryBuilder().build(inputStream));
}
@Before
public void before() { sessionManager.startManagedSession(); }
@After
public void after() { sessionManager.close(); }
@Test
public void test() {
UserMapper userMapper = sessionManager.getMapper(UserMapper.class);
User user = new User();
user.setId(3); user.setName("にゃんこ先生"); user.setSex("M"); user.setCreated(new java.util.Date());
userMapper.insert(user);
sessionManager.rollback();
assertThat(userMapper.countByExample(new UserExample()), is(2));
}
SqlSessionFactoryからSqlSessionManagerを生成
通常、システム起動時に一度だけ生成すればいい。
81. MyBatis
Sessionを管理したい
MyBatisの活用事例
private static SqlSessionManager sessionManager;
@BeforeClass
public static void init() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sample/context/MapperConfig.xml");
sessionManager = SqlSessionManager.newInstance(new SqlSessionFactoryBuilder().build(inputStream));
}
@Before
public void before() { sessionManager.startManagedSession(); }
@After
public void after() { sessionManager.close(); }
@Test
public void test() {
UserMapper userMapper = sessionManager.getMapper(UserMapper.class);
User user = new User();
user.setId(3); user.setName("にゃんこ先生"); user.setSex("M"); user.setCreated(new java.util.Date());
userMapper.insert(user);
sessionManager.rollback();
assertThat(userMapper.countByExample(new UserExample()), is(2));
}
startManagedSessionメソッドの呼び出しで
内部的にSqlSessionインスタンスが生成され、
スレッドローカル変数で管理される。
82. MyBatis
Sessionを管理したい
MyBatisの活用事例
private static SqlSessionManager sessionManager;
@BeforeClass
public static void init() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sample/context/MapperConfig.xml");
sessionManager = SqlSessionManager.newInstance(new SqlSessionFactoryBuilder().build(inputStream));
}
@Before
public void before() { sessionManager.startManagedSession(); }
@After
public void after() { sessionManager.close(); }
@Test
public void test() {
UserMapper userMapper = sessionManager.getMapper(UserMapper.class);
User user = new User();
user.setId(3); user.setName("にゃんこ先生"); user.setSex("M"); user.setCreated(new java.util.Date());
userMapper.insert(user);
sessionManager.rollback();
assertThat(userMapper.countByExample(new UserExample()), is(2));
}
SqlSessionManagerはSqlSessionインタフェースを
実装しているので、SqlSessionと同様のAPIを
提供。
85. MyBatis
文字化けに対処したい
MyBatisの活用事例
<?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 >
:
<typeHandlers>
<typeHandler javaType="String" jdbcType="VARCHAR" handler="hogedriven.StringTypeHandler"/>
<typeHandler javaType="String" jdbcType="CHAR" handler="hogedriven.StringTypeHandler"/>
</typeHandlers>
:
</configuration>
86. MyBatis
文字化けに対処したい
MyBatisの活用事例
public final class StringTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, convertTo(parameter));
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return convertTo(rs.getString(columnName));
}
:
private static final String convertTo(String str) {
StringBuffer result = new StringBuffer();
char c;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
switch (c) {
// WAVE DASH(~)
case 0x301c:
c = 0xff5e;
break;
default:
break;
}
result.append(c);
}
return result.toString();
}
}
87. MyBatis
文字化けに対処したい
MyBatisの活用事例
public final class StringTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, convertTo(parameter));
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return convertTo(rs.getString(columnName));
}
:
private static final String convertTo(String str) {
StringBuffer result = new StringBuffer();
char c;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
switch (c) {
// WAVE DASH(~)
case 0x301c:
c = 0xff5e;
break;
default:
break;
}
result.append(c);
}
return result.toString();
}
}
DBからのread/writeのタイミングで、それぞれの
文字エンコーダに応じてUnicodeの文字コードを
変更してやればいい。
90. MyBatis
違うスキーマから自動生成したい
MyBatisの活用事例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="sample2" targetRuntime="MyBatis3">
:
<table schema="orm" tableName="USER" >
<property name="ignoreQualifiersAtRuntime" value="true"/>
</table>
<table schema="orm" tableName="ITEM" >
<property name="ignoreQualifiersAtRuntime" value="true"/>
</table>
:
</context>
</generatorConfiguration>
99. MyBatis
MyBatisの活用事例
楽したい
<generatorConfiguration>
<context id="sample2" targetRuntime="MyBatis3">
:
<plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.queryby.SelectByPlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.queryby.UpdateByPlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.queryby.DeleteByPlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.queryby.CountByPlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.selectforupdate.SelectForUpdatePlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.custommapper.CustomMapperPlugin">
<property name="targetProject" value="sql/orm" />
</plugin>
<plugin type="hogedriven.mybatis.generator.plugins.model.ModelPlugin">
<property name="targetModelPackage" value="hogedriven.sample.app.model.orm" />
<property name="targetModelBasePackage" value="hogedriven.sample.dao.orm.model" />
<property name="targetQueryPackage" value="hogedriven.sample.dao.orm.query" />
<property name="targetModelProject" value="src_wrk/model" />
<property name="targetModelBaseProject" value="src_gen" />
<property name="targetQueryProject" value="src_gen" />
</plugin>
:
</context>
</generatorConfiguration>
100. MyBatis
MyBatisの活用事例
楽したい
<generatorConfiguration>
<context id="sample2" targetRuntime="MyBatis3">
:
<plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.queryby.SelectByPlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.queryby.UpdateByPlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.queryby.DeleteByPlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.queryby.CountByPlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.selectforupdate.SelectForUpdatePlugin" />
<plugin type="hogedriven.mybatis.generator.plugins.custommapper.CustomMapperPlugin">
<property name="targetProject" value="sql/orm" />
</plugin>
<plugin type="hogedriven.mybatis.generator.plugins.model.ModelPlugin">
<property name="targetModelPackage" value="hogedriven.sample.app.model.orm" />
<property name="targetModelBasePackage" value="hogedriven.sample.dao.orm.model" />
<property name="targetQueryPackage" value="hogedriven.sample.dao.orm.query" />
<property name="targetModelProject" value="src_wrk/model" />
<property name="targetModelBaseProject" value="src_gen" />
<property name="targetQueryProject" value="src_gen" />
</plugin>
:
</context>
</generatorConfiguration>
それぞれの用途に応じて作成したPlugin達
101. MyBatis
MyBatisの活用事例
楽したい
public class SampleTest {
@BeforeClass
public static void init() throws Exception { SqlContextManager.init("test"); }
@Before
public void before() { SqlContextManager.getContext("orm").beginTransaction(); }
@After
public void after() { SqlContextManager.getContext("orm").endTransaction(); }
@Test
public void test() {
UserMo userMo = UserMo.where().idEqualTo(1).fetchFirst(UserMo.class);
assertThat(userMo, is(notNullValue()));
assertThat(userMo.getName(), is("小酒"));
userMo.setName("こざけ");
userMo.saveSelective();
userMo.remove();
SqlContextManager.getContext("orm").rollback();
}
:
102. MyBatis
MyBatisの活用事例
楽したい
public class SampleTest {
@BeforeClass
public static void init() throws Exception { SqlContextManager.init("test"); }
@Before
public void before() { SqlContextManager.getContext("orm").beginTransaction(); }
@After
public void after() { SqlContextManager.getContext("orm").endTransaction(); }
@Test
public void test() {
UserMo userMo = UserMo.where().idEqualTo(1).fetchFirst(UserMo.class);
assertThat(userMo, is(notNullValue()));
assertThat(userMo.getName(), is("小酒"));
userMo.setName("こざけ");
userMo.saveSelective();
userMo.remove();
SqlContextManager.getContext("orm").rollback();
}
:
Pluginを用いて生成したモデルによる検索
流れるようなメソッドチェーンでSimpleに
かける!