- 浏览: 686025 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (297)
- J2SE (78)
- swt/飞信 (20)
- mysql/mssql (17)
- 设计模式 (5)
- windows (18)
- 闲言碎语 (19)
- struts 1.x (6)
- JVM (6)
- tomcat/jetty (8)
- jquery/javascript (15)
- web前端 (6)
- J2EE (0)
- PHP (6)
- 算法设计 (17)
- 数据结构 (3)
- C/C++ (6)
- linux (19)
- 程序打包 (8)
- eclipse/myeclipse (10)
- 其他杂项 (13)
- 应聘 (9)
- spring/spring mvc (4)
- Maven/Ant (2)
- ERROR (1)
- nosql/hbase (1)
- hibernate (3)
- Solr/Lucene (1)
最新评论
-
乔木1937:
太感谢了,看到你的文章终于解决这个问题了!
[转载]通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。 -
xianweisi:
竟然还有马
精简JRE - 实例Swing计算器 with 精简JRE(续) -
Javkburd:
我刚也遇到这个问题,然后也把默认端口改成了1433,只差最后没 ...
[转载]通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。 -
yeshaoting:
kingbinchow 写道 最近的爪哇岛 没有什么货进项呀 ...
jQuery方法区别(四)click() bind() live() delegate()区别 -
kingbinchow:
最近的爪哇岛 没有什么货进项呀!
jQuery方法区别(四)click() bind() live() delegate()区别
9.
集成第三方ORM框架 -
iBatis
总体来说 iBATIS 的系统结构还是比较简单的,它主要完成两件事情:
<!--[if !supportLists]-->_ <!--[endif]-->根据 JDBC 规范建立与数据库的连接;
<!--[if !supportLists]-->_ <!--[endif]-->通过反射打通 Java 对象与数据库参数交互之间相互转化关系。
以下内容摘自: 百度百科
词条:iBatis
一站式
iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例。
相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis 是一种“半自动化”的ORM实现。
纵观目前主流
所谓“半自动”,可能理解上有点生涩。纵观目前主流的 ORM,无论 Hibernate 还是Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO 到数据库表的全套映射机制。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过 Hibernate或者OJB 提供的方法完成持久层操作。程序员甚至不需要对 SQL 的熟练掌握,Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的 SQL 并调用 JDBC 接口加以执行。
新系统的开发
大多数情况下(特别是对新项目,新系统的开发而言),这样的机制无往不利,大有一统天下的势头。但是,在一些特定的环境下,这种一站式的解决方案却未必灵光。
在笔者的系统咨询工作过程中,常常遇到以下情况:
1. 系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开。
2. 开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由存储过程实现(就笔者工作所面向的金融行业而言,工商银行、中国银行、交通银行,都在开发规范中严格指定)
3. 系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。
面对这样的需求,再次举起 Hibernate 大刀,却发现刀锋不再锐利,甚至无法使用,奈何?恍惚之际,只好再摸出JDBC 准备拼死一搏……,说得未免有些凄凉,直接使用 JDBC进行数据库操作实际上也是不错的选择,只是拖沓的数据库访问代码,乏味的字段读取操作令人厌烦。
半自动化
刚好解决上述问题
“半自动化”的ibatis,却刚好解决了这个问题。
这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”
ORM 实现而言,“全自动”ORM 实现了 POJO 和数据库表之间的映射,以及 SQL 的自动
生成和执行。而ibatis 的着力点,则在于POJO 与 SQL之间的映射关系。也就是说,ibatis
并不会为程序员在运行期自动生成 SQL 执行。具体的 SQL 需要程序员编写,然后通过映
射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO。
全自动
使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的 Java对象,
这一层与通过 Hibernate 实现 ORM 而言基本一致,而对于具体的数据操作,Hibernate
会自动生成SQL 语句,而ibatis 则要求开发者编写具体的 SQL 语句。相对Hibernate等
“全自动”ORM机制而言,ibatis 以 SQL开发的工作量和数据库移植性上的让步,为系统
设计提供了更大的自由空间。作为“全自动”ORM实现的一种有益补充,ibatis 的出现显
得别具意义。
一般步骤:
9.1 全局配置文件
该全局配置文件用来配置数据库连接,数据库事务,定义SQL映射配置文件
说明:
a) <properties>标签定义全局配置属性文件(.properties),只能出现0次或1次
用于填充com.ibatis.sqlmap.engine.builder.xml.XmlParseState类globalProps属性
另外,这个全局.properties可以动态配置.
在后面说到的数据库操作时,通过com.ibatis.sqlmap.client.SqlMapClientBuilder类中静态方法buildSqlMapClient(InputStream,Properties)和buildSqlMapClient(Reader,Properties)获取com.ibatis.sqlmap.client.SqlMapClient对象时动态配置.如此,可以动态使用数据源,动态更改成不同的数据库连接等等.
如:jdbc.properties设置了一些数据库连接的参数,其中键(e.g. driverClassName)可以通过如${driverClassName}在sql-map-config.xml文件中使用.
b) <sqlMap>标签用来配置SQL映射文件.e.g sql-map-user.xml是SQL映射文件
c) <properties>标签、<sqlMap>标签的resource属性是相对于classpath路径.所以,以 / 开头是错误的.这二个标签还有一个url属性,可以配置绝对路径.
d) <transactionManager>标签用于定义数据库事务.type属性定义数据库事务类型,有三个选项: JDBC,JTA,EXTERNAL
e) <dataSource>标签用来定义数据库连接的一些属性.事务类型为JDBC时,type属性定义数据库数据源
用户可以使用ibatis内置的三类数据源:
SIMPLE
将<dataSource>标签内定义的数据源参数包装成一个Map对象,通过SimpleDataSourceFactory类initialize()方法传入到com.ibatis.common.jdbc.SimpleDataSource,初始化SimpleDataSource数据源属性.
相关类 com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory
/**
* DataSourceFactory implementation for the iBATIS SimpleDataSource
*/
public class SimpleDataSourceFactory implements DataSourceFactory {
private DataSource dataSource;
public void initialize(Map map) {
dataSource = new SimpleDataSource(map);
}
public DataSource getDataSource() {
return dataSource;
}
}
相关类 com.ibatis.common.jdbc.SimpleDataSource
/**
* This is a simple, synchronous, thread-safe database connection pool.
* <p/>
* REQUIRED PROPERTIES
* -------------------
* JDBC.Driver
* JDBC.ConnectionURL
* JDBC.Username
* JDBC.Password
* <p/>
* Pool.MaximumActiveConnections
* Pool.MaximumIdleConnections
* Pool.MaximumCheckoutTime
* Pool.TimeToWait
* Pool.PingQuery
* Pool.PingEnabled
* Pool.PingConnectionsOlderThan
* Pool.PingConnectionsNotUsedFor
* Pool.QuietMode
*/
private void initialize(Map props) {
...
if (!(props.containsKey(PROP_JDBC_DRIVER)
&& props.containsKey(PROP_JDBC_URL)
&& props.containsKey(PROP_JDBC_USERNAME)
&& props.containsKey(PROP_JDBC_PASSWORD))) {
throw new RuntimeException("SimpleDataSource: Some properties were not set.");
} else {
jdbcDriver = (String) props.get(PROP_JDBC_DRIVER);
jdbcUrl = (String) props.get(PROP_JDBC_URL);
jdbcUsername = (String) props.get(PROP_JDBC_USERNAME);
jdbcPassword = (String) props.get(PROP_JDBC_PASSWORD);
poolMaximumActiveConnections =
props.containsKey(PROP_POOL_MAX_ACTIVE_CONN)
? Integer.parseInt((String) props.get(PROP_POOL_MAX_ACTIVE_CONN))
: 10;
poolMaximumIdleConnections =
props.containsKey(PROP_POOL_MAX_IDLE_CONN)
? Integer.parseInt((String) props.get(PROP_POOL_MAX_IDLE_CONN))
: 5;
poolMaximumCheckoutTime =
props.containsKey(PROP_POOL_MAX_CHECKOUT_TIME)
? Integer.parseInt((String) props.get(PROP_POOL_MAX_CHECKOUT_TIME))
: 20000;
poolTimeToWait =
props.containsKey(PROP_POOL_TIME_TO_WAIT)
? Integer.parseInt((String) props.get(PROP_POOL_TIME_TO_WAIT))
: 20000;
poolPingEnabled =
props.containsKey(PROP_POOL_PING_ENABLED)
&& Boolean.valueOf((String) props.get(PROP_POOL_PING_ENABLED)).booleanValue();
prop_pool_ping_query = (String) props.get(PROP_POOL_PING_QUERY);
poolPingQuery =
props.containsKey(PROP_POOL_PING_QUERY)
? prop_pool_ping_query
: "NO PING QUERY SET";
poolPingConnectionsOlderThan =
props.containsKey(PROP_POOL_PING_CONN_OLDER_THAN)
? Integer.parseInt((String) props.get(PROP_POOL_PING_CONN_OLDER_THAN))
: 0;
poolPingConnectionsNotUsedFor =
props.containsKey(PROP_POOL_PING_CONN_NOT_USED_FOR)
? Integer.parseInt((String) props.get(PROP_POOL_PING_CONN_NOT_USED_FOR))
: 0;
jdbcDefaultAutoCommit =
props.containsKey(PROP_JDBC_DEFAULT_AUTOCOMMIT)
&& Boolean.valueOf((String) props.get(PROP_JDBC_DEFAULT_AUTOCOMMIT)).booleanValue();
...
}
DBCP
相关类 com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory
/**
* DataSourceFactory implementation for DBCP
*/
public class DbcpDataSourceFactory implements DataSourceFactory {
private DataSource dataSource;
public void initialize(Map map) {
DbcpConfiguration dbcp = new DbcpConfiguration(map);
dataSource = dbcp.getDataSource();
}
public DataSource getDataSource() {
return dataSource;
}
}
相关类 com.ibatis.common.jdbc.DbcpConfigurationDataSource
/* REQUIRED PROPERTIES
* -------------------
* JDBC.Driver
* JDBC.ConnectionURL
* JDBC.Username
* JDBC.Password
* <p/>
* Pool.ValidationQuery
* Pool.MaximumActiveConnections
* Pool.MaximumIdleConnections
* Pool.MaximumWait
*/
private BasicDataSource legacyDbcpConfiguration(Map map) {
BasicDataSource basicDataSource = null;
if (map.containsKey("JDBC.Driver")) {
basicDataSource = new BasicDataSource();
String driver = (String) map.get("JDBC.Driver");
String url = (String) map.get("JDBC.ConnectionURL");
String username = (String) map.get("JDBC.Username");
String password = (String) map.get("JDBC.Password");
String validationQuery = (String) map.get("Pool.ValidationQuery");
String maxActive = (String) map.get("Pool.MaximumActiveConnections");
String maxIdle = (String) map.get("Pool.MaximumIdleConnections");
String maxWait = (String) map.get("Pool.MaximumWait");
basicDataSource.setUrl(url);
basicDataSource.setDriverClassName(driver);
basicDataSource.setUsername(username);
basicDataSource.setPassword(password);
...
}
JNDI
/* REQUIRED PROPERTIES
* -------------------
* DataSource
* or
* DBJndiContext
* or
* DBFullJndiContext
* or
* DBInitialContext and DBLookup
*/
相关类 com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory
/**
* DataSourceFactory implementation for JNDI
*/
public class JndiDataSourceFactory implements DataSourceFactory {
public void initialize(Map properties) {
...
if (properties.containsKey("DataSource")) {
dataSource = (DataSource) initCtx.lookup((String) properties.get("DataSource"));
} else if (properties.containsKey("DBJndiContext")) { // LEGACY --Backward compatibility
dataSource = (DataSource) initCtx.lookup((String) properties.get("DBJndiContext"));
} else if (properties.containsKey("DBFullJndiContext")) { // LEGACY --Backward compatibility
dataSource = (DataSource) initCtx.lookup((String) properties.get("DBFullJndiContext"));
} else if (properties.containsKey("DBInitialContext")
&& properties.containsKey("DBLookup")) { // LEGACY --Backward compatibility
Context ctx = (Context) initCtx.lookup((String) properties.get("DBInitialContext"));
dataSource = (DataSource) ctx.lookup((String) properties.get("DBLookup"));
}
...
}
}
sql-map-config.xml数据库事务片段:
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/mydb"/>
</dataSource>
</transactionManager>
java:comp/env/jdbc/mydb是通过JNDI方式获取数据源
简述:建立一个context.xml文件放置在WebRoot/META-INF目录下,详见 7.1 配置JNDI数据源.
sql-map-config.xml
<?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="com/iteye/jarg/resources/jdbc.properties" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driverClassName}" />
<property name="JDBC.ConnectionURL" value="${url}" />
<property name="JDBC.Username" value="${username}" />
<property name="JDBC.Password" value="${password}" />
<property name="Pool.MaximumActiveConnections" value="${maxActive}" />
<property name="Pool.MaximumIdleConnections" value="${maxIdle}" />
<property name="Pool.TimeToWait" value="${maxWait}" />
</dataSource>
</transactionManager>
<sqlMap resource="com/iteye/jarg/resources/sql-map-user.xml" />
</sqlMapConfig>
9.2 SQL映射文件
该SQL映射文件用来配置数据库表字段与POJO对象的映射
sql-map-user.xml用于将数据库中User表字段映射到com.iteye.jarg.bean.User属性
说明:
<typeAlias>配置别名,将一长串,用一个别名代替
<resultMap>、<parameterMap>用来设置生成的结果集中每条记录的类型及包含的数据
<insert>、<delete>、<update>、<select>对应SQL的增删改查操作语句
<statement>可以用来代替增删改查的四个标签,也即其中的内容可以是任意的数据库增删改查操作
<procedure>对应数据库调用存储过程
注意:
a) 花括号是必须的
b) 通过call关键字来调用存储过程
c) 问号用来占位,代表一个输入输出参数
如:
<procedure id="swapEmailAddresses" parameterMap="swapParameters" >
{ call swap_email_address (?, ?) }
</procedure>
<insert>、<delete>、<update>、<select>、<statement>、<procedure>这些标签必不可少的是id属性,供数据库操作函数调用对应的SQL语句,也是区别于其他的标签SQL内容的依据.该id属性必须是在全局配置文件(e.g. sql-map-config.xml)中定义的所有SQL映射文件(e.g. sql-map-user.xml)中独一无二的,即:所有SQL映射文件中的所有id属性不可出现重复情况.
另外,常用的属性有
设置传入参数类型 parameterClass,parameterMap
设置传出参数类型 resultClass,resultMap
设置调整缓存类型 cacheModel
parameterClass,resultClass用于指定已经存在的数据对象类型
parameterMap,resultMap用于指定自定义的数据对象类型
如:
<resultMap class="User" id="UserMap">
<result property="id" column="id" />
<result property="username" column="username" />
<result property="password" column="password" />
</resultMap>
<cacheModel>标签
用于设置数据库预编译SQL语句,缓存SQL语句的缓存模式
A cacheModel is used to describe a cache for use with a query mapped statement. Each query mapped statement can use a different cacheModel, or the same one.
如:
<cacheModel id="product-cache" type="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”size” value=”1000” />
</cacheModel>
sql-map-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="com.iteye.jarg.bean.User" />
<resultMap class="User" id="UserMap">
<result property="id" column="id" />
<result property="username" column="username" />
<result property="password" column="password" />
</resultMap>
<select id="user.queryUserById" parameterClass="java.lang.Integer" resultMap="UserMap">
select *
from user
where id = #id#
</select>
<select id="user.queryUser" parameterClass="User" resultMap="UserMap">
select *
from user
where username=#username# and password=#password#
</select>
<select id="user.queryUsersById" parameterClass="java.lang.Integer" resultMap="UserMap">
select *
from user
where id != #id#
</select>
<select id="user.queryAllUser" resultMap="UserMap">
select *
from user
</select>
</sqlMap>
9.3 数据库操作
9.3.1 获取com.ibatis.sqlmap.client.SqlMapClient对象
摘自com.ibatis.sqlmap.client.SqlMapClientBuilder类描述:
Builds SqlMapClient instances from a supplied resource (e.g. XML configuration file)
The SqlMapClientBuilder class is responsible for parsing configuration documents and building the SqlMapClient instance. Its current implementation works with XML configuration files (e.g. sql-map-config.xml).
Example:
Reader reader = Resources.getResourceAsReader("properties/sql-map-config.xml");
SqlMapClient client = SqlMapClientBuilder.buildSqlMapClient (reader);
通过com.ibatis.sqlmap.client.SqlMapClientBuilder类中静态方法
public static SqlMapClient buildSqlMapClient(Reader reader)
public static SqlMapClient buildSqlMapClient(Reader reader, Properties props)
public static SqlMapClient buildSqlMapClient(InputStream inputStream)
public static SqlMapClient buildSqlMapClient(InputStream inputStream, Properties props)
获取com.ibatis.sqlmap.client.SqlMapClient对象
9.3.2 利用com.ibatis.sqlmap.client.SqlMapClient接口中内置的数据库操作方法完成数据库操作
com.ibatis.sqlmap.client.SqlMapClient是一个接口,继承了SqlMapExecutor,SqlMapTransactionManager接口.
public interface SqlMapClient extends SqlMapExecutor, SqlMapTransactionManager
SqlMapExecutor接口中定义了所有数据库操作的方法(This interface declares all methods involved with executing statements and batches for an SQL Map.)
e.g. queryForList(),queryForObject(),querForMap()
queryForList可以用来获取包含多条记录的结果集
queryForObject可以用来获取包含0条或1条记录的结果集
以上二种方式最多可以包含三个参数,最少一个参数.
id对应于SQL映射文件(e.g. sql-map-user.xml)中包含数据库操作SQL语句的标签编号,是必不可少的.
parameterObject指定SQL语句参数
resultObject指定需要的结果数据(当结果集中包含数据所需要的数据量时,可以通过这个参数过滤掉一些不需要的结果数据)
Parameters:
id: The name of the statement to execute.
parameterObject: The parameter object (e.g. JavaBean, Map, XML etc.).
resultObject: The result object instance that should be populated with result data.
Map queryForMap(String id, Object parameterObject, String keyProp) throws SQLException;
用来获取结果集中键为keyProp的结果
Map queryForMap(String id, Object parameterObject, String keyProp, String valueProp) throws SQLException;
用来获取结果集中键为keyProp,值为valueProp的结果
SqlMapTransactionManager接口中定义了数据库事务操作的方法(This interface declares methods for demarcating SQL Map transactions.)
e.g. startTransaction(),commintTransaction(),endTransaction()
默认情况,当完成一次数据库操作(select,insert,update,delete)时,数据库事务总是自动提交,即使使用了startTransaction(),commitTransaction(),endTransaction().
在全局配置文件(e.g. sql-map-config.xml)中,<transactionManager>标签的commitRequired属性设置为true时,通过commitTransaction()来手动提交数据库事务.
这种方式的优点:
a) 一次执行多条数据库操作,出错时可以回滚,将数据库还原到出错前.
b) 一次提交效率高,节省多次提交的多次数据库建立,连接资源
摘自com.ibatis.sqlmap.client.SqlMapClient类描述:
A thread safe client for working with your SQL Maps (Start Here). This interface inherits transaction control and execution methods from the SqlMapTransactionManager and SqlMapExecutor interfaces.
The SqlMapClient is the central class for working with SQL Maps. This class will allow you to run mapped statements (select, insert, update, delete etc.), and also demarcate transactions and work with batches. Once you have an SqlMapClient instance, everything you need to work with SQL Maps is easily available.
The SqlMapClient can either be worked with directly as a multi-threaded client (internal session management), or you can get a single threaded session and work with that. There may be a slight performance increase if you explicitly get a session (using the openSession() method), as it saves the SqlMapClient from having to manage threads contexts. But for most cases it won't make much of a difference, so choose whichever paradigm suits your needs or preferences.
An SqlMapClient instance can be safely made static or applied as a Singleton. Generally it's a good idea to make a simple configuration class that will configure the instance (using SqlMapClientBuilder) and provide access to it.
9.3.3 数据库操作示例
a)读取数据全局配置文件
b) 获取数据库操作句柄
c) 查询操作并返回结果
String filePath = "com/iteye/jarg/resources/sql-map-config.xml";
InputStream inputStream = IbatisDbUtil.class.getClassLoader().getResourceAsStream(filePath);
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(inputStream);
int id = 2;
User user = (User)sqlMapper.queryForObject("user.queryUserById", id);
System.out.println("id:\t\t" + user.getId());
System.out.println("username:\t" + user.getUsername());
System.out.println("password:\t" + user.getPassword());
发表评论
-
Java - Convert String to enum
2012-11-17 22:03 1912http://stackoverflow.com/que ... -
[ERROR]Premature end of file
2012-09-28 11:41 3350[ERROR]Premature end of file ... -
测试java.util.Map.Entry
2012-07-18 16:13 1021/** * Copyright (c) 201 ... -
关于eclipse启动出错问题的解决办法
2012-06-09 09:31 1485转自:http://blog.csdn.net/jkpt ... -
Myeclipse中把java代码导成UML类图
2012-05-18 14:53 2371MyEclipse 中选择window,在 Open ... -
[转载]java synchronized详解
2012-05-15 17:18 869http://www.cnblogs.com ... -
[转载]Java 根据 HashMap 的 value 进行排序
2012-05-08 09:58 953转载:http://www.oschina.net/co ... -
JAVA实时屏幕监控
2012-04-29 16:13 3324JAVA实时屏幕监控 说明: 本程序会运 ... -
[JAVA实时屏幕监控]JAVA使用Internet代理设置
2012-04-29 14:50 1387JAVA使用Internet代理设置 描述:首先 ... -
[JAVA实时屏幕监控]JAVA通过注册表获取Internet代理设置
2012-04-29 14:47 2338JAVA通过注册表获取Internet代理设置 ... -
[JAVA实时屏幕监控]JAVA发送邮件
2012-04-29 14:28 2507JAVA发送邮件 描述:利用commons-em ... -
[JAVA实时屏幕监控]JAVA屏幕截图
2012-04-29 14:19 1318JAVA屏幕截图 /** * 产生截图 ... -
[JAVA实时屏幕监控]Java使用代理服务器
2012-04-24 13:36 2491/** * Copyright (c) 2012 T ... -
java.util.ConcurrentModificationException解决办法
2012-04-23 10:47 1583java.util.ConcurrentModi ... -
[转载]java.util.ConcurrentModificationException
2012-04-23 09:20 976java.util.ConcurrentModif ... -
整数转换成字节型数组
2012-04-22 13:16 6017整数转换成字节型数组 描述: 整数(in ... -
java.lang.NoClassDefFoundError: javax/mail/Message解决方法
2012-04-18 10:33 1269缺少activation.jar 和 mail.jar ... -
设置javax.swing.JFrame窗口外观
2012-03-29 15:34 0设置javax.swing.JFrame窗口外 ... -
设置javax.swing.JFrame窗口外观
2012-03-29 15:34 0设置javax.swing.JFrame窗口 ... -
Java图形界面外观包substance.jar
2012-03-29 15:33 0一直以来都认为用Swing做出来的程序 ...
相关推荐
Java自定义的类似ORM的数据库操作框架是一种高效且灵活的数据访问解决方案,旨在简化数据库的交互过程,类似于流行的ORM(对象关系映射)框架,如Hibernate和MyBatis。ORM框架的核心理念是将数据库操作转化为面向...
在"demo"文件中,可能包含了一个简单的应用示例,展示如何集成并使用ORM框架。通常,这个示例会包括以下步骤: 1. **添加依赖**:在项目的build.gradle文件中引入ORM框架的库。 2. **定义数据模型**:创建一个继承...
Ibatis 是一个轻量级的Java持久层框架,它与Hibernate、JDO等ORM框架不同,更注重于SQL语句的灵活控制。Ibatis 提供了将Java对象(POJOs)映射为SQL语句的能力,允许开发者直接编写SQL,同时保留了对存储过程的支持...
在Spring框架中,数据库访问是核心功能之一,而ORM(对象关系映射)技术则是连接业务逻辑和数据存储的关键桥梁。本篇文章将深入探讨Spring如何实现ORM,主要以JPA(Java Persistence API)和Hibernate为例,同时也会...
虽然原生的IBATIS是为Java设计的,但C#也有类似的框架,如MyBatis.NET,它是.NET平台上的一个ORM框架,功能和使用方式与Java的IBATIS类似。MyBatis.NET同样提供SQL映射和对象关系映射功能,帮助开发人员更方便地操作...
ORM框架是Java开发中常用的一种技术,它允许开发者以面向对象的方式操作数据库,而无需直接编写SQL语句,极大地提高了开发效率和代码可维护性。 首先,ORM框架的核心思想是将数据库表与Java类进行映射,表中的每一...
Ujorm 它是一个高性能的开源Java ORM框架,尤其针对持久层的快速开发,在搜索查询的测试中,Ujorm的运行速度比其他竞争产品要快很多。 Ujorm在很多方面展开创新,在和Hibernate的比较中,Ujorm也拥有一些优势。...
ORM(Object-Relational Mapping,对象关系映射)框架是一种软件技术,用于将关系数据库的数据映射到对象上,使得开发者可以使用面向对象的方式来处理数据库操作,而无需直接编写SQL语句。ORM框架的主要目标是简化...
本项目"Android-ORM-benchmark"专注于对比和分析Android平台上的ORM框架性能,为开发者选择适合的ORM框架提供依据。 首先,我们需要了解什么是ORM。ORM是一种技术,它可以将关系型数据库的数据映射到对象上,反之...
在本篇讨论中,我们将深入探讨“基于Java的简易ORM框架实现”。ORM,全称Object-Relational Mapping,是将数据库中的数据与程序中的对象进行映射的技术,它简化了数据库操作,使得开发者可以像操作对象一样操作...
Mybatis和ORM(Object-Relational Mapping)是Java开发中两个重要的概念,它们在软件工程中扮演着数据访问层的角色,极大地简化了数据库操作。这个名为"jar包---Mybatis、ORM.rar"的压缩文件包含了学习这两个技术所...
在本项目中,我们主要探讨的是一个基于Python的酒店管理系统,该系统采用了现代Web开发框架FastAPI以及关系型数据库MySQL,并且利用了Tortoise-ORM进行数据操作。以下是关于这些关键技术点的详细说明。 首先,...
java原生jdbc的封装,目前阶段仅允许mysql驱动的接入,但是数据库连接池可以引入好多的了,比如alibaba的druid。 该orm允许面向实体类数据库操作,也可以自定义sql。 今后考虑加上代码的自动生成,考虑到不同项目...
Ibatis是一款轻量级的Java持久层框架,它与ORM(对象关系映射)框架Hibernate类似,但更注重SQL的灵活性。Ibatis的主要特点是将SQL语句直接写在配置文件中,使得开发人员能够更好地控制SQL的执行,避免了过度依赖...
9. **ORM框架**:Object-Relational Mapping(ORM)框架如Hibernate、MyBatis等简化了数据库操作,将Java对象与数据库记录对应,降低了数据库操作的复杂度。 10. **JPA和Spring Data JPA**:Java Persistence API...
总的来说,DM达梦数据库jdbc-jar包和方言jar包是Java开发者与DM达梦数据库进行交互的必备工具,它们简化了数据库操作,并提供了与ORM框架的兼容性,使得Java应用开发更为高效和便捷。正确理解和使用这些jar包,能够...
不用写任何代码,就可以对表完成增删改查;...支持MySQL、Oracle数据库,简单配置完成切换; 基于Spring Boot + Mybatis实现的通用增删改查服务API; 该模块提供了通用的数据库DDL操作接口和通用的业务数据表CRUD操作。
本文将详细介绍三种主流的Java数据库连接方法:JDBC(Java Database Connectivity)、JNDI(Java Naming and Directory Interface)以及ORM框架(如Hibernate、MyBatis)。 1. **JDBC连接** JDBC是Java语言访问...
Java ORM(对象关系映射)框架是用于在Java应用程序中管理数据库操作的一种技术,它允许开发者用面向对象的方式来处理数据库事务,而无需直接编写SQL语句。YDB(Yet Another Database)方言是针对特定数据库系统定制...
针对“Jamling-Android-ORM-6d1a873”这个文件名,可以推测这可能是这个ORM框架的一个特定版本或者分支,其中可能包含了源码、文档、示例或其他资源,供开发者学习和使用。如果想要深入了解和使用这个框架,可以解压...