iBatis开发环境搭建和第一个程序
程序员文章站
2022-03-02 16:36:43
...
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数据库,首先是建表。
创建表之后在数据库中创建一条记录。创建一个类模型,描述User对象。
要访问数据库,首先做些基础准备。写一个简单的数据库访问工具类,配置信息从属性文件中读取,比较方便。
最后是一个Demo测试类。
这是一个最朴素的JDBC应用程序,所有操作必须人为显式完成,如有遗漏可能就会对程序造成影响,比如连接不释放,数据更新操作时使用事务。不可否认的是,JDBC直接操作数据库的效率是最高的,一旦使用了持久层的框架,会在效率上造成一定影响。这点要权衡利弊,做出决定。
下面我们进入iBatis的配置。使用iBatis首先要获取开发包,现在iBatis版本分为2和3,二者在使用上稍有差别,这里我们使用2的版本进行说明。首先看下项目结构。
数据库的配置信息还是使用jdbc.properties文件即可,统一管理。
iBatis的配置文件是SqlMapConfig.xml,这里面需要声明数据库连接的属性信息,数据源配置信息,映射文件等信息。先看个例子,其中属性含义先不必深究,当然也可以去google。
配置好iBatis后,我们就要进行数据库操作了,当然iBatis本身的SQL语句也是写在映射文件中的,那么就要看User.xml了。
typeAlias标签是设置别名用的,这里我们使用了一个Bean叫做User,声明别名后,在文件的后续部分可以直接使用别名而不用再给出完整类型了,非常方便,如select标签中的resultClass属性。
这个配置我们使用的是Bean作为返回的结果类型,当然也可以使用Map,非常灵活。Select的id是标识该SQL语句的标识符,要在应用程序中使用到,必须唯一。Select标签体内的部分就是SQL语句了,当然这里是最简单的示例。
最后就是应用程序,写法也很简单。首先是加载iBatis的配置文件,然后使用SqlMapClient接口提供的方法进行数据操作。
至此,一个简单的iBatis应用就写完了,相比于Hibernate,我们对SQL有完全的主动权,对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的管理也高度统一,并且配置非常简单。
欢迎交流,希望对学习者有用。
上一篇: iBatis查询select详解
下一篇: 推荐一款Mybatis分页插件
推荐阅读
-
PyCharm搭建Spark开发环境实现第一个pyspark程序
-
PyCharm搭建Spark开发环境实现第一个pyspark程序
-
[Asp.Net Core] Blazor Server Side 开发教程 - 安装环境与运行第一个程序
-
JavaWeb从开发环境搭建,到第一个servlet程序(图文)
-
JDK的开发环境搭建及eclipse运行第一个程序 ( HelloWorld)
-
FFmpeg 开发环境搭建及第一个程序 Hello FFmpeg 编写
-
Java基础(Java环境配置、dos使用、开发第一个java程序)
-
Svelte学习笔记一: 环境搭建和第一个Svelte程序
-
iBatis开发环境搭建和第一个程序
-
【Autojs教程】01-Autojs简介、开发环境配置及第一个HelloWorld程序