这几天研究ibatis玩,参考一篇贴子进行安装配置:蓝雪森林

选择这个帖子来跟随配置是因为这个帖子看着比较干净,但是我仍旧在配置得过程中出现了好几个问题,所以我决定在这个帖子的基础上将更多细节加上,做一个傻瓜教程。

一、前期准备

虽然ibatis能处理多种数据库,不过初学者还是比较适应mysql,因此我选择mysql作为我的数据载体。另外我准备建的是一个普通的java 工程,并采用maven命令行来建立这个工程。所以在这之前,电脑上需要安装maven和mysql。

二、工程建立

①使用maven建立java工程框架

②编辑pom.xml文件引入ibatis和mysql的依赖包

   1: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   2:     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

   3:     <modelVersion>4.0.0</modelVersion>

   4:  

   5:     <groupId>com.lipan.ibatis</groupId>

   6:     <artifactId>TestIbatis</artifactId>

   7:     <version>1.0-SNAPSHOT</version>

   8:     <packaging>jar</packaging>

   9:  

  10:     <name>TestIbatis</name>

  11:     <url>http://maven.apache.org</url>

  12:  

  13:     <properties>

  14:         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  15:     </properties>

  16:  

  17:     <dependencies>

  18:         <dependency>

  19:             <groupId>junit</groupId>

  20:             <artifactId>junit</artifactId>

  21:             <version>3.8.1</version>

  22:             <scope>test</scope>

  23:         </dependency>

  24:         <dependency>

  25:             <groupId>org.apache.ibatis</groupId>

  26:             <artifactId>ibatis-sqlmap</artifactId>

  27:             <version>2.3.4.726</version>

  28:         </dependency>

  29:         <dependency>

  30:             <groupId>mysql</groupId>

  31:             <artifactId>mysql-connector-java</artifactId>

  32:             <version>5.0.5</version>

  33:         </dependency>

  34:  

  35:     </dependencies>

  36: </project>

③下载依赖包并将maven工程转换为eclipse工程

④建立好的工程目录如下:

其中resource是后面新建的。

三、创建数据库表

可以选择命令行创建,也可以选择用可视化工具(比如Navicat Mysql来创建),我选择的是用Navicat来创建,最终创建的表的样子如下图所示。

其中,本地数据库localhost:3036中我建立了一个tbl_student的表,该表的主键是id,且有自增属性

四、填写ibatis配置文件

这里有三个配置文件:

SqlMap.properties 、SqlMapConfig.xml和Student.xml

ibatis要求首先描述数据库连接信息,这个可以在SqlMap.properties文件里面填写,同时SqlMapConfig.xml文件会读取SqlMap.properties中的信息来初始化数据库,针对每个数据库表,可以用一个专门的xml文件来描述具体的查询操作实现,这里我们建立的针对于tbl_student的xml文件称为Student.xml,接下来会给出其内容。为了组织清晰,在src目录下建立resources目录,用来存放这三个配置文件。

五、具体实现文件

这里有三个文件:

Student.java:与数据库实体对应的POJO类

   1: package com.lipan.ibatis;

   2:  

   3: import java.sql.Date;

   4: /**

   5:  * @author:lipan

   6:  * Email: areslipan@163.com

   7:  *

   8:  */

   9: public class Student {

  10:     

  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 + "\tname=" + name + "\tmajor=" + birth + "\tscore="

  42:                 + score + "\n";

  43:     }

  44:     }

