#
本文只介紹幾個常用的快捷鍵
Ctrl+Space // Complete Code, 與輸入法沖突, 改為Alt+S
Ctrl+D // 行復制, 或選定字符串復制
Ctrl+Shift+N // 打開文件
Ctrl+J // 插入代碼模板
Alt+Insert // Generate, 生成Constructor, setter, getter
Ctrl+O // 覆蓋方法
Ctrl+I // 實現方法
Ctrl+Alt+T // Surround With
Ctrl+/ // 行注釋
Ctrl+Alt+L // 格式化代碼
Alt+F7 // 查找使用情況
Shift+F6 // 重命名
F6 // 移動
Ctrl+Shift+F7 // 顯示字符串使用次數
Alt+Delete // 安全刪除
映射文件是的生成方式
在HB2.1.x時代, 使用的是middlegen生成hbm, 再通過hbm2java生成pojo
<middlegen appname="${name}" prefsdir="${build.gen-src.dir}" gui="${gui}" databaseurl="${database.url}" initialContextFactory="${java.naming.factory.initial}" providerURL="${java.naming.provider.url}" datasourceJNDIName="${datasource.jndi.name}" driver="${database.driver}" username="${database.userid}" password="${database.password}">
<hibernate destination="${build.gen-src.dir}" package="${name}.hibernate" genXDocletTags="false" genIntergratedCompositeKeys="false" javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"/></middlegen>
<target name="codegen" depends="middlegen"> <taskdef name="hbm2java" classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask" classpathref="project.classpath"/> <hbm2java output="${build.classes.dir}" classpathref="project.classpath" config="${src.dir}/config.xml"> <fileset dir="${build.gen-src.dir}/maintain/hibernate"> <include name="**/*.hbm.xml"/> </fileset> </hbm2java></target>
<!-- config.xml -->
<codegen> <generate renderer="net.sf.hibernate.tool.hbm2java.BasicRenderer"/></codegen>

到HB3.0.x時代, hbm的定義更靈活, middlegen已不更新, 使用idea手寫hbm, pojo(這時已比較熟悉)
下一階段, 使用Hibernate Annotations(處于Beta狀態)
說明:
只介紹ddl --> hbm --> pojo方式
很多hibernate tools是基于eclipse的, 所以沒用
Spring+Hibernate中, 集合映射如果使用lazy="true", 當PO傳到View層時, 出現未初始化session已關閉的錯誤,只能在dao先初始化
parent.getChilds().size();
Spring提供Open Session In View來解決這個問題, 有兩種方式
1. Interceptor
<!-- =========== OpenSession In View pattern ==============-->
<bean id="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors" ref="openSessionInViewInterceptor"/>
<property name="mappings">
<props>
......
</props>
</property>
</bean>
2. Filter
<web-app>
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>
說明: 個人更喜歡用Interceptor方式, filter是在web.xml中定義
有了OpenSessionInView,并不是一切就ok了。簡單的crud可以,但對于復雜業務邏輯就要想點法子。
OSIV默認是request per session的, 所以即使沒有顯式update(po),Hibernate也會幫你保存的,dao的業務判斷就無效,還好有evict()可用。
update code
// Controller
public ModelAndView update() {
p = dao.getVo(id);
bindObject(request);
dao.update(p);
}
// Dao
public Object getVo(id) {
p = getHibernateTemplate().get(clazz, id);
p.getChilds().size();
getHibernateTemplate().evict(p);
return p;
}
public void update(p) {
oldP = getVo(id);
// ++--(oldP);
getHibernateTemplate().update(p);
// ++--(p);
}
idea 5.0還是有些小bug的, 使用起來有點不爽, 5.0.1估計有不少bug fix
下載中,
http://download.jetbrains.com/idea/idea-5.0.1.exe官方的bug fix
IntelliJ IDEA 5.0.1
1. New annotation @NonNls for marking fields, etc. not presented in the UI & not needing localization.
2. The Hard coded string literals inspection/quick fix now available in UI Designer forms.
摘要: Groovy is an agile dynamic language for the Java 2 Platform that has many of the features that people like so much in languages like Python, Ruby and Smalltalk, making them available to Java developer...
閱讀全文
純JDBC操作, 對某些項目來說, 也許更好, Spring JDBC Framework讓你不用關心Connection, Statement, ResultSet.
定義數據源
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:/comp/env/jdbc/oracle</value>
</property>
</bean> 定義事務管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
定義dao
<bean id="customerDAO" class="com.waterye.dao.impl.CustomerDAOImpl">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
</bean> demo
public class CustomerDaoImpl extends JdbcDaoSupport implements CustomerDAO {
private DataSource dataSource;
pirvate TransactionManager transactionManager;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void setTransactionManager(DataSourceTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public Map get(Integer id) throws Exception {
String querySql = "select * from customer where id = ?";
return getJdbcTemplate().queryForMap(querySql, new Object[] { id });
}
public void insert(final Map customer) throws Exception {
String seqSql = "select customer_seql.nextval from dual";
String insertSql = "insert into customer (id, code, name, status) values (?, ?, ?, ?)";
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
JdbcTemplate jdbcTemplate = getJdbcTemplate();
int id = jdbcTemplate.queryForInt(seqSql);
Object[] params = new Object[] { new Integer(id), customer.get("code"), customer.get("name"), map.get("status") };
jdbcTemplate.update(insertSql, params);
}
}
}
public void update(final Map customer) throws Exception {
//
}
public void delete(Integer id) throws Exception {
String deleteSql = "delete from customer where id = ?";
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
getJdbcTemplate().update(deleteSql, new Object[] { id });
}
}
}
public List findValidCustomers() throws Exception {
String querySql = "select * from customer where status = 'valid' order by code";
return getJdbcTemplate().query(querySql, new OracleColumnMapRowMapper());
}
}
說明:
1. 沒有使用聲明性事務, 使用編程式事務
2. 沒有使用POJO模式,使用HashMap, (
ActiveMapper還在sandbax狀態)
3. OracleColumnMapRowMapper implements RowMapper, 實現oracle風格到java bean風格mapping
如: 字段customer_id 對應rowMap.get("customerId");