ibatis入门教程一
这几天研究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入门教程一的更多相关文章
- 无废话SharePoint入门教程一[SharePoint概述]
一.前言 听说SharePoint也有一段时间了,可一直处在门外.最近被调到SharePoint实施项目小组,就随着工作一起学习了一下实施与开发.但苦于网上SharePoint入门的东西实在太少,导致 ...
- [转]无废话SharePoint入门教程一[SharePoint概述]
本文转自:http://www.cnblogs.com/iamlilinfeng/p/3026332.html 一.前言 听说SharePoint也有一段时间了,可一直处在门外.最近被调到ShareP ...
- typescript 入门教程一
##### 从今天开始,持续更新typescript入门教程系列.... 目前ts越来越火,主流的前端框架,好比*angular,vue 3*均是采用ts来编写,所有很多公司的项目都是用**ts**来 ...
- andorid jni入门教程一之helloworld
开发环境:windows2007, eclipse 做anroid越深发现用到底层开发的时候越多,但是我以前也没有搞过,因此现在打算好好学习学习.先从最简单的做起.正所谓万事开头难啊. 搞了近一天终于 ...
- 【Cocos2d入门教程一】Cocos2d-x环境搭建
在进行Cocos2d游戏开发前 我们先来配置一下环境,我们先来准备一下工具,我们所需要的工具分别为: 1.Cocos2d引擎 2.JDK 3.SDK 4.NDK 5.ANT 6.ADT 1.下载Coc ...
- Zephir入门教程一
一.如何安装 zephir-安装和初体验:http://blog.csdn.net/u011142688/article/details/51619811 二.如何使用 需要切到工作目录下,也就是co ...
- Angular入门教程一
1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟时代潮流,学习掌握新知识自然是不敢怠慢. AngularJS是google在维护,其在国外已经十分火热,可是国内的 ...
- Gemini.Workflow 双子工作流入门教程一:定义流程:流程图属性
简介: Gemini.Workflow 双子工作流,是一套功能强大,使用简单的工作流,简称双子流,目前配套集成在Aries框架中. 下面介绍本篇教程:流程定义:流程图属性. 步骤一:在流程管理的流程定 ...
- Unity -- 入门教程一
首先声明一下,我用的Unity版本是4.6.6,编译环境是VS2010,其余的我会慢慢介绍,安装的过程这里我就不做讲解了,度娘那会做的比我详细.安装包可以在最下面的联系方式找我要,现在开始进入主题. ...
随机推荐
- CSS类选择器
CSS 选择器参考手册 还是 .class #id element 用的最多! 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. "CSS" 列指 ...
- 饭卡-HDU2546(01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2546 饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory L ...
- 学习日常笔记<day09>Http协议
1 Http协议入门 1.1 什么是http协议 http协议: 对浏览器客户端 和 服务器端 之间数据传输的格式规范 1.2 查看http协议的工具 1)使用火狐的firebug插件(右键-> ...
- select语句中会影响查询效率的因素
1.没有创建索引,或者没有正确使用索引;2.存在死锁的情况,从而导致select语句挂起; 3.返回不必要的列,如很多人喜欢在程序中使用select * from 这样会查询表或视图中的所有字段,如果 ...
- clamav完整查杀linux病毒实战(摘抄)
http://dadloveu.blog.51cto.com/blog/715500/1882521 Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,L ...
- 文本分类——NaiveBayes
前面文章已经介绍了朴素贝叶斯算法的原理,这里基于NavieBayes算法对newsgroup文本进行分类測试. 文中代码參考:http://blog.csdn.net/jiangliqing1234/ ...
- ZOJ 1806 (小数高精度)
题意:八进制小数转化成十进制的小数. 0.d1d2d3 ... dk [8] = 0.D1D2D3 ... Dm [10] 例: 0.75 [8] = 7*8^-1+5*8^-2 = ( 5/8 + ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--button控制主角Jump&Crouch
说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- 如何遍历newtonsoft.json的JObject里的JSON数据
这种问题,在网上搜,居然没有答案,又是一堆垃圾,连谷歌上都搜不到.老实说,我喜欢这边的工作环境,可以上谷歌,毕竟是大公司,有自己的VPN .某组织整天禁这个禁那个,去年居然连谷歌都禁了,丧心病狂至此, ...
- 【bzoj2748】[HAOI2012]音量调节
设F[i][j]表示在第i首歌曲结束后,音量能否刚好为j 转移:F[i][j]=F[i][j-C[i]] or F[i][j+C[i]] 初始化:F[0][beginlevel]=true 最后在所有 ...