ibatis 入门

iBatis 简介:

iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。

官网为:http://www.mybatis.org/

搭建iBatis 开发环境:

1 、导入相关的jar 包,ibatis-2.3.0.677.jar 、mysql-connector-java-5.1.6-bin.jar

2 、编写配置文件:

  Jdbc 连接的属性文件  (eg:SqlMap.properties)

  总配置文件 (SqlMapConfig.xml)

  关于每个实体的映射文件(Map 文件) (eg:Student.xml)

------------------------------------------------------------------------------------------

本文以 对学生Student的 增删改查为例

Demo:

工程目录:

数据库结构截图:


--------------------------------------------------------------------------------------------------------------------------

1. Student.java

  1. <pre class="java" name="code">package com.ibatis.entity;  
  2.   
  3. import java.sql.Date;  
  4.   
  5. public class Student {  
  6.     // 注意这里需要保证有一个无参构造方法,因为包括Hibernate在内的映射都是使用反射的,如果没有无参构造可能会出现问题   
  7.     private int id;  
  8.     private String name;  
  9.     private Date birth;  
  10.     private float score;  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setId(int id) {  
  15.         this.id = id;  
  16.     }  
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.     public Date getBirth() {  
  24.         return birth;  
  25.     }  
  26.     public void setBirth(Date birth) {  
  27.         this.birth = birth;  
  28.     }  
  29.     public float getScore() {  
  30.         return score;  
  31.     }  
  32.     public void setScore(float score) {  
  33.         this.score = score;  
  34.     }  
  35.       
  36.     @Override  
  37.     public String toString() {  
  38.         return "Student [id=" + id + ", name=" + name + ", birth=" + birth  
  39.                 + ", score=" + score + "]";  
  40.     }  
  41.       
  42.       
  43.       
  44.   
  45. }  
  46. </pre><br>  
  47. <p></p>  
  48. <pre></pre>  
  49. <p></p>  
  50. <p class="MsoNormal">2. SqlMap.properties</p>  
  51. <p class="MsoNormal"></p><pre class="html" name="code">driver=com.mysql.jdbc.Driver  
  52. url=jdbc:mysql://localhost:3306/mydb  
  53. username=root  
  54. password=123456</pre><p></p>  
  55. <p class="MsoNormal">3. Student.xml</p>  
  56. <p class="MsoNormal"></p><pre class="html" name="code"><?xml version="1.0" encoding="UTF-8" ?>  
  57. <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"  
  58.    "http://ibatis.apache.org/dtd/sql-map-2.dtd">  
  59.   
  60. <sqlMap>  
  61.     <!-- 通过typeAlias使得我们在下面使用Student实体类的时候不需要写包名 -->  
  62.     <typeAlias alias="Student" type="com.ibatis.entity.Student" />  
  63.   
  64.     <!-- 这样以后改了sql,就不需要去改java代码了 -->  
  65.     <!-- id表示select里的sql语句,resultClass表示返回结果的类型 -->  
  66.     <select id="selectAllStudent" resultClass="Student">  
  67.         select * from  
  68.         tbl_student  
  69.     </select>  
  70.   
  71.     <!-- parameterClass表示参数的内容 -->  
  72.     <!-- #表示这是一个外部调用的需要传进的参数,可以理解为占位符 -->  
  73.     <select id="selectStudentById" parameterClass="int" resultClass="Student">  
  74.         select * from tbl_student where id=#id#  
  75.     </select>  
  76.   
  77.     <!-- 注意这里的resultClass类型,使用Student类型取决于queryForList还是queryForObject -->  
  78.     <select id="selectStudentByName" parameterClass="String"  
  79.         resultClass="Student">  
  80.         select name,birth,score from tbl_student where name like  
  81.         '%$name$%'  
  82.     </select>  
  83.   
  84.     <insert id="addStudent" parameterClass="Student">  
  85.         insert into  
  86.         tbl_student(name,birth,score) values  
  87.         (#name#,#birth#,#score#);  
  88.         <selectKey resultClass="int" keyProperty="id">  
  89.             select @@identity as inserted  
  90.             <!-- 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->  
  91.             <!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->  
  92.             <!-- mssql:select @@IDENTITY as value -->  
  93.             <!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->  
  94.             <!-- 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL。   
  95.                 有些是事后生成(post-generate)主键的,如MySQL和SQL Server 所以如果是Oracle数据库,则需要将selectKey写在insert之前 -->  
  96.         </selectKey>  
  97.     </insert>  
  98.   
  99.     <delete id="deleteStudentById" parameterClass="int">  
  100.         <!-- #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的name会从Student里的属性里去查找 -->  
  101.         <!-- 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 -->  
  102.         delete from tbl_student where id=#id#  
  103.     </delete>  
  104.   
  105.     <update id="updateStudent" parameterClass="Student">  
  106.         update tbl_student set  
  107.         name=#name#,birth=#birth#,score=#score# where id=#id#  
  108.     </update>  
  109.   
  110. </sqlMap></pre><p></p>  
  111. <p class="MsoNormal">4. SqlMapConfig.xml</p>  
  112. <p class="MsoNormal"></p><pre class="html" name="code"><?xml version="1.0" encoding="UTF-8"?>  
  113. <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"  
  114.     "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">  
  115.   
  116. <sqlMapConfig>  
  117.     <!-- 引用JDBC属性的配置文件 -->  
  118.     <properties resource="com/ibatis/SqlMap.properties" />  
  119.     <!-- 使用JDBC的事务管理 -->  
  120.     <transactionManager type="JDBC">  
  121.         <!-- 数据源 -->  
  122.         <dataSource type="SIMPLE">  
  123.             <property name="JDBC.Driver" value="${driver}" />  
  124.             <property name="JDBC.ConnectionURL" value="${url}" />  
  125.             <property name="JDBC.Username" value="${username}" />  
  126.             <property name="JDBC.Password" value="${password}" />  
  127.         </dataSource>  
  128.     </transactionManager>  
  129.     <!-- 这里可以写多个实体的映射文件 -->  
  130.     <sqlMap resource="com/ibatis/Student.xml" />  
  131. </sqlMapConfig></pre><p></p>  
  132. <p class="MsoNormal">5. StudentDao.java</p>  
  133. <p class="MsoNormal"></p><pre class="java" name="code">package com.ibatis.dao;  
  134.   
  135. import java.util.List;  
  136.   
  137. import com.ibatis.entity.Student;  
  138. public interface StudentDao {  
  139.   
  140.     /** 
  141.      * 添加学生信息 
  142.      *  
  143.      * @param student 
  144.      *            学生实体 
  145.      * @return 返回是否添加成功 
  146.      */  
  147.     public boolean addStudent(Student student);  
  148.   
  149.     /** 
  150.      * 根据学生id删除学生信息 
  151.      *  
  152.      * @param id 
  153.      *            学生id 
  154.      * @return 删除是否成功 
  155.      */  
  156.     public boolean deleteStudentById(int id);  
  157.   
  158.     /** 
  159.      * 更新学生信息 
  160.      *  
  161.      * @param student 
  162.      *            学生实体 
  163.      * @return 更新是否成功 
  164.      */  
  165.     public boolean updateStudent(Student student);  
  166.   
  167.     /** 
  168.      * 查询全部学生信息 
  169.      *  
  170.      * @return 返回学生列表 
  171.      */  
  172.     public List<Student> selectAllStudent();  
  173.   
  174.     /** 
  175.      * 根据学生姓名模糊查询学生信息 
  176.      *  
  177.      * @param name 
  178.      *            学生姓名 
  179.      * @return 学生信息列表 
  180.      */  
  181.     public List<Student> selectStudentByName(String name);  
  182.   
  183.     /** 
  184.      * 根据学生id查询学生信息 
  185.      *  
  186.      * @param id 
  187.      *            学生id 
  188.      * @return 学生对象 
  189.      */  
  190.     public Student selectStudentById(int id);  
  191.   
  192. }  
  193. </pre><p></p>  
  194. <p class="MsoNormal"><br>  
  195. 6. StudentDaoImpl.java</p>  
  196. <p class="MsoNormal"></p><pre code_snippet_id="331030" snippet_file_name="blog_20140507_6_8345100" class="java" name="code">package com.ibatis.daoimpl;  
  197. import java.io.IOException;  
  198. import java.io.Reader;  
  199. import java.sql.SQLException;  
  200. import java.util.List;  
  201. import com.ibatis.dao.StudentDao;  
  202. import com.ibatis.entity.Student;  
  203.   
  204.   
  205. import com.ibatis.common.resources.Resources;  
  206. import com.ibatis.sqlmap.client.SqlMapClient;  
  207. import com.ibatis.sqlmap.client.SqlMapClientBuilder;  
  208.   
  209. public class StudentDaoImpl implements StudentDao {  
  210.   
  211.       
  212.     private static SqlMapClient sqlMapClient = null;  
  213.   
  214.     // 读取配置文件  
  215.         static {  
  216.             try {  
  217.                 Reader reader = Resources  
  218.                         .getResourceAsReader("com/ibatis/SqlMapConfig.xml");  
  219.                 sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);  
  220.                 reader.close();  
  221.             } catch (IOException e) {  
  222.                 e.printStackTrace();  
  223.             }  
  224.         }  
  225.   
  226.         public boolean addStudent(Student student) {  
  227.             Object object = null;  
  228.             boolean flag = false;  
  229.             try {  
  230.                 object = sqlMapClient.insert("addStudent", student);  
  231.                 System.out.println("添加学生信息的返回值:" + object);  
  232.             } catch (SQLException e) {  
  233.                 e.printStackTrace();  
  234.             }  
  235.             if (object != null) {  
  236.                 flag = true;  
  237.             }  
  238.             return flag;  
  239.         }  
  240.   
  241.         public boolean deleteStudentById(int id) {  
  242.             boolean flag = false;  
  243.             Object object = null;  
  244.             try {  
  245.                 object = sqlMapClient.delete("deleteStudentById", id);  
  246.                 System.out.println("删除学生信息的返回值:" + object + ",这里返回的是影响的行数");  
  247.             } catch (SQLException e) {  
  248.                 e.printStackTrace();  
  249.             }  
  250.             if (object != null) {  
  251.                 flag = true;  
  252.   
  253.             }  
  254.             return flag;  
  255.   
  256.         }  
  257.   
  258.         public boolean updateStudent(Student student) {  
  259.             boolean flag = false;  
  260.             Object object = false;  
  261.             try {  
  262.                 object = sqlMapClient.update("updateStudent", student);  
  263.                 System.out.println("更新学生信息的返回值:" + object + ",返回影响的行数");  
  264.             } catch (SQLException e) {  
  265.                 e.printStackTrace();  
  266.             }  
  267.             if (object != null) {  
  268.                 flag = true;  
  269.             }  
  270.             return flag;  
  271.         }  
  272.   
  273.         public List<Student> selectAllStudent() {  
  274.             List<Student> students = null;  
  275.             try {  
  276.                 students = sqlMapClient.queryForList("selectAllStudent");  
  277.             } catch (SQLException e) {  
  278.                 e.printStackTrace();  
  279.             }  
  280.             return students;  
  281.         }  
  282.   
  283.         public List<Student> selectStudentByName(String name) {  
  284.             List<Student> students = null;  
  285.             try {  
  286.                 students = sqlMapClient.queryForList("selectStudentByName",name);  
  287.             } catch (SQLException e) {  
  288.                 e.printStackTrace();  
  289.             }  
  290.             return students;  
  291.         }  
  292.   
  293.         public Student selectStudentById(int id) {  
  294.             Student student = null;  
  295.             try {  
  296.                 student = (Student) sqlMapClient.queryForObject(  
  297.                         "selectStudentById", id);  
  298.             } catch (SQLException e) {  
  299.                 e.printStackTrace();  
  300.             }  
  301.             return student;  
  302.         }  
  303.   
  304. }  
  305. </pre><p></p>  
  306. <p class="MsoNormal"><br>  
  307. 7. TestIbatis.java</p>  
  308. <p class="MsoNormal"></p><pre code_snippet_id="331030" snippet_file_name="blog_20140507_7_8879679" class="java" name="code">package com.ibatis.test;  
  309. import java.sql.Date;  
  310. import java.util.List;  
  311.   
  312. import com.ibatis.daoimpl.StudentDaoImpl;  
  313. import com.ibatis.entity.Student;  
  314.   
  315.   
  316. public class TestIbatis {  
  317.   
  318.     public static void main(String[] args) {  
  319.         StudentDaoImpl studentDaoImpl = new StudentDaoImpl();  
  320.   
  321.         System.out.println("测试插入");  
  322.         Student addStudent = new Student();  
  323.         addStudent.setName("李四");  
  324.         addStudent.setBirth(Date.valueOf("2011-09-02"));  
  325.         addStudent.setScore(88);  
  326.         System.out.println(studentDaoImpl.addStudent(addStudent));  
  327.   
  328.         System.out.println("测试根据id查询");  
  329.         System.out.println(studentDaoImpl.selectStudentById(1));  
  330.   
  331.         System.out.println("测试模糊查询");  
  332.         List<Student> mohuLists = studentDaoImpl.selectStudentByName("李");  
  333.         for (Student student : mohuLists) {  
  334.             System.out.println(student);  
  335.         }  
  336.   
  337.         System.out.println("测试查询所有");  
  338.         List<Student> students = studentDaoImpl.selectAllStudent();  
  339.         for (Student student : students) {  
  340.             System.out.println(student);  
  341.         }  
  342.   
  343.         System.out.println("根据id删除学生信息");  
  344.         System.out.println(studentDaoImpl.deleteStudentById(1));  
  345.   
  346.         System.out.println("测试更新学生信息");  
  347.         Student updateStudent = new Student();  
  348.         updateStudent.setId(1);  
  349.         updateStudent.setName("李四1");  
  350.         updateStudent.setBirth(Date.valueOf("2011-08-07"));  
  351.         updateStudent.setScore(21);  
  352.         System.out.println(studentDaoImpl.updateStudent(updateStudent));  
  353.   
  354.     }  
  355. }  
  356. </pre><br>  
  357. <p></p>  
  358. <p class="MsoNormal"><strong><span>iBatis</span> <span>的优缺点:</span> </strong></p>  
  359. <p class="MsoNormal"><span>优点:</span> </p>  
  360. <p class="MsoListParagraph"><span><span>1、<span> </span></span></span><span>减少代码量,简单;</span>  
  361. </p>  
  362. <p class="MsoListParagraph"><span><span>2、<span> </span></span></span><span>性能增强;</span>  
  363. </p>  
  364. <p class="MsoListParagraph"><strong><span><span>3、<span> </span></span></span><span>Sql</span>  
  365. <span>语句与程序代码分离;</span> </strong></p>  
  366. <p class="MsoListParagraph"><span><span>4、<span> </span></span></span><span>增强了移植性;</span>  
  367. </p>  
  368. <p class="MsoNormal"><span>缺点:</span> </p>  
  369. <p class="MsoListParagraph"><span><span>1、<span> </span></span></span><span>和<span>Hibernate</span> 相比,<span>sql</span> 需要自己写;</span>  
  370. </p>  
  371. <p class="MsoListParagraph"><span><span>2、<span> </span></span></span><span>参数数量只能有一个,多个参数时不太方便;</span><br>  
  372. </p>  
  373. <p class="MsoNormal"><br>  
  374. </p>  
  375. <p class="MsoNormal"><br>  
  376. <br>  
  377. </p> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值