1.Split
Public string[] split(string regex,int limit){
Return pattern.compile(regex).split(this,limit);
}
Regex是正規表達式, limit影響結果數組長度,大于0時,數組長度小于或等于limit,limit為非正時,數組長度為其可能的最大值,但是limit為0時,會告誡結尾的空字元串
String s=”ss,ss,,,,”
Limit為0時 {“ss”,”ss”}
Limit為負時{“ss”,”ss”,””,””,””,””}
2.hibernate和資料庫字段預設值
如果在資料表中設定了一個字段的預設值(比如說預設目前日期之類的),并且該字段又不允許為空。如果是用Eclipse中的反向工程對該資料生成的POJO類和hbm.xml映射檔案,這時應該要修改映射檔案中的兩個地方才能正常使用資料庫中的預設值。
一是将dynamic-insert設定為true
二是将對應字段的屬性設定not-null為false
比如:
<class name="com.yorker.netmarket.pojo.Custorder" table="tableName"
schema="dbo" catalog="databaseName" dynamic-insert="true" dynamic-update="true">
....
<property name="orderTime" type="java.util.Date">
<column name="orderTime" length="23" not-null="false" />
</property>
</class>
Hibernate允許我們在映射檔案裡控制insert和update語句的内容.比如在映射檔案中<property 元素中的update屬性設定成為false,那麼這個字段,将不被包括在基本的update語句中,修改的時候,将不包括這個字段了.insert同理.dynamic動态SQL語句的配置也是很常用的.下面介紹配置SQL語句的具體屬性:
1)<property>元素 insert屬性:設定為false,在insert語句中不包含這個字段,表示永遠不會被插入,預設true
2)<property>元素 update屬性:設定為false,在update語句中不包含這個字段,表示永遠不會被修改,預設true
3)<class>元素 mutable屬性:設定為false就是把所有的<property>元素的update屬性設定為了false,說明這個對象不會被更新,預設true
4)<property>元素 dynamic-insert屬性:設定為true,表示insert對象的時候,生成動态的insert語句,如果這個字段的值是null就不會加入到insert語句當中.預設false
5)<property>元素 dynamic-update屬性,設定為true,表示update對象的時候,生成動态的update語句,如果這個字段的值是null就不會被加入到update語句中,預設false
6)<class>元素 dynamic-insert屬性:設定為true,表示把所有的<property>元素的dynamic-insert屬性設定為true,預設false
7)<class>元素 dynamic-update屬性:設定為true,表示把所有的<property>元素的dynamic-update屬性設定為true,預設false
Hibernate生成動态SQL語句的消耗的系統資源(比如CPU,記憶體等)是很小的,是以不會影響到系統的性能,如果表中包含N多字段,建議把dynamic-update屬性和insert屬性設定為true,這樣在插入和修改資料的時候,語句中隻包括要插入或者修改的字段.可以節省SQL語句的執行時間,提高程式的運作效率.
3.hibernate SQL查詢
select u.filename From tmp_file u where u.status='1' and u.code = '" + code+ "'";
例如上面的sql,傳回結果隻有一條
List<String> list=session.createSQLQuery(sql).list();
String filename=list.get(0);
不能使用List<Object[]> list=session.createSQLQuery(sql).list();
否則會報java.lang.String cannot be cast to [Ljava.lang.Object;
4.Calendar
Calendar cal=Calendar.getInstance();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
try {
cal.setTime(format.parse(ddates[0]));
} catch (ParseException e) {
e.printStackTrace();
}
int s_month=cal.get(Calendar.MONTH)+1;
int s_maxDay=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
//ddates[0]月最大天數
4.根據表名擷取對應的實體名
如要擷取所有的表名及其實體名,方法如下:
SessionFactory factory = this.getHibernateTemplate()
.getSessionFactory();
Map metaMap = factory.getAllClassMetadata();
for (String key : (Set<String>) metaMap.keySet()) {
count ++;
AbstractEntityPersister classMetadata = (AbstractEntityPersister) metaMap
.get(key);
String tableName = classMetadata.getTableName().toLowerCase();
String className = classMetadata.getEntityMetamodel().getName();//實體名(含包路徑)
if (logger.isDebugEnabled()) {
logger.debug(tableName + " --> " + className);
}
System.out.println(className.substring(className.lastIndexOf(".")+1));//實體名
}
5.将查詢結果封裝成pojo
String sql = “select a.*,b.name from a,b where “;
List<Object[]> list=dao.createSQLQuery(sql).addEntity(實體.class).addScalar("name").list();
if(!CollectionUtils.isEmpty(list)){
for(int i=0;i<list.size();i++){
Object[] obj=list.get(i);
實體名 obj=(實體名)obj[0];
String name=(String)obj[1];
obj.setName(name);//可以将name設定成實體的一個非映射表字段的屬性後再set
}
}
6.程序
tskill 程序id //殺死程序
7.svn
//删除svn使用者的方法為删除C:\Users\tenovo\AppData\Roaming\Subversion\auth\svn.simple
2. 如果是用的JavaHL, 找到以下目錄并删除auth目錄.
C:"Documents and Settings"[YourUserName]"Application Data"Subversion"
3. 如果你用的SVNKit, 找到以下目錄并删除.keyring檔案.
[eclipse]"configuration"org.eclipse.core.runtime
8.myeclipse高亮顯示
在eclipse/myeclipse中如果不小心把變量的高亮顯示弄丢了。可真是件愁人的事,不過看到這你就不用愁了
windows-> preferences-> java-> Editor-> Mark Occurences
最上邊的大标題的複選框勾上,下面的就都可以高亮顯示了,Local variables是變量的高亮顯示
9.ArrayList、LinkedList、數組
1.ArrayList是實作了基于動态數組的資料結構,LinkedList基于連結清單的資料結構。
2.對于随機通路get和set,ArrayList優于LinkedList,因為ArrayList可以随機定位,而LinkedList要移動指針一步一步的移動到節點處。(參考數組與連結清單來思考)
3.對于新增和删除操作add和remove,LinedList比較占優勢,隻需要對指針進行修改即可,而ArrayList要移動資料來填補被删除的對象的空間。
ArrayList類與數組用法上的差別
1、數組的容量是固定的(雖然也可以擴充的方法,但不主張),而ArrayList的容量是動态的。
2、一個數組隻能儲存一種類型,而Arraylist可以儲存不同類型。
3、數組可以儲存基本資料類型,但ArrayList不可以,它儲存的是OBJECT類的引用,是以在取出元素時,要做類型轉換。
4、數組不能聲明為隻讀數組,而ArrayList可以提供ReadOnly方法,以隻讀的方式使用。
5、數組的效率高,但ArrayList的效率低。當增加一個新元素時,ArrayList首先要檢查其内
部數組是否越界,如沒有越界,則可增加;如越界,則建立一個兩倍于目前内部數組容量的新數組,将舊内部數組的元素拷貝至新内部數組,并廢棄舊數組,是以其效率相比數組要低。
9.>>的>>>的差別
>>表示右移,如:int i=15; i>>2的結果是3,移出的部分将被抛棄。
轉為二進制的形式可能更好了解,0000 1111(15)右移2位的結果是0000 0011(3),0001 1010(18)右移3位的結果是0000 0011(3)。
>>>
j>>>i 與 j/(int)(Math.pow(2,i))的結果相同,其中i和j是整形。
10.CXF
Can't find the request for http://localhost:8080/****/****.do's Observer
一般這個錯是你可能在項目中用到了cxf,在web.xml中cxf的配置中你可能url-pattern配置為/*,
解決辦法:
你在用戶端删掉web.xml中的cxf配置或者是在mapping中不要讓它映射所有<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/加上路徑/*</url-pattern>
</servlet-mapping>
不然就會首先映射CXFServlet,就會找不到服務
11.UTF-8環境設定
建置全UTF-8的環境:
1.在eclipse.ini的-vmargs下面加上「-Dfile.encoding=UTF-8」。
2.eclipse-->Window-->Preferences-->General-->Workspace-->Text file encoding-->UTF-8
3.Installed JREs-->Default VM Arguments:-->-Dfile.encoding=UTF-8
4.eclipse-->Run-->Run Configurations-->Arguments-->VM arguments-->-Dfile.encoding=UTF-8
--下面兩個作用未明,使用以上步驟即可
5.eclipse-->Run-->Run Configuration-->Common 頁籤--> Console Encoding-->Others-->UTF-8
==>亂碼!
5.eclipse-->Run-->Run Configuration-->Common 頁籤--> Console Encoding-->Others-->big5
==>ok!
12.spring注解
12.1@Repository、@Service 和 @Controller、@Component
Spring 2.5 中除了提供 @Component 注釋外,還定義了幾個擁有特殊語義的注釋,它們分别是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,這 3 個注釋和 @Component 是等效的,但是從注釋類的命名上,很容易看出這 3 個注釋分别和持久層、業務層和控制層(Web 層)相對應。雖然目前這 3 個注釋和 @Component 相比沒有什麼新意,但 Spring 将在以後的版本中為它們添加特殊的功能。是以,如果 Web 應用程式采用了經典的三層分層結構的話,最好在持久層、業務層和控制層分别采用 @Repository、@Service 和 @Controller 對分層中的類進行注釋,而用 @Component 對那些比較中立的類進行注釋。
12.2@Autowired與@Resource
1、@Autowired與@Resource都可以用來裝配bean. 都可以寫在字段上,或寫在setter方法上。
2、@Autowired預設按類型裝配(這個注解是屬業spring的),預設情況下必須要求依賴對象必須存在,如果要允許null 值,可以設定它的required屬性為false,如:
@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier注解進行使用,如下:
Java代碼
1. @Autowired() @Qualifier("baseDao")
2. private BaseDao baseDao;
3、@Resource(這個注解屬于J2EE的),預設安照名稱進行裝配,名稱可以通過name屬性進行指定,
如果沒有指定name屬性,當注解寫在字段上時,預設取字段名進行按照名稱查找,如果注解寫在setter方法上預設取屬性名進行裝配。 當找不到與名稱比對的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就隻會按照名稱進行裝配。
12.3action注解
總結常用的注解如下:
Namespace:指定命名空間。
ParentPackage:指定父包。
Result:提供了Action結果的映射。(一個結果的映射)
Results:“Result”注解清單
ResultPath:指定結果頁面的基路徑。
Action:指定Action的通路URL。
Actions:“Action”注解清單。
ExceptionMapping:指定異常映射。(映射一個聲明異常)
ExceptionMappings:一級聲明異常的數組。
InterceptorRef:攔截器引用。
InterceptorRefs:攔截器引用組。
例子:
/**
* Struts2基于注解的Action配置
*
*/
@ParentPackage("struts-default")
@Namespace("/annotation_test")
@Results( { @Result(name = "success", location = "/main.jsp"),
@Result(name = "error", location = "/error.jsp") })
@ExceptionMappings( { @ExceptionMapping(exception = "java.lange.RuntimeException", result = "error") })
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = 2730268055700929183L;
private String loginName;
private String password;
@Action("login") //或者寫成 @Action(value = "login")
public String login() throws Exception {
if ("yjd".equals(loginName) && "yjd".equals(password)) {
return SUCCESS;
} else {
return ERROR;
}
}
@Action(value = "add", results = { @Result(name = "success", location = "/index.jsp") })
public String add() throws Exception {
return SUCCESS;
}
13.hibernate注解
不使用注解時的hibernate配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
1.<property name="mappingDirectoryLocations">
<value>classpath:/com/……</value>
</property>
2.
<property name="mappingLocations">
<list>
<value>com/….hbm.xml</value>
</list>
</property>
使用注解時配置改為:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
1.
<property name="packagesToScan">
<list>
<value>com…… </value>
</list>
</property>
2. <property name="annotatedClasses">
<list>
<value>com….</value>
</list>
</property>
1。@Entity(name="EntityName")
必須,name為可選,對應資料庫中一的個表
2、@Table(name="",catalog="",schema="")
可選,通常和@Entity配合使用,隻能标注在實體的class定義處,表示實體對應的資料庫表的資訊
name:可選,表示表的名稱.預設地,表名和實體名稱一緻,隻有在不一緻的情況下才需要指定表名
catalog:可選,表示Catalog名稱,預設為Catalog("").
schema:可選,表示Schema名稱,預設為Schema("").
3、@id
必須
@id定義了映射到資料庫表的主鍵的屬性,一個實體隻能有一個屬性被映射為主鍵.置于getXxxx()前.
4、@GeneratedValue(strategy=GenerationType,generator="")
可選
strategy:表示主鍵生成政策,有AUTO,INDENTITY,SEQUENCE 和 TABLE 4種,分别表示讓ORM架構自動選擇,
根據資料庫的Identity字段生成,根據資料庫表的Sequence字段生成,以有根據一個額外的表生成主鍵,預設為AUTO
generator:表示主鍵生成器的名稱,這個屬性通常和ORM架構相關,例如,Hibernate可以指定uuid等主鍵生成方式.
示例:
@Id
@GeneratedValues(strategy=StrategyType.SEQUENCE)
public int getPk() {
return pk;
}
5、@Basic(fetch=FetchType,optional=true)
可選
@Basic表示一個簡單的屬性到資料庫表的字段的映射,對于沒有任何标注的getXxxx()方法,預設
即為@Basic
fetch: 表示該屬性的讀取政策,有EAGER和LAZY兩種,分别表示主支抓取和延遲加載,預設為EAGER.
optional:表示該屬性是否允許為null,預設為true
示例:
@Basic(optional=false)
public String getAddress() {
return address;
}
6、@Column
可選
@Column描述了資料庫表中該字段的詳細定義,這對于根據JPA注解生成資料庫表結構的工具非常有作用.
name:表示資料庫表中該字段的名稱,預設情形屬性名稱一緻
nullable:表示該字段是否允許為null,預設為true
unique:表示該字段是否是唯一辨別,預設為false
length:表示該字段的大小,僅對String類型的字段有效
insertable:表示在ORM架構執行插入操作時,該字段是否應出現INSETRT語句中,預設為true
updateable:表示在ORM架構執行更新操作時,該字段是否應該出現在UPDATE語句中,預設為
true.對于一經建立就不可以更改的字段,該屬性非常有用,如對于birthday字段.
columnDefinition:表示該字段在資料庫中的實際類型.通常ORM架構可以根據屬性類型自動判
斷資料庫中字段的類型,但是對于Date類型仍無法确定資料庫中字段類型究竟是DATE,TIME還是
TIMESTAMP.此外,String的預設映射類型為VARCHAR,如果要将String類型映射到特定資料庫的
BLOB或TEXT字段類型,該屬性非常有用.
示例:
@Column(name="BIRTH",nullable="false",columnDefinition="DATE")
public String getBithday() {
return birthday;
}
7、@Transient
可選
@Transient表示該屬性并非一個到資料庫表的字段的映射,ORM架構将忽略該屬性.
如果一個屬性并非資料庫表的字段映射,就務必将其标示為@Transient,否則,ORM架構預設其注解為@Basic
示例:
//根據birth計算出age屬性
@Transient
public int getAge() {
return getYear(new Date()) -getYear(birth);
}
8、@ManyToOne(fetch=FetchType,cascade=CascadeType)
可選
@ManyToOne表示一個多對一的映射,該注解标注的屬性通常是資料庫表的外鍵
optional:是否允許該字段為null,該屬性應該根據資料庫表的外鍵限制來确定,預設為true
fetch:表示抓取政策,預設為FetchType.EAGER
cascade:表示預設的級聯操作政策,可以指定為ALL,PERSIST,MERGE,REFRESH和REMOVE中的若幹組合,預設為無級聯操作
targetEntity:表示該屬性關聯的實體類型.該屬性通常不必指定,ORM架構根據屬性類型自動判斷targetEntity.
示例:
//訂單Order和使用者User是一個ManyToOne的關系
//在Order類中定義
@ManyToOne()
@JoinColumn(name="USER")
public User getUser() {
return user;
}
9、@JoinColumn
可選
@JoinColumn和@Column類似,介量描述的不是一個簡單字段,而一一個關聯字段,例如.描述一個@ManyToOne的字段.
name:該字段的名稱.由于@JoinColumn描述的是一個關聯字段,如ManyToOne,則預設的名稱由其關聯的實體決定.
例如,實體Order有一個user屬性來關聯實體User,則Order的user屬性為一個外鍵,其預設的名稱為實體User的名稱+下劃線+實體User的主鍵名稱
示例:
見@ManyToOne
10、@OneToMany(fetch=FetchType,cascade=CascadeType)
可選
@OneToMany描述一個一對多的關聯,該屬性應該為集體類型,在資料庫中并沒有實際字段.
fetch:表示抓取政策,預設為FetchType.LAZY,因為關聯的多個對象通常不必從資料庫預先讀取到記憶體
cascade:表示級聯操作政策,對于OneToMany類型的關聯非常重要,通常該實體更新或删除時,其關聯的實體也應當被更新或删除
例如:實體User和Order是OneToMany的關系,則實體User被删除時,其關聯的實體Order也應該被全部删除
示例:
@OneTyMany(cascade=ALL)
public List getOrders() {
return orders;
}
11、@OneToOne(fetch=FetchType,cascade=CascadeType)
可選
@OneToOne描述一個一對一的關聯
fetch:表示抓取政策,預設為FetchType.LAZY
cascade:表示級聯操作政策
示例:
@OneToOne(fetch=FetchType.LAZY)
public Blog getBlog() {
return blog;
}
12、@ManyToMany
可選
@ManyToMany 描述一個多對多的關聯.多對多關聯上是兩個一對多關聯,但是在ManyToMany描述中,中間表是由ORM架構自動處理
targetEntity:表示多對多關聯的另一個實體類的全名,例如:package.Book.class
mappedBy:表示多對多關聯的另一個實體類的對應集合屬性名稱
示例:
User實體表示使用者,Book實體表示書籍,為了描述使用者收藏的書籍,可以在User和Book之間建立ManyToMany關聯
@Entity
public class User {
private List books;
@ManyToMany(targetEntity=package.Book.class)
public List getBooks() {
return books;
}
public void setBooks(List books) {
this.books=books;
}
}
@Entity
public class Book {
private List users;
@ManyToMany(targetEntity=package.Users.class,mappedBy="books")
public List getUsers() {
return users;
}
public void setUsers(List users) {
this.users=users;
}
}
兩個實體間互相關聯的屬性必須标記為@ManyToMany,并互相指定targetEntity屬性,需要注意的是,有且隻有一個實體的@ManyToMany注解需要指定mappedBy屬性,指向targetEntity的集合屬性名稱
利用ORM工具自動生成的表除了User和Book表外,還自動生成了一個User_Book表,用于實作多對多關聯
13、@MappedSuperclass
可選
@MappedSuperclass可以将超類的JPA注解傳遞給子類,使子類能夠繼承超類的JPA注解
示例:
@MappedSuperclass
public class Employee() {
....
}
@Entity
public class Engineer extendsEmployee {
.....
}
@Entity
public class Manager extends Employee{
.....
}
14、@Embedded
可選
@Embedded将幾個字段組合成一個類,并作為整個Entity的一個屬性.
例如User包括id,name,city,street,zip屬性.
我們希望city,street,zip屬性映射為Address對象.這樣,User對象将具有id,name和address這三個屬性.
Address對象必須定義為@Embededable
示例:
@Embeddable
public class Address{city,street,zip}
@Entity
public class User {
@Embedded
public Address getAddress() {
..........
}
}
14.spring MVC
1.需要請求到背景的頁面參數必須包含id屬性,否則會出現頁面不跳轉,也不報錯的情況
15.java檔案下載下傳的幾種方式
public HttpServletResponse download(String path, HttpServletResponse response) {
try {
// path是指欲下載下傳的檔案的路徑。
File file = new File(path);
// 取得檔案名。
String filename = file.getName();
// 取得檔案的字尾名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下載下傳檔案。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 設定response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return response;
}
public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {
// 下載下傳本地檔案
String fileName = "Operator.doc".toString(); // 檔案的預設儲存名
// 讀到流中
InputStream inStream = new FileInputStream("c:/Operator.doc");// 檔案的存放路徑
// 設定輸出的格式
response.reset();
response.setContentType("bin");
response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
// 循環取出流中的資料
byte[] b = new byte[100];
int len;
try {
while ((len = inStream.read(b)) > 0)
response.getOutputStream().write(b, 0, len);
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void downloadNet(HttpServletResponse response) throws MalformedURLException {
// 下載下傳網絡檔案
int bytesum = 0;
int byteread = 0;
URL url = new URL("windine.blogdriver.com/logo.gif");
try {
URLConnection conn = url.openConnection();
InputStream inStream = conn.getInputStream();
FileOutputStream fs = new FileOutputStream("c:/abc.gif");
byte[] buffer = new byte[1204];
int length;
while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread;
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//支援線上打開檔案的一種方式
public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
File f = new File(filePath);
if (!f.exists()) {
response.sendError(404, "File not found!");
return;
}
BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
byte[] buf = new byte[1024];
int len = 0;
response.reset(); // 非常重要
if (isOnLine) { // 線上打開方式
URL u = new URL("file:///" + filePath);
response.setContentType(u.openConnection().getContentType());
response.setHeader("Content-Disposition", "inline; filename=" + f.getName());
// 檔案名應該編碼成UTF-8
} else { // 純下載下傳方式
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());
}
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0)
out.write(buf, 0, len);
br.close();
out.close();
}
16.json轉換需要的jar包
commons-lang3-3.1.jar 與commons-lang-2.4.jar 的包路徑不同
json-lib-2.1.jar需要的是版本2的commons-lang
commons-beanutils-1.8.0.jar不加這個包
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean
commons-collections.jar 不加這個包
java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap
commons-lang-2.4.jar不加這個包
java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
commons-logging-1.1.1.jar不加這個包
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
ezmorph-1.0.4.jar不加這個包
java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher
json-lib-2.3-jdk15.jar不加這個包
java.lang.NoClassDefFoundError: net/sf/json/JSONObject
17spring事務
同一個類的不同方法互相調用,内層方法配置Propagation.REQUIRES_NEW後該事務不會單獨進行送出,而是和外層的事務一起送出。
@Transactional 加于private方法, 無效
@Transactional 加于未加入接口的public方法, 再通過普通接口方法調用, 無效
@Transactional 加于接口方法, 無論下面調用的是private或public方法, 都有效
@Transactional 加于接口方法後, 被本類普通接口方法直接調用, 無效
@Transactional 加于接口方法後, 被本類普通接口方法通過接口調用, 有效
@Transactional 加于接口方法後, 被它類的接口方法調用, 有效
@Transactional 加于接口方法後, 被它類的私有方法調用後, 有效
TransactionDefinition.PROPAGATION_REQUIRED:如果目前存在事務,則加入該事務;如果目前沒有事務,則建立一個新的事務。這是預設值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:建立一個新的事務,如果目前存在事務,則把目前事務挂起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果目前存在事務,則加入該事務;如果目前沒有事務,則以非事務的方式繼續運作。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運作,如果目前存在事務,則把目前事務挂起。
TransactionDefinition.PROPAGATION_NEVER:以非事務方式運作,如果目前存在事務,則抛出異常。
TransactionDefinition.PROPAGATION_MANDATORY:如果目前存在事務,則加入該事務;如果目前沒有事務,則抛出異常。
TransactionDefinition.PROPAGATION_NESTED:如果目前存在事務,則建立一個事務作為目前事務的嵌套事務來運作;如果目前沒有事務,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。
Spring的AOP即聲明式事務管理預設是針對unchecked exception復原。Spring的事務邊界是在調用業務方法之前開始的,業務方法執行完畢之後來執行commit or rollback(Spring預設取決于是否抛出runtimeException)。
Spring事務的復原機制:
如果你在方法中有try{}catch(Exception e){}處理,那麼try裡面的代碼塊就脫離了事務的管理,若要事務生效需要在catch中throw new RuntimeException ("xxxxxx");
18jvm設定
JAVA_OPTS="-Xms512m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=512m"
當記憶體溢出時自動生成dump檔案
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/biapp/m.hprof
已經記憶體溢出且未配置參數時手動抓取dump檔案
jmap -dump:format=b,file=檔案名 [pid]
19在eclipse中debug模式下,修改方法中的代碼,而不重新開機伺服器(部分修改必須重新開機)
20Ajax傳數組至背景注意事項
//防止深度序列化(不加背景接收到的數組會為空)
增加參數traditional: true,
21ibatis中的order by 參數配置問題
總結如下:
1.#是把傳入的資料當作字元串,如#field#傳入的是id,則sql語句生成是這樣,order by "id",這當然會報錯..
2.$傳入的資料直接生成在sql裡,如$field$傳入的是id,則sql語句生成是這樣,order by id, 這就對了. 如:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> <isNotNull property="orderBy"><![CDATA[ order by $orderBy$ ]]>
<isNotNull property="descOrAsc"><![CDATA[ $descOrAsc$ ]]></isNotNull>
</isNotNull>
3.#方式能夠很大程度防止sql注入.
4.$方式一般用于傳入資料庫對象.例如傳入表名.
5.一般能用#的就别用$.
遇到的問題是order by後面的字段是動态的,有時候用字段1,有時候用字段2
sqlmap的配置為:
<isNotEmpty property="mytag1">
obder by $mytag1$
</isNotEmpty>
<isNotEmpty property="mytag2">
obder by $字段2$
</isNotEmpty>