StudentDao.java:定义访问数据库的接口

   1: package com.lipan.dao;

   2:  

   3:  

   4:  

   5:  

   6: import java.util.List;

   7: import com.lipan.ibatis.Student;

   8: /**

   9: * @author xudongwang 2011-12-31

  10: *

  11: * Email:xdwangiflytek@gmail.com

  12: *

  13: */

  14: public interface StudentDao {

  15:     /**

  16:      * 添加学生信息

  17:      * 

  18:      * @param student

  19:      *            学生实体

  20:      * @return 返回是否添加成功

  21:      */

  22:     public boolean addStudent(Student student);

  23:  

  24:     /**

  25:      * 根据学生id删除学生信息

  26:      * 

  27:      * @param id

  28:      *            学生id

  29:      * @return 删除是否成功

  30:      */

  31:     public boolean deleteStudentById(int id);

  32:  

  33:     /**

  34:      * 更新学生信息

  35:      * 

  36:      * @param student

  37:      *            学生实体

  38:      * @return 更新是否成功

  39:      */

  40:     public boolean updateStudent(Student student);

  41:  

  42:     /**

  43:      * 查询全部学生信息

  44:      * 

  45:      * @return 返回学生列表

  46:      */

  47:     public List<Student> selectAllStudent();

  48:  

  49:     /**

  50:      * 根据学生姓名模糊查询学生信息

  51:      * 

  52:      * @param name

  53:      *            学生姓名

  54:      * @return 学生信息列表

  55:      */

  56:     public List<Student> selectStudentByName(String name);

  57:  

  58:     /**

  59:      * 根据学生id查询学生信息

  60:      * 

  61:      * @param id

  62:      *            学生id

  63:      * @return 学生对象

  64:      */

  65:     public Student selectStudentById(int id);

  66: }

StudentDaoImpl.java:访问数据库的具体实现,需要读取SqlMapConfig.xml的配置文件

   1: package com.lipan.daoImpl;

   2:  

   3: import java.io.IOException;

   4: import java.io.Reader;

   5: import java.sql.SQLException;

   6: import java.util.List;

   7: import com.ibatis.common.resources.Resources;

   8: import com.ibatis.sqlmap.client.SqlMapClient;

   9: import com.ibatis.sqlmap.client.SqlMapClientBuilder;

  10: import com.lipan.dao.StudentDao;

  11: import com.lipan.ibatis.Student;

  12: /**

  13: * @author lipan

  14: *

  15: * Email:areslipan@163.com

  16: *

  17: */

  18: public class StudentDaoImpl implements StudentDao {

  19:     private static SqlMapClient sqlMapClient = null;

  20:     // 读取配置文件

  21:     static {

  22:         try {

  23:             Reader reader = Resources

  24:                     .getResourceAsReader("SqlMapConfig.xml");

  25:                 

  26:                     //.getResourceAsReader("SqlMapConfig.xml");

  27:             sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);

  28:             reader.close();

  29:         } catch (IOException e) {

  30:             e.printStackTrace();

  31:         }

  32:     }

  33:  

  34:     public boolean addStudent(Student student) {

  35:         Object object = null;

  36:         boolean flag = false;

  37:         try {

  38:             object = sqlMapClient.insert("addStudent", student);

  39:             System.out.println("添加学生信息的返回值:" + object);

  40:         } catch (SQLException e) {

  41:             e.printStackTrace();

  42:         }

  43:         if (object != null) {

  44:             flag = true;

  45:         }

  46:         return flag;

  47:     }

  48:  

  49:     public boolean deleteStudentById(int id) {

  50:         boolean flag = false;

  51:         Object object = null;

  52:         try {

  53:             object = sqlMapClient.delete("deleteStudentById", id);

  54:             System.out.println("删除学生信息的返回值:" + object + ",这里返回的是影响的行数");

  55:         } catch (SQLException e) {

  56:             e.printStackTrace();

  57:         }

  58:         if (object != null) {

  59:             flag = true;

  60:         }

  61:         return flag;

  62:     }

  63:  

  64:     public boolean updateStudent(Student student) {

  65:         boolean flag = false;

  66:         Object object = false;

  67:         try {

  68:             object = sqlMapClient.update("updateStudent", student);

  69:             System.out.println("更新学生信息的返回值:" + object + ",返回影响的行数");

  70:         } catch (SQLException e) {

  71:             e.printStackTrace();

  72:         }

  73:         if (object != null) {

  74:             flag = true;

  75:         }

  76:         return flag;

  77:     }

  78:  

  79:     public List<Student> selectAllStudent() {

  80:         List<Student> students = null;

  81:         try {

  82:             students = sqlMapClient.queryForList("selectAllStudent");

  83:         } catch (SQLException e) {

  84:             e.printStackTrace();

  85:         }

  86:         return students;

  87:     }

  88:  

  89:     public List<Student> selectStudentByName(String name) {

  90:         List<Student> students = null;

  91:         try {

  92:             students = sqlMapClient.queryForList("selectStudentByName", name);

  93:         } catch (SQLException e) {

  94:             e.printStackTrace();

  95:         }

  96:         return students;

  97:     }

  98:  

  99:     public Student selectStudentById(int id) {

 100:         Student student = null;

 101:         try {

 102:             student = (Student) sqlMapClient.queryForObject(

 103:                     "selectStudentById", id);

 104:         } catch (SQLException e) {

 105:             e.printStackTrace();

 106:         }

 107:         return student;

 108:     }

 109: }

 

