`
sarin
  • 浏览: 1748497 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:172858
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:366623
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:188354
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:98808
社区版块
存档分类
最新评论

iBatis开发环境搭建和第一个程序

阅读更多
    iBatis是一款使用方便的数据访问工具,也可作为数据持久层的框架。和ORM框架(如Hibernate)将数据库表直接映射为Java对象相比,iBatis是将SQL语句映射为Java对象。相对于全自动SQL的Hibernate,iBatis允许你对SQL有完全控制权,可以视为半自动的数据访问工具。
    iBatis的最大优点是简便,轻量级,仅需iBatis的一个jar和数据库的驱动即可运行,而且使用iBatis仅需掌握SQL和XML的用法即可,而不像Hibernate那样需要配置对象间的关系。学习iBatis的过程要比Hibernate快很多,在项目中,若人员水平不大一致时,使用iBatis代替Hibernate作为数据访问工具可以有效提升开发效率。
    不管是iBatis还是Hibernate,都作为访问数据库的工具,它们必然基于JDBC而来,目的解决是JDBC程序开发的繁琐性和代码的冗余性(如加载驱动,建立连接,初始化语句对象,执行数据库操作,返回结果,关闭各个对象这一重复且无技术含量的过程)。
    我们还是首先来看一个典型的JDBC示例,使用MySQL数据库,首先是建表。
create table users(
	ID INT(10) AUTO_INCREMENT PRIMARY KEY,
	USERNAME VARCHAR(10) NOT NULL,
	PASSWORD VARCHAR(32) NOT NULL,
	MOBILE VARCHAR(11) NOT NULL,
	EMAIL VARCHAR(40)
);


    创建表之后在数据库中创建一条记录。创建一个类模型,描述User对象。
package jdbc.model;
public class User implements java.io.Serializable {
	private Integer userId;
	private String userName;
	private String password;
	private String mobile;
	private String email;
//省略属性的getter和setter方法
	@Override
	public String toString() {
		return "User [email=" + email + ", mobile=" + mobile + ", password="
				+ password + ", userId=" + userId + ", userName=" + userName
				+ "]";
	}
}

    要访问数据库,首先做些基础准备。写一个简单的数据库访问工具类,配置信息从属性文件中读取,比较方便。
package jdbc.util;
import java.sql.*;
import java.util.ResourceBundle;
public class DBUtil {
	private static Connection conn = null;
	private static Statement stmt;
	private static PreparedStatement pstmt = null;
	private static String url = "", driver = "", userName = "", password = "";
	static {
		ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
		url = bundle.getString("jdbc.url");
		driver = bundle.getString("jdbc.driverClassName");
		userName = bundle.getString("jdbc.username");
		password = bundle.getString("jdbc.password");
	}
	public DBUtil() {
	}
	public static Connection getConnection() {
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, userName, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
}

    最后是一个Demo测试类。
package jdbc;
import java.sql.*;
import jdbc.model.User;
import jdbc.util.DBUtil;
public class JDBCDemo {
	public static User getUser(int id) throws SQLException {
		User user = null;
		String sql = "select * from users where ID=?";
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = DBUtil.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, id);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				user = new User();
				user.setUserId(rs.getInt("ID"));
				user.setUserName(rs.getString("USERNAME"));
				user.setPassword(rs.getString("PASSWORD"));
				user.setMobile(rs.getString("MOBILE"));
				user.setEmail(rs.getString("EMAIL"));
			}
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
			} finally {
				try {
					if (pstmt != null) {
						pstmt.close();
					}
				} finally {
					if (conn != null) {
						conn.close();
					}
				}
			}
		}
		return user;
	}
	public static void main(String[] args) throws Exception {
		System.out.println(getUser(1));
	}
}

    这是一个最朴素的JDBC应用程序,所有操作必须人为显式完成,如有遗漏可能就会对程序造成影响,比如连接不释放,数据更新操作时使用事务。不可否认的是,JDBC直接操作数据库的效率是最高的,一旦使用了持久层的框架,会在效率上造成一定影响。这点要权衡利弊,做出决定。
    下面我们进入iBatis的配置。使用iBatis首先要获取开发包,现在iBatis版本分为2和3,二者在使用上稍有差别,这里我们使用2的版本进行说明。首先看下项目结构。

    数据库的配置信息还是使用jdbc.properties文件即可,统一管理。
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123

    iBatis的配置文件是SqlMapConfig.xml,这里面需要声明数据库连接的属性信息,数据源配置信息,映射文件等信息。先看个例子,其中属性含义先不必深究,当然也可以去google。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
	<properties resource="jdbc.properties" />
	<transactionManager type="JDBC">
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="${jdbc.driverClassName}" />
			<property name="JDBC.ConnectionURL" value="${jdbc.url}" />
			<property name="JDBC.Username" value="${jdbc.username}" />
			<property name="JDBC.Password" value="${jdbc.password}" />
		</dataSource>
	</transactionManager>
	<sqlMap resource="ibatis/resources/User.xml" />
</sqlMapConfig>

    配置好iBatis后,我们就要进行数据库操作了,当然iBatis本身的SQL语句也是写在映射文件中的,那么就要看User.xml了。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
	<typeAlias alias="User" type="ibatis.model.User" />
	<select id="getAllUsers" resultClass="User">
		select *
		from users
	</select>
</sqlMap>

    typeAlias标签是设置别名用的,这里我们使用了一个Bean叫做User,声明别名后,在文件的后续部分可以直接使用别名而不用再给出完整类型了,非常方便,如select标签中的resultClass属性。
    这个配置我们使用的是Bean作为返回的结果类型,当然也可以使用Map,非常灵活。Select的id是标识该SQL语句的标识符,要在应用程序中使用到,必须唯一。Select标签体内的部分就是SQL语句了,当然这里是最简单的示例。
    最后就是应用程序,写法也很简单。首先是加载iBatis的配置文件,然后使用SqlMapClient接口提供的方法进行数据操作。
package ibatis;
import ibatis.model.User;
import java.io.*;
import java.sql.SQLException;
import java.util.List;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.*;
public class IBatisDemo {
	public static void main(String[] args) throws IOException, SQLException {
		String config = "ibatis/SqlMapConfig.xml";
		Reader reader = Resources.getResourceAsReader(config);
		SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
		List<User> list = sqlMap.queryForList("getAllUsers");
		for (User user : list) {
			System.out.println(user);
		}
	}
}

    至此,一个简单的iBatis应用就写完了,相比于Hibernate,我们对SQL有完全的主动权,对SQL的管理也高度统一,并且配置非常简单。
    欢迎交流,希望对学习者有用。
  • 大小: 47.7 KB
  • 大小: 16.9 KB
15
0
分享到:
评论
6 楼 Ennissuper 2015-02-08  
您好:请问 
String config = "SqlMapConfig.xml"; 
        Reader reader = Resources.getResourceAsReader(config);


这个 SqlMapConfig,xml的路径应该怎么写 ?我报错 错误为
Could not find resource SqlMapConfig.xml
at com.ibatis.common.resources.Resources.getResourceAsStream(Resources.java:110)
at com.ibatis.common.resources.Resources.getResourceAsStream(Resources.java:95)
at com.ibatis.common.resources.Resources.getResourceAsReader(Resources.java:161)
at com.mdbp.urlMatcher.persisit.CommodityMessageService.main(CommodityMessageService.java:17)
at com.mdbp.urlMatcher.matcher.UrlMatcherRun.main(UrlMatcherRun.java:101)
5 楼 yangphere 2012-09-14  
zmj0924 写道
您好,我按照您上面的步骤做了个案例,设计表结构的时候主键是自增长的
用JDBC的方式获取的时候,打印的结果如下:
User [userId=1, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]

换成ibatis后,打印的结果如下:
User [userId=null, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
User [userId=null, userName=李四, password=123456, mobile=15162345897, email=lisi@sina.com]


userId获取不到值了, 求解


User.xml需要修改
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap        
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"        
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
	<typeAlias alias="User" type="cn.yangphere.ibatisdemo.model.User"/>
	<select id="getAllUsers" resultClass="User">
		select id as userId, userName as username, password, mobile, email
		from users
	</select>
</sqlMap>
4 楼 sarin 2012-09-10  
zmj0924 写道
您好,我按照您上面的步骤做了个案例,设计表结构的时候主键是自增长的
用JDBC的方式获取的时候,打印的结果如下:
User [userId=1, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]

换成ibatis后,打印的结果如下:
User [userId=null, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
User [userId=null, userName=李四, password=123456, mobile=15162345897, email=lisi@sina.com]


userId获取不到值了, 求解

请为该字段添加get和set方法,在SQL中要查询该字段,做映射时要准确匹配到实体bean上
3 楼 zmj0924 2012-09-10  
您好,我按照您上面的步骤做了个案例,设计表结构的时候主键是自增长的
用JDBC的方式获取的时候,打印的结果如下:
User [userId=1, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]

换成ibatis后,打印的结果如下:
User [userId=null, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
User [userId=null, userName=李四, password=123456, mobile=15162345897, email=lisi@sina.com]


userId获取不到值了, 求解
2 楼 sarin 2012-09-04  
zhangpeili 写道
现在都用mybatis了

呵呵,只看原理,不追版本号
1 楼 zhangpeili 2012-09-04  
现在都用mybatis了

相关推荐

Global site tag (gtag.js) - Google Analytics