• 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 连接的属性文件

    总配置文件, SqlMapConfig.xml

    关于每个实体的映射文件(Map 文件)

    Demo

    Student.java:

    Java代码
    1. package com.iflytek.entity;
    2. import java.sql.Date;
    3. /**
    4. * @author xudongwang 2011-12-31
    5. *
    6. * Email:xdwangiflytek@gmail.com
    7. *
    8. */
    9. public class Student {
    10. // 注意这里需要保证有一个无参构造方法,因为包括Hibernate在内的映射都是使用反射的,如果没有无参构造可能会出现问题
    11. private int id;
    12. private String name;
    13. private Date birth;
    14. private float score;
    15. public int getId() {
    16. return id;
    17. }
    18. public void setId(int id) {
    19. this.id = id;
    20. }
    21. public String getName() {
    22. return name;
    23. }
    24. public void setName(String name) {
    25. this.name = name;
    26. }
    27. public Date getBirth() {
    28. return birth;
    29. }
    30. public void setBirth(Date birth) {
    31. this.birth = birth;
    32. }
    33. public float getScore() {
    34. return score;
    35. }
    36. public void setScore(float score) {
    37. this.score = score;
    38. }
    39. @Override
    40. public String toString() {
    41. return "id=" + id + " name=" + name + " major=" + birth + " score="
    42. + score + " ";
    43. }
    44. }

    SqlMap.properties :

    Properties代码
    1. driver=com.mysql.jdbc.Driver
    2. url=jdbc:mysql://localhost:3306/ibatis
    3. username=root
    4. password=123

    Student.xml :

    Xml代码
    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    3. "http://ibatis.apache.org/dtd/sql-map-2.dtd">
    4. <sqlMap>
    5. <!-- 通过typeAlias使得我们在下面使用Student实体类的时候不需要写包名 -->
    6. <typeAlias alias="Student" type="com.iflytek.entity.Student" />
    7. <!-- 这样以后改了sql,就不需要去改java代码了 -->
    8. <!-- id表示select里的sql语句,resultClass表示返回结果的类型 -->
    9. <select id="selectAllStudent" resultClass="Student">
    10. select * from
    11. tbl_student
    12. </select>
    13. <!-- parameterClass表示参数的内容 -->
    14. <!-- #表示这是一个外部调用的需要传进的参数,可以理解为占位符 -->
    15. <select id="selectStudentById" parameterClass="int" resultClass="Student">
    16. select * from tbl_student where id=#id#
    17. </select>
    18. <!-- 注意这里的resultClass类型,使用Student类型取决于queryForList还是queryForObject -->
    19. <select id="selectStudentByName" parameterClass="String"
    20. resultClass="Student">
    21. select name,birth,score from tbl_student where name like
    22. '%$name$%'
    23. </select>
    24. <insert id="addStudent" parameterClass="Student">
    25. insert into
    26. tbl_student(name,birth,score) values
    27. (#name#,#birth#,#score#);
    28. <selectKey resultClass="int" keyProperty="id">
    29. select @@identity as inserted
    30. <!-- 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->
    31. <!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->
    32. <!-- mssql:select @@IDENTITY as value -->
    33. <!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->
    34. <!-- 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL。
    35. 有些是事后生成(post-generate)主键的,如MySQL和SQL Server 所以如果是Oracle数据库,则需要将selectKey写在insert之前 -->
    36. </selectKey>
    37. </insert>
    38. <delete id="deleteStudentById" parameterClass="int">
    39. <!-- #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的name会从Student里的属性里去查找 -->
    40. <!-- 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 -->
    41. delete from tbl_student where id=#id#
    42. </delete>
    43. <update id="updateStudent" parameterClass="Student">
    44. update tbl_student set
    45. name=#name#,birth=#birth#,score=#score# where id=#id#
    46. </update>
    47. </sqlMap>

    说明:

    如果xml 中没有ibatis 的提示,则window --> Preference--> XML-->XML Catalog---> 点击add

    选择uri URI: 请选择本地文件系统上

    iBatisDemo1/WebContent/WEB-INF/lib/sql-map-config-2.dtd 文件;

    Key Type: 选择Schema Location;

    Key: 需要联网的,不建议使用;

    SqlMapConfig.xml :

    Xml代码
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
    3. "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
    4. <sqlMapConfig>
    5. <!-- 引用JDBC属性的配置文件 -->
    6. <properties resource="com/iflytek/entity/SqlMap.properties" />
    7. <!-- 使用JDBC的事务管理 -->
    8. <transactionManager type="JDBC">
    9. <!-- 数据源 -->
    10. <dataSource type="SIMPLE">
    11. <property name="JDBC.Driver" value="${driver}" />
    12. <property name="JDBC.ConnectionURL" value="${url}" />
    13. <property name="JDBC.Username" value="${username}" />
    14. <property name="JDBC.Password" value="${password}" />
    15. </dataSource>
    16. </transactionManager>
    17. <!-- 这里可以写多个实体的映射文件 -->
    18. <sqlMap resource="com/iflytek/entity/Student.xml" />
    19. </sqlMapConfig>

    StudentDao :

    Java代码
    1. package com.iflytek.dao;
    2. import java.util.List;
    3. import com.iflytek.entity.Student;
    4. /**
    5. * @author xudongwang 2011-12-31
    6. *
    7. * Email:xdwangiflytek@gmail.com
    8. *
    9. */
    10. public interface StudentDao {
    11. /**
    12. * 添加学生信息
    13. *
    14. * @param student
    15. * 学生实体
    16. * @return 返回是否添加成功
    17. */
    18. public boolean addStudent(Student student);
    19. /**
    20. * 根据学生id删除学生信息
    21. *
    22. * @param id
    23. * 学生id
    24. * @return 删除是否成功
    25. */
    26. public boolean deleteStudentById(int id);
    27. /**
    28. * 更新学生信息
    29. *
    30. * @param student
    31. * 学生实体
    32. * @return 更新是否成功
    33. */
    34. public boolean updateStudent(Student student);
    35. /**
    36. * 查询全部学生信息
    37. *
    38. * @return 返回学生列表
    39. */
    40. public List<Student> selectAllStudent();
    41. /**
    42. * 根据学生姓名模糊查询学生信息
    43. *
    44. * @param name
    45. * 学生姓名
    46. * @return 学生信息列表
    47. */
    48. public List<Student> selectStudentByName(String name);
    49. /**
    50. * 根据学生id查询学生信息
    51. *
    52. * @param id
    53. * 学生id
    54. * @return 学生对象
    55. */
    56. public Student selectStudentById(int id);
    57. }

    StudentDaoImpl :

    Java代码
    1. package com.iflytek.daoimpl;
    2. import java.io.IOException;
    3. import java.io.Reader;
    4. import java.sql.SQLException;
    5. import java.util.List;
    6. import com.ibatis.common.resources.Resources;
    7. import com.ibatis.sqlmap.client.SqlMapClient;
    8. import com.ibatis.sqlmap.client.SqlMapClientBuilder;
    9. import com.iflytek.dao.StudentDao;
    10. import com.iflytek.entity.Student;
    11. /**
    12. * @author xudongwang 2011-12-31
    13. *
    14. * Email:xdwangiflytek@gmail.com
    15. *
    16. */
    17. public class StudentDaoImpl implements StudentDao {
    18. private static SqlMapClient sqlMapClient = null;
    19. // 读取配置文件
    20. static {
    21. try {
    22. Reader reader = Resources
    23. .getResourceAsReader("com/iflytek/entity/SqlMapConfig.xml");
    24. sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
    25. reader.close();
    26. } catch (IOException e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. public boolean addStudent(Student student) {
    31. Object object = null;
    32. boolean flag = false;
    33. try {
    34. object = sqlMapClient.insert("addStudent", student);
    35. System.out.println("添加学生信息的返回值:" + object);
    36. } catch (SQLException e) {
    37. e.printStackTrace();
    38. }
    39. if (object != null) {
    40. flag = true;
    41. }
    42. return flag;
    43. }
    44. public boolean deleteStudentById(int id) {
    45. boolean flag = false;
    46. Object object = null;
    47. try {
    48. object = sqlMapClient.delete("deleteStudentById", id);
    49. System.out.println("删除学生信息的返回值:" + object + ",这里返回的是影响的行数");
    50. } catch (SQLException e) {
    51. e.printStackTrace();
    52. }
    53. if (object != null) {
    54. flag = true;
    55. }
    56. return flag;
    57. }
    58. public boolean updateStudent(Student student) {
    59. boolean flag = false;
    60. Object object = false;
    61. try {
    62. object = sqlMapClient.update("updateStudent", student);
    63. System.out.println("更新学生信息的返回值:" + object + ",返回影响的行数");
    64. } catch (SQLException e) {
    65. e.printStackTrace();
    66. }
    67. if (object != null) {
    68. flag = true;
    69. }
    70. return flag;
    71. }
    72. public List<Student> selectAllStudent() {
    73. List<Student> students = null;
    74. try {
    75. students = sqlMapClient.queryForList("selectAllStudent");
    76. } catch (SQLException e) {
    77. e.printStackTrace();
    78. }
    79. return students;
    80. }
    81. public List<Student> selectStudentByName(String name) {
    82. List<Student> students = null;
    83. try {
    84. students = sqlMapClient.queryForList("selectStudentByName",name);
    85. } catch (SQLException e) {
    86. e.printStackTrace();
    87. }
    88. return students;
    89. }
    90. public Student selectStudentById(int id) {
    91. Student student = null;
    92. try {
    93. student = (Student) sqlMapClient.queryForObject(
    94. "selectStudentById", id);
    95. } catch (SQLException e) {
    96. e.printStackTrace();
    97. }
    98. return student;
    99. }
    100. }

    TestIbatis.java :

    Java代码
    1. package com.iflytek.test;
    2. import java.sql.Date;
    3. import java.util.List;
    4. import com.iflytek.daoimpl.StudentDaoImpl;
    5. import com.iflytek.entity.Student;
    6. /**
    7. * @author xudongwang 2011-12-31
    8. *
    9. * Email:xdwangiflytek@gmail.com
    10. *
    11. */
    12. public class TestIbatis {
    13. public static void main(String[] args) {
    14. StudentDaoImpl studentDaoImpl = new StudentDaoImpl();
    15. System.out.println("测试插入");
    16. Student addStudent = new Student();
    17. addStudent.setName("李四");
    18. addStudent.setBirth(Date.valueOf("2011-09-02"));
    19. addStudent.setScore(88);
    20. System.out.println(studentDaoImpl.addStudent(addStudent));
    21. System.out.println("测试根据id查询");
    22. System.out.println(studentDaoImpl.selectStudentById(1));
    23. System.out.println("测试模糊查询");
    24. List<Student> mohuLists = studentDaoImpl.selectStudentByName("李");
    25. for (Student student : mohuLists) {
    26. System.out.println(student);
    27. }
    28. System.out.println("测试查询所有");
    29. List<Student> students = studentDaoImpl.selectAllStudent();
    30. for (Student student : students) {
    31. System.out.println(student);
    32. }
    33. System.out.println("根据id删除学生信息");
    34. System.out.println(studentDaoImpl.deleteStudentById(1));
    35. System.out.println("测试更新学生信息");
    36. Student updateStudent = new Student();
    37. updateStudent.setId(1);
    38. updateStudent.setName("李四1");
    39. updateStudent.setBirth(Date.valueOf("2011-08-07"));
    40. updateStudent.setScore(21);
    41. System.out.println(studentDaoImpl.updateStudent(updateStudent));
    42. }
    43. }

    iBatis 的优缺点:

    优点:

    1、 减少代码量,简单;

    2、 性能增强;

    3、 Sql 语句与程序代码分离;

    4、 增强了移植性;

    缺点:

    1、 和Hibernate 相比,sql 需要自己写;

    2、 参数数量只能有一个,多个参数时不太方便;

  • 相关阅读:
    等差子序列(sequence)
    威士忌(whiskey)
    图论:2-SAT模板
    poj2723-Get Luffy Out
    acdream1412:2-3 trees 组合数dp
    hdu3849-By Recognizing These Guys, We Find Social Networks Useful:双连通分量
    ZOJ2317-Nice Patterns Strike Back:矩阵快速幂,高精度
    ZOJ3519-Beautiful People:最长上升子序列的变形
    hdu2460-Network:边的双连通分量
    hdu4405:概率dp
  • 原文地址:https://www.cnblogs.com/ifonly/p/3521320.html
Copyright © 2020-2023  润新知