六、测试文件

TestIbatis.java

   1: package com.lipan.ibatis;

   2:  

   3: import java.sql.Date;

   4: import java.util.List;

   5:  

   6: import com.lipan.daoImpl.StudentDaoImpl;

   7: /**

   8: * @author xudongwang 2011-12-31

   9: *

  10: * Email:xdwangiflytek@gmail.com

  11: *

  12: */

  13: public class TestIbatis {

  14: public static void main(String[] args) {

  15:         StudentDaoImpl studentDaoImpl = new StudentDaoImpl();

  16:         System.out.println("测试插入");

  17:         Student addStudent = new Student();

  18:         addStudent.setName("李四");

  19:         addStudent.setBirth(Date.valueOf("2011-09-02"));

  20:         addStudent.setScore(88);

  21:         //addStudent.setId(12);

  22:         System.out.println(studentDaoImpl.addStudent(addStudent));

  23:         System.out.println("测试根据id查询");

  24:         System.out.println(studentDaoImpl.selectStudentById(1));

  25:         System.out.println("测试模糊查询");

  26:         List<Student> mohuLists = studentDaoImpl.selectStudentByName("李");

  27:         for (Student student : mohuLists) {

  28:             System.out.println(student);

  29:         }

  30:         System.out.println("测试查询所有");

  31:         List<Student> students = studentDaoImpl.selectAllStudent();

  32:         for (Student student : students) {

  33:             System.out.println(student);

  34:         }

  35:         System.out.println("根据id删除学生信息");

  36:         System.out.println(studentDaoImpl.deleteStudentById(1));

  37:         System.out.println("测试更新学生信息");

  38:         Student updateStudent = new Student();

  39:         updateStudent.setId(1);

  40:         updateStudent.setName("李四1");

  41:         updateStudent.setBirth(Date.valueOf("2011-08-07"));

  42:         updateStudent.setScore(21);

  43:         System.out.println(studentDaoImpl.updateStudent(updateStudent));

  44:     

  45: }

  46: }

七、项目目录

八、注意

在读取SqlMapConfig.xml的时候,

Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");会提示 Could not find resource SqlMapConfig.xml,即便将这个路径编程绝对路径也会出错,原因是这个方法最终会调用Classloader.getResource()方法,个函数调用的是相对于classpath的绝对路径,所以load不进去。关于这个问题的详细理解,可以不断在代码中trace,也有个帖子专门讲这个问题。

