ibatis(2)ibatis是什么
生活随笔
收集整理的這篇文章主要介紹了
ibatis(2)ibatis是什么
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README
1)本文部分內容轉自 “ibatis in action”,旨在 review?“ibatis是什么”?的相關知識;
2)intro to ibatis: ibatis 就是數據映射器,Martin Fowler在《企業應用架構模式》中,對 data mapper模式是這樣描述的: 所謂映射器層,是用于在對象和數據庫之間搬運數據,同時保證對象,數據庫以及映射器本身都相互獨立;(干貨——數據映射器的描述)
3)與ORM 不同的是:ibatis 不是直接將類映射為數據庫 后者 說把類的字段映射為數據庫列,而是吧sql 語句的參數與結果(也即輸入與輸出)映射為類;(干貨——ibatis 把 sql 語句的輸入輸出映射為類)
4)ibatis 在 類和數據庫表之間建立了一個額外的間接層: 這為 在類和數據庫表之間建立映射關系帶來了極大的靈活性。其實這個間接層就是 SQL,這個間接層使得 ibatis 能夠更好地隔離數據庫設計 和 應用程序中使用的對象模型,這就使得它們之家的相關性降至最低;下圖展示了ibatis 如何使用 sql 映射數據;(干貨——ibatis 在 類和數據庫表之間建立了一個額外的間接層,這個間接層就是sql 語句)
Attention)ibatis 團隊通常將 所謂的 “數據映射器” 稱為 SQL 映射器;
【1】映射 SQL 語句 Attention)以下的sql 映射是基于 ibatis的,不同于 mybatis;(它們的idea是一樣的,只不過xml 元素的屬性變了而已) 1)intro:任何一條sql 語句都可以看做是 一組輸入和輸出;如下圖所示:
2)ibatis 使用xml 描述符文件來映射 SQL 語句的輸入和輸出;(我這里po出的是 mybatis 風格的 sql映射) <insert id="insert" parameterType="com.mybatis.model.Student"><selectKey resultType="java.lang.Integer" keyProperty="id"order="AFTER">SELECT LAST_INSERT_ID()</selectKey>insert into t_student (name)values (#{name,jdbcType=VARCHAR})</insert>
【2】ibatis 如何工作 【2.1】ibatis 之于小型、簡單系統 1)intro:ibatis非常適合小型系統,reason如下: reason1)ibatis 本身就很小,它不需要服務器或者其他任何類型的中間件,不需要任何額外的基礎設施,沒有任何的第三方依賴包; reason2)ibatis 不會對應用程序或者數據庫的現有設計強加任何措施; reason3)ibatis 同樣非常適合大型系統,它甚至可以擴展以滿足企業級應用程序的需要;
【2.2】ibatis 之于大型,企業級系統 1)intro: reasons如下: reason1)ibatis 沒有對數據庫模型或對象模型的設計做出任何假設; reason2)ibatis 的某些特征使得它能夠非常高效地處理大型數據集; reason3)ibatis 允許你用多種方式建立從 對象到數據庫的映射關系;
【4】何時不使用 ibatis case1)當你具有完全控制權時,就有充分理由使用一個完全的 對象/關系映射方案,如Hibernate; case2)當應用程序需要完全動態的 SQL時,那么 選擇ibatis就是錯誤的選擇;如果每條語句都是動態生成的話,最好使用原始的 JDBC; case3)當沒有使用 關系數據庫時; case4)當ibatis 不起作用時;
【5】 ibatis的一個荔枝(這里,我po出了 ?mybatis的荔枝) step1)mybatis 的 映射文件的自動生成,參見???Spring4.2.6+SpringMVC4.2.6+MyBatis3.4.0 整合?中的 準備工作章節; step2)修改 *Mapper.xml 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="com.mybatis.dao.StudentMapper"><resultMap id="BaseResultMap" type="com.mybatis.model.Student"><id column="id" property="id" jdbcType="INTEGER" /><result column="name" property="name" jdbcType="VARCHAR" /></resultMap><insert id="insert" parameterType="com.mybatis.model.Student"><selectKey resultType="java.lang.Integer" keyProperty="id"order="AFTER">SELECT LAST_INSERT_ID()</selectKey>insert into t_student (name)values (#{name,jdbcType=VARCHAR})</insert><sql id="Base_Column_List">id, name</sql><select id="selectByPrimaryKey" resultMap="BaseResultMap"parameterType="java.lang.Integer">select<include refid="Base_Column_List" />from t_studentwhere id = #{id,jdbcType=INTEGER}</select><delete id="deleteByPrimaryKey" parameterType="int">delete from t_studentwhere id = #{id,jdbcType=INTEGER}</delete><update id="updateByPrimaryKey" parameterType="com.mybatis.model.Student">update t_studentset name = #{name,jdbcType=VARCHAR}where id = #{id,jdbcType=INTEGER}</update><update id="updateByPrimaryKeySelective" parameterType="com.mybatis.model.Student">update t_student<set><if test="name != null">name = #{name,jdbcType=VARCHAR},</if></set>where id = #{id,jdbcType=INTEGER}</update> </mapper> step3)建立 model層中的邏輯處理器(service): package com.mybatis.service;import com.mybatis.model.Student;public interface StudentService {int insertStudent(int id, String username);Student getStudentById(int Id);int deleteStudent(int id);int updateStudent(Student stu);int updateStudentSelective(Student stu);} package com.mybatis.serviceImpl;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import com.mybatis.dao.StudentMapper; import com.mybatis.model.Student; import com.mybatis.service.StudentService;@Service public class StudentServiceImpl implements StudentService{@Autowiredprivate StudentMapper studentMapper;@Overridepublic int insertStudent(int id, String username) {Student stu = new Student(id, username);int result = studentMapper.insert(stu); return result;}@Overridepublic Student getStudentById(int id) {return studentMapper.selectByPrimaryKey(id);}@Overridepublic int deleteStudent(int id) {return studentMapper.deleteByPrimaryKey(id);}@Overridepublic int updateStudent(Student stu) {int result = studentMapper.updateByPrimaryKey(stu);return result;}@Overridepublic int updateStudentSelective(Student stu) {int result = studentMapper.updateByPrimaryKeySelective(stu);return result;} } step4)利用spring test 作為 client,測試用例如下: package com.mybatis.test;import javax.annotation.Resource;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.mybatis.model.Student; import com.mybatis.service.StudentService;@RunWith(SpringJUnit4ClassRunner.class) //表示繼承了SpringJUnit4ClassRunner類 @ContextConfiguration(locations = {"classpath:spring-mybatis.xml"}) public class TestMyBatis { @Resource private StudentService studentService; @Testpublic void testUpdate2() {studentService.insertStudent(4, "zhugeliang"); Student stu = studentService.getStudentById(4);stu.setName("new_"+stu.getName());int result = studentService.updateStudentSelective(stu);System.out.println(result);}/*@Testpublic void testUpdate1() {studentService.insertStudent(3, "zhouyu");Student stu = studentService.getStudentById(3);stu.setName("new_zhouyu");int result = studentService.updateStudent(stu);System.out.println(result);}*//*@Testpublic void testDelete() {int result = studentService.deleteStudent(1);System.out.println(result);}*//*@Test public void test1() { Student stu = studentService.getStudentById(1); System.out.println(" the name is " + stu.getName()); } @Testpublic void testInsert() {studentService.insertStudent(2, "liubei");System.out.println("the 2nd name is " + studentService.getStudentById(2).getName());}*/ }
Attention)ibatis 團隊通常將 所謂的 “數據映射器” 稱為 SQL 映射器;
【1】映射 SQL 語句 Attention)以下的sql 映射是基于 ibatis的,不同于 mybatis;(它們的idea是一樣的,只不過xml 元素的屬性變了而已) 1)intro:任何一條sql 語句都可以看做是 一組輸入和輸出;如下圖所示:
2)ibatis 使用xml 描述符文件來映射 SQL 語句的輸入和輸出;(我這里po出的是 mybatis 風格的 sql映射) <insert id="insert" parameterType="com.mybatis.model.Student"><selectKey resultType="java.lang.Integer" keyProperty="id"order="AFTER">SELECT LAST_INSERT_ID()</selectKey>insert into t_student (name)values (#{name,jdbcType=VARCHAR})</insert>
【2】ibatis 如何工作 【2.1】ibatis 之于小型、簡單系統 1)intro:ibatis非常適合小型系統,reason如下: reason1)ibatis 本身就很小,它不需要服務器或者其他任何類型的中間件,不需要任何額外的基礎設施,沒有任何的第三方依賴包; reason2)ibatis 不會對應用程序或者數據庫的現有設計強加任何措施; reason3)ibatis 同樣非常適合大型系統,它甚至可以擴展以滿足企業級應用程序的需要;
【2.2】ibatis 之于大型,企業級系統 1)intro: reasons如下: reason1)ibatis 沒有對數據庫模型或對象模型的設計做出任何假設; reason2)ibatis 的某些特征使得它能夠非常高效地處理大型數據集; reason3)ibatis 允許你用多種方式建立從 對象到數據庫的映射關系;
【4】何時不使用 ibatis case1)當你具有完全控制權時,就有充分理由使用一個完全的 對象/關系映射方案,如Hibernate; case2)當應用程序需要完全動態的 SQL時,那么 選擇ibatis就是錯誤的選擇;如果每條語句都是動態生成的話,最好使用原始的 JDBC; case3)當沒有使用 關系數據庫時; case4)當ibatis 不起作用時;
【5】 ibatis的一個荔枝(這里,我po出了 ?mybatis的荔枝) step1)mybatis 的 映射文件的自動生成,參見???Spring4.2.6+SpringMVC4.2.6+MyBatis3.4.0 整合?中的 準備工作章節; step2)修改 *Mapper.xml 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="com.mybatis.dao.StudentMapper"><resultMap id="BaseResultMap" type="com.mybatis.model.Student"><id column="id" property="id" jdbcType="INTEGER" /><result column="name" property="name" jdbcType="VARCHAR" /></resultMap><insert id="insert" parameterType="com.mybatis.model.Student"><selectKey resultType="java.lang.Integer" keyProperty="id"order="AFTER">SELECT LAST_INSERT_ID()</selectKey>insert into t_student (name)values (#{name,jdbcType=VARCHAR})</insert><sql id="Base_Column_List">id, name</sql><select id="selectByPrimaryKey" resultMap="BaseResultMap"parameterType="java.lang.Integer">select<include refid="Base_Column_List" />from t_studentwhere id = #{id,jdbcType=INTEGER}</select><delete id="deleteByPrimaryKey" parameterType="int">delete from t_studentwhere id = #{id,jdbcType=INTEGER}</delete><update id="updateByPrimaryKey" parameterType="com.mybatis.model.Student">update t_studentset name = #{name,jdbcType=VARCHAR}where id = #{id,jdbcType=INTEGER}</update><update id="updateByPrimaryKeySelective" parameterType="com.mybatis.model.Student">update t_student<set><if test="name != null">name = #{name,jdbcType=VARCHAR},</if></set>where id = #{id,jdbcType=INTEGER}</update> </mapper> step3)建立 model層中的邏輯處理器(service): package com.mybatis.service;import com.mybatis.model.Student;public interface StudentService {int insertStudent(int id, String username);Student getStudentById(int Id);int deleteStudent(int id);int updateStudent(Student stu);int updateStudentSelective(Student stu);} package com.mybatis.serviceImpl;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import com.mybatis.dao.StudentMapper; import com.mybatis.model.Student; import com.mybatis.service.StudentService;@Service public class StudentServiceImpl implements StudentService{@Autowiredprivate StudentMapper studentMapper;@Overridepublic int insertStudent(int id, String username) {Student stu = new Student(id, username);int result = studentMapper.insert(stu); return result;}@Overridepublic Student getStudentById(int id) {return studentMapper.selectByPrimaryKey(id);}@Overridepublic int deleteStudent(int id) {return studentMapper.deleteByPrimaryKey(id);}@Overridepublic int updateStudent(Student stu) {int result = studentMapper.updateByPrimaryKey(stu);return result;}@Overridepublic int updateStudentSelective(Student stu) {int result = studentMapper.updateByPrimaryKeySelective(stu);return result;} } step4)利用spring test 作為 client,測試用例如下: package com.mybatis.test;import javax.annotation.Resource;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.mybatis.model.Student; import com.mybatis.service.StudentService;@RunWith(SpringJUnit4ClassRunner.class) //表示繼承了SpringJUnit4ClassRunner類 @ContextConfiguration(locations = {"classpath:spring-mybatis.xml"}) public class TestMyBatis { @Resource private StudentService studentService; @Testpublic void testUpdate2() {studentService.insertStudent(4, "zhugeliang"); Student stu = studentService.getStudentById(4);stu.setName("new_"+stu.getName());int result = studentService.updateStudentSelective(stu);System.out.println(result);}/*@Testpublic void testUpdate1() {studentService.insertStudent(3, "zhouyu");Student stu = studentService.getStudentById(3);stu.setName("new_zhouyu");int result = studentService.updateStudent(stu);System.out.println(result);}*//*@Testpublic void testDelete() {int result = studentService.deleteStudent(1);System.out.println(result);}*//*@Test public void test1() { Student stu = studentService.getStudentById(1); System.out.println(" the name is " + stu.getName()); } @Testpublic void testInsert() {studentService.insertStudent(2, "liubei");System.out.println("the 2nd name is " + studentService.getStudentById(2).getName());}*/ }
總結
以上是生活随笔為你收集整理的ibatis(2)ibatis是什么的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (linux sip)
- 下一篇: 怎么把自己的脸p到别人的照片上