mybatisはxmlを使って添削してコード解析を行います。


MyBatisは、一般的なsqlクエリ、記憶プロセス、および高度マッピングをサポートする耐久層フレームです。
MyBatisはほとんどのJDBCコードとパラメータの手動設定と結果セットの検索パッケージを削除しました。
MyBatisは、簡単なXMLまたは注釈を使用して構成と元のマッピングに使用してもよく、インタフェースとJavaのPOJO(Plain Old Java Object)をデータベース内の記録にマッピングしても良い。
各Mybatisアプリケーションは、Sql Session Factoryオブジェクトの例を中心としています。
sql Session Factoryオブジェクトの例は、sql Session FactoryBuiderオブジェクトによって得られます。sql Session FactoryBuiderオブジェクトは、xmlプロファイルまたは従来の使用管理において用意されたConfigrationクラスの例からsql Session Factoryオブジェクトを構築することができる。
【例:構成類を使ってsql Session Factoryを取得する】

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
//  
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
//    
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
注意この場合は、マッパークラスを追加するように構成されています。マッパークラスはJavaクラスで、これらのクラスはSQLマッピング文の注釈を含んでいて、xmlファイルの依存を回避していますが、xmlマッピングはほとんどの高級マッピング(例えば、ネストjinマッピング)の時に必要です。
このような理由で、xmlのプロファイルが存在すると、MyBatisはピアXMLファイルを自動的に検索してロードします。この場合、クラスパスに基づくBlogMapper.classクラスの名前は、BlogMapper.xmlと同じファイルディレクトリの下にロードされます。もしそうでない場合は、手動でxmlを読み込むように設定する必要があります。
【1】基本的な添削は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.web.mapper.userMapper">

   <!--     model        column        jdbcType      -->  
   <resultMap type="User" id="UserMap">
    <id property="id" column="id" javaType="int" jdbcType="INTEGER"/>
    <result property="name" column="username" javaType="string" jdbcType="VARCHAR"/>
    <result property="age" column="age" javaType="int" jdbcType="INTEGER"/>
   </resultMap>

   <!--
        result,  column == property        Java object。
              ,      :
   1.   resultMap; 
   2.  hashmap ; 
   3.        
   -->
   <select id="getUser" parameterType="int" resultMap="UserMap">
    select * from t_user where id=#{id}
   </select>

   <delete id="deleteUser" parameterType="int" >
    delete from t_user where id=#{id}
   </delete>


   <update id="updateUser" parameterType="User" >
    update t_user set username=#{name},age=#{age} where id=#{id}
   </update>

   <insert id="insertUser" parameterType="User" >
    insert into t_user(username,age) values(#{name},#{age})
   </insert>

   <!-- model's attr(name) different from column(username), so the result use UserMap -->

   <select id="getUsers" resultMap="UserMap">
    select * from t_user
   </select>
</mapper>
mybatis.xmlに登録します。このプロファイルはspringと結合するときは必要ありません。
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>

  <properties resource="jdbc.properties"/>

  <!--          -->
  <typeAliases>
    <!-- <typeAlias type="com.web.model.User" alias="User"/> -->
    <package name="com.web.model"/>
  </typeAliases>
<!-- 
  development :     
  work :     
 -->
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="POOLED">
        <property name="driver" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <mapper resource="com/web/mapper/userMapper.xml"/>
    <mapper resource="com/web/mapper/orderMapper.xml"/>
    <mapper class="com.web.mapperClass.UserMapper"/>
  </mappers>
</configuration>
【2】Sql Session Factoryでセッションを取得する
ここではxmlファイルを使ってsql Session Factoryとsql Sessionを取得します。

public static SqlSessionFactory getFactory(){
	/* flow the src dir*/
	String resource = "mybatis.xml";
	/*MybatisUtils.class.getResourceAsStream(resource)----- it's wrong !!!!
     * please distinguish the two up and down 
     * */
	InputStream inputStream = MybatisUtils.class.getClassLoader().getResourceAsStream(resource);
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
	return factory;
}
SqlSession session = factory.openSession(true);
//      ;
/*
        :
  1.factory.opensession(true);
  2.session.commit();
  */
【3】添削バックグラウンドテストコードを調べる

/*use sql xml not annotation*/
@Test
  public void testAdd(){
	SqlSession session = MybatisUtils.getFactory().openSession();
	String statement = "com.web.mapper.userMapper.insertUser";
	/*return the effect rows*/
	int insert= session.insert(statement, new User("tom5", 15));
	/*default is not auto commit*/
	session.commit(true);
	session.close();
	System.out.println("effect rows.."+insert);
}
@Test
  public void testSelect(){
	/*set auto commit ,which equals to the above*/
	SqlSession session = MybatisUtils.getFactory().openSession(true);
	String statement = "com.web.mapper.userMapper.getUser";
	/*return the effect rows*/
	User user = session.selectOne(statement, 3);
	System.out.println("effect rows.."+user);
}
@Test
  public void testUpdate(){
	SqlSession session = MybatisUtils.getFactory().openSession(true);
	String statement = "com.web.mapper.userMapper.updateUser";
	/*return the effect rows*/
	int update= session.update(statement, new User(3,"tom4", 13));
	System.out.println("effect rows.."+update);
}
@Test
  public void testDelete(){
	SqlSession session = MybatisUtils.getFactory().openSession();
	String statement = "com.web.mapper.userMapper.deleteUser";
	/*return the effect rows*/
	int delete= session.delete(statement, 6);
	/* commit by yourself*/
	session.commit();
	System.out.println("effect rows.."+delete);
	session.close();
}
@Test
  public void testGetUsers(){
	SqlSession session = MybatisUtils.getFactory().openSession();
	String statement = "com.web.mapper.userMapper.getUsers";
	/*return the List<User>*/
	List<User> users= session.selectList(statement);
	session.commit();
	System.out.println("effect rows.."+users);
	session.close();
}
Tips:
parameterTypeとreultTypeはhashmapです。
  • mapper.xml:
  • 
    <select id="getUserForMap" parameterType="hashmap" resultType="hashmap">
        select * from c_user where id=#{id};
      </select>
  • test code:
  • 
    @Test
      public void getUserForMap(){
    	SqlSession session = MybatisUtils.getFactory().openSession();
    	String statement = "com.web.mapper.userMapper.getUserForMap";
    	HashMap<String, Object> map = new HashMap<String, Object>();
    	map.put("id", 1);
    	/*return the effect rows*/
    	Object selectOne = session.selectOne(statement, map);
    	/*default is not auto commit*/
    	session.commit(true);
    	session.close();
    	System.out.println("effect rows.."+selectOne+" ,class :"+selectOne.getClass());
    }
  • reult as follows:
  • 
    effect rows..{id=1, age=12, name=luli} ,class :class java.util.HashMap
    以上より、mybatisはパラメータタイプと結果タイプによって自動的に解析パッケージを実装します。
    【拡張基本方法】
    【1】改ページリスト
    
     <select id="getListPage" parameterType="hashmap" resultMap="siteExtendDaoMap">
        select id,site_id,site_name,site_number,province,city,area,address,internal_number,longitude,latitude
        from tb_site
        --    sql
        <trim prefix="where" prefixOverrides="AND |OR "> 
          <if test="checkState!= null and checkState!=''">
            and check_state = #{checkState,jdbcType=INTEGER}
          </if>
          <if test="siteId!= null and siteId!=''">
            and site_id like concat('%',#{siteId},'%')
          </if>
          <if test="siteName!= null and siteName!=''">
            and site_name like concat('%',#{siteName},'%')
          </if>
          <if test="siteNumber!= null and siteNumber!=''">
            and site_number like concat('%', #{siteNumber},'%')
          </if>
          <if test="province!= null and province!=''">
            and province = #{province}
          </if>
          <if test="city!= null and city!=''">
            and city = #{city}
          </if>
          <if test="area!= null and area!=''">
            and area = #{area}
          </if>
        </trim> 
        --    
        <if test="sortname!= null and sortname!='' and sortorder!= null and sortorder!=''">
          order by ${sortname} ${sortorder}
        </if>
        --    
        limit ${(page-1)*pagesize},${pagesize}
     </select>
    【2】削除方法Cは、対象またはIdによる
    パラメータがpojoなら、mybatisは自動的に対象からidを取得します。
    
      <delete id="delete" parameterType="User">
        delete from tb_user
        where
        id = #{id} 
      </delete>
    
      <delete id="deleteById" parameterType="long">
        delete from tb_user
        where
        id = #{id} 
      </delete>
    【3】id listによるデータの削除
    
      <delete id="deleteByIds">
        delete from tb_user
        where id in
        --  foreach
        <foreach collection="list" item="id" open="(" separator=","close=")"> #{id} 
        </foreach>
      </delete>
    【4】getRows
    通常はget ListPageと連携して使用されます。
    
    <select id="getRows" parameterType="hashmap" resultType="long">
        select count(*) from tb_sys_role
        <if test="keySysRole!= null">
          <trim prefix="WHERE" prefixOverrides="AND |OR ">
            <if test="keySysRole.id!= null">
            and id = #{keySysRole.id}
            </if>
            <if test="keySysRole.name!= null and keySysRole.name!=''">
            and name = #{keySysRole.name}
            </if>
            <if test="keySysRole.available!= null and keySysRole.available!=''">
            and available = #{keySysRole.available}
            </if>
          </trim>
        </if>
      </select>
    締め括りをつける
    以上はmybatisを使ってxmlを添削して、コード解析のすべての内容を調べます。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。