ibatis入门教程一的更多相关文章

  1. 无废话SharePoint入门教程一[SharePoint概述]

    一.前言 听说SharePoint也有一段时间了,可一直处在门外.最近被调到SharePoint实施项目小组,就随着工作一起学习了一下实施与开发.但苦于网上SharePoint入门的东西实在太少,导致 ...

  2. [转]无废话SharePoint入门教程一[SharePoint概述]

    本文转自:http://www.cnblogs.com/iamlilinfeng/p/3026332.html 一.前言 听说SharePoint也有一段时间了,可一直处在门外.最近被调到ShareP ...

  3. typescript 入门教程一

    ##### 从今天开始,持续更新typescript入门教程系列.... 目前ts越来越火,主流的前端框架,好比*angular,vue 3*均是采用ts来编写,所有很多公司的项目都是用**ts**来 ...

  4. andorid jni入门教程一之helloworld

    开发环境:windows2007, eclipse 做anroid越深发现用到底层开发的时候越多,但是我以前也没有搞过,因此现在打算好好学习学习.先从最简单的做起.正所谓万事开头难啊. 搞了近一天终于 ...

  5. 【Cocos2d入门教程一】Cocos2d-x环境搭建

    在进行Cocos2d游戏开发前 我们先来配置一下环境,我们先来准备一下工具,我们所需要的工具分别为: 1.Cocos2d引擎 2.JDK 3.SDK 4.NDK 5.ANT 6.ADT 1.下载Coc ...

  6. Zephir入门教程一

    一.如何安装 zephir-安装和初体验:http://blog.csdn.net/u011142688/article/details/51619811 二.如何使用 需要切到工作目录下,也就是co ...

  7. Angular入门教程一

    1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟时代潮流,学习掌握新知识自然是不敢怠慢. AngularJS是google在维护,其在国外已经十分火热,可是国内的 ...

  8. Gemini.Workflow 双子工作流入门教程一:定义流程:流程图属性

    简介: Gemini.Workflow 双子工作流,是一套功能强大,使用简单的工作流,简称双子流,目前配套集成在Aries框架中. 下面介绍本篇教程:流程定义:流程图属性. 步骤一:在流程管理的流程定 ...

  9. Unity -- 入门教程一

    首先声明一下,我用的Unity版本是4.6.6,编译环境是VS2010,其余的我会慢慢介绍,安装的过程这里我就不做讲解了,度娘那会做的比我详细.安装包可以在最下面的联系方式找我要,现在开始进入主题.  ...

随机推荐

  1. __asm

    来源:http://msdn.microsoft.com/zh-cn/library/45yd4tzz.aspx Microsoft 专用 __asm 关键字调用一个内联汇编,并且可以显示,每当 c. ...

  2. 在mysql数据库中,文章表设计有啥好的思路

    Q: 用mysql设计一张文章表,不知道有啥好的思路! 我是这样的,应为考虑附件和图片,所以我的文章表除了有varchar(1000)的文章内容,还设置了个Bolb接收附件和图片. 我用的是mysql ...

  3. 类(Class)

    类 · 目的 面向对象的最主要目的是提高程序的重复使用性. · 包括 属性(attribute).方法(method) · 示例 class Bird(object): have_feather = ...

  4. Samba.conf案例 Ubuntu

    # Sample configuration file for the Samba suite for Debian GNU/Linux.## This is the main Samba confi ...

  5. [React] Make Compound React Components Flexible

    Our current compound component implementation is great, but it's limited in that users cannot render ...

  6. HDU3367 Pseudoforest 【并查集】+【贪心】

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  7. GDI+学习之------ 画线、区域填充、写字

    <精通GDI编程>里的代码.在学习过程中对它加以总结,以防以后用到,全部代码都是在MFC 单文档中实现的,写在View::OnDraw(CDC */*pDC*/)中 画线/边框(Pen) ...

  8. Linux查看文件最后几行的命令

    tail -n 20 filename说明:显示filename最后20行

  9. Oracle新建数据库

    确定楼主是以管理员身份登录的:1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 password ...

  10. python 字符编码处理问题总结 彻底击碎乱码!

    Python中常常遇到这种字符编码问题,尤其在处理网页源代码时(特别是爬虫中): UnicodeDecodeError: 'XXX' codec can't decode bytes in posit ...