package com.github.walker.easydb;
import com.github.walker.easydb.assistant.DateTimeUtil;
import com.github.walker.easydb.assistant.LogFactory;
import com.github.walker.easydb.criterion.Criteria;
import com.github.walker.easydb.criterion.Exp;
import com.github.walker.easydb.dao.EasyDao;
import com.github.walker.easydb.dao.SqlParamMap;
import com.github.walker.easydb.datatype.*;
import com.github.walker.easydb.vo.*;
import org.apache.log4j.Logger;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
/**
* Demostrates the using of EasyDB component.
*
* @author HuQingmiao
*/
public class DemoService {
private EasyDao dao = EasyDao.getInstance();
private Logger log = LogFactory.getLogger(getClass());
/**
* 清空测试数据,以备测试
*
* @throws Exception
*/
public void clearTestData() throws Exception {
log.info("\nclearTestData()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
dao.deleteAll(Book.class);
dao.deleteAll(Editor.class);
dao.deleteAll(BookEditor.class);
// 开放此代码, 试图删除一个不存在的表, 将抛出异常且整个事务将回滚
//dao.deleteAll(Boek.class);
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 增加一本书;
*
* @throws Exception
*/
public void addOneBook() throws Exception {
log.info("\naddOneBook()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
Book book = new Book();
book = new Book();
book.setBookId(new ELong(1));
book.setTitle(new EString("Unix网络编程"));
book.setPrice(new EFloat(30.0f));
book.setPublishTime(new ETimestamp(DateTimeUtil.getCurrentTime()));
// 开放此代码, 试图把一个不存在的文件写入数据库, 将抛出异常
book.setTextContent(new ETxtFile("d:/三国演义.txt"));
// 开放此代码, 试图向不存在与此属性对应的列写数据, EasyDB会对其忽略
//book.setaNotExistCol(new EString("asdff"));
dao.save(book); // 持久化实体
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 批量增加多本书;
*
* @throws Exception
*/
public void addMultiBooks() throws Exception {
log.info("\naddMultiBooks()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
Book[] BookArray = new Book[4];
BookArray[0] = new Book();
BookArray[0].setBookId(new ELong(101));
BookArray[0].setTitle(new EString("UNIX-上册"));
BookArray[0].setPrice(new EFloat(100.0f));
// 开放此代码,将抛出异常:批量操作时,不允许对大字段列进行批量写入
// BookArray[0].setBlobContent(new EBinFile("d:\\unix.chm"));
BookArray[1] = new Book();
BookArray[1].setBookId(new ELong(105));
BookArray[1].setTitle(new EString("UNIX-中册"));
// 屏蔽此代码,将抛出异常:参数Entity数组中列值存放位置必须一致!
BookArray[1].setPrice(new EFloat(52.0f));
BookArray[2] = new Book();
BookArray[2].setBookId(new ELong(103));
BookArray[2].setTitle(new EString("UNIX-下册"));
BookArray[2].setPrice(new EFloat(35.0f));
dao.save(BookArray); // 持久化实体
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 更新指定主键所表示的那本书的信息
*
* @throws Exception
*/
public void updateOneBook() throws Exception {
log.info("\nupdateOneBook()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
// 设置要更新的项:书名,书的二进制内容,书的文本内容
Book newBook = new Book();
newBook.setTitle(new EString("三国演义(第二版)"));
newBook.setTextContent(new ETxtFile("d:/三国演义.txt"));
newBook.setBlobContent(new EBinFile());
// 如果要将大字段列置空,则..
//newBook.setTextContent(new ETxtFile());//以文本方式更新内容
//必须指定主键, 它是更新的依据
newBook.setBookId(new ELong(1));
dao.update(newBook);
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 先从数据库检索一批书, 再对这些书的信息进行批量更新
*
* @throws Exception
*/
public void updateMulitBooks() throws Exception {
log.info("\nupdateMulitBooks()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
String sql = " select book_id,title,price,publish_time from book ";
ArrayList list = dao.get(sql, Book.class);
Book[] books = new Book[list.size()];
for (int i = 0; i < list.size(); i++) {
Book b = (Book) list.get(i);
//设置新的出版时间和价格
b.setPublishTime(new ETimestamp(DateTimeUtil.parse("2008-01", "yyyy-MM")));
b.setPrice(new EFloat(b.getPrice().floatValue() - 10.0f));
books[i] = b;
}
list.clear();
dao.update(books);
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 删除指定主键所表示的那本书
*
* @throws Exception
*/
public void deleteOneBook() throws Exception {
log.info("\ndeleteOneBook()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
Book book = new Book();
book.setBookId(new ELong(101));
//先从数据库载入, 再删除
if (dao.loadByPK(book)) {
dao.delete(book);
}
//或者指定主键进行删除
// Book book2 = new Book();
// book2.setBookId(new ELong(101));
// dao.delete(book2);
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 先从数据库检索一批书, 再删除这些书
*
* @throws Exception
*/
public void deleteMulitBooks() throws Exception {
log.info("\ndeleteMulitBooks()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
String sql = " select book_id,title,cost,publish_time from book where cost>20";
ArrayList list = dao.get(sql, Book.class);
//将list转为数组后删除
Book[] books = (Book[]) list.toArray(new Book[0]);
list.clear();
dao.delete(books);
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 指定条件, 删除一部分书
*
* @throws Exception
*/
public void deleteBookByCriteria() throws Exception {
log.info("\ndeleteBookByCriteria()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
// Set<String> set = new HashSet<String>();
// set.add("UNIX-上册");
// set.add("UNIX-下册");
// dao.delete(Book.class, Exp.in("title", set));
Criteria c1 = Exp.like("title", "三国%");
dao.delete(Book.class, c1);
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 分别以两种SQL的方式添加两本书;
*
* @throws Exception
*/
public void executeSqlToAddBook() throws Exception {
log.info("\nexecuteSqlToAddBook()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
// 方式1:可执行SQL
String sql = " INSERT INTO BOOK (book_id,title,price) "
+ " VALUES (3, '鲁宾逊漂流记', 20.0) ";
dao.exec(sql);
// 方式2:参数化SQL
sql = " INSERT INTO BOOK (book_id,title,price,publish_time) VALUES (?,?,?,?) ";
SqlParamMap pMap = new SqlParamMap();
pMap.put(1, "4");
pMap.put(2, "资本论");
pMap.put(3, 22.0f);
pMap.put(4, DateTimeUtil.parse("2007-0-10", "yyyy-MM-dd"));
dao.exec(sql, pMap);
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 以SQL的方式添加几位编者信息
*
* @throws Exception
*/
public void executeSqlToAddEditors() throws Exception {
log.info("\nexecuteSqlToAddEditors()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
String sql = " INSERT INTO EDITOR (EDITOR_ID,NAME,SEX) VALUES (?,?,?) ";
SqlParamMap[] pMapArray = new SqlParamMap[4];
int k = 1;
pMapArray[0] = new SqlParamMap();
pMapArray[0].put(k++, 1);
pMapArray[0].put(k++, "Richard Stevens");
// 屏蔽此代码,将抛出异常:批量操作时, 某组参数的值比'?'少!
pMapArray[0].put(k++, "M");
// 开放此代码,将抛出异常:批量操作时, 某组参数的值比'?'多!
//pMapArray[0].put(k++, "M");
k = 1;
pMapArray[1] = new SqlParamMap();
pMapArray[1].put(k++, 2);
pMapArray[1].put(k++, "易中天");
pMapArray[1].put(k++, "M");
k = 1;
pMapArray[2] = new SqlParamMap();
pMapArray[2].put(k++, 3);
pMapArray[2].put(k++, "罗贯中");
pMapArray[2].put(k++, "M");
k = 1;
pMapArray[3] = new SqlParamMap();
pMapArray[3].put(k++, 4);
pMapArray[3].put(k++, "笛福");
pMapArray[3].put(k++, "M");
dao.exec(sql, pMapArray);
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 以SQL的方式添加几条书与编者的关联信息;
*
* @throws Exception
*/
public void executeSqlToAddBookEditor() throws Exception {
log.info("\nexecuteSqlToAddBookEditor()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
String sql = " INSERT INTO BOOK_EDITOR (EDITOR_ID,BOOK_ID) VALUES (?,?) ";
SqlParamMap[] pMapArray = new SqlParamMap[6];
// Richard Stevens -> 永远的UNIX_上册
pMapArray[0] = new SqlParamMap();
pMapArray[0].put(1, 1);
pMapArray[0].put(2, 101);
// Richard Stevens -> 永远的UNIX_中册
pMapArray[1] = new SqlParamMap();
pMapArray[1].put(1, 1);
pMapArray[1].put(2, 102);
// Richard Stevens -> 永远的UNIX_下册
pMapArray[2] = new SqlParamMap();
pMapArray[2].put(1, 1);
pMapArray[2].put(2, 103);
// 罗贯中 -> 三国演义
pMapArray[4] = new SqlParamMap();
pMapArray[4].put(1, 3);
// 请仔细观察,屏蔽此行后的执行效果, 其结果与JDBC的效果一致, 即继承上组参数值
pMapArray[4].put(2, 1);
// 罗贯中 -> 三国演义
pMapArray[5] = new SqlParamMap();
pMapArray[5].put(1, 4);
// 请仔细观察,屏蔽此行后的执行效果, 其结果与JDBC的效果一致, 即继承上组参数值
pMapArray[5].put(2, 3);
dao.exec(sql, pMapArray);
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 找出某位作者的资料及其所编写的书
*
* @throws Exception
*/
public void getEditorAndBook() throws Exception {
log.info("\ngetEditorAndBook()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
StringBuffer sql = new StringBuffer();
sql.append(" SELECT A.NAME EDITOR_NAME, A.SEX EDITOR_SEX, ");
sql.append(" C.TITLE, C.COST, C.BLOB_CONTENT, C.TEXT_CONTENT ");
sql.append(" FROM EDITOR A, BOOK_EDITOR B, BOOK C ");
sql.append(" WHERE A.EDITOR_ID = B.EDITOR_ID ");
sql.append(" AND B.BOOK_ID = C.BOOK_ID ");
sql.append(" AND A.NAME like 'Richard%' ");
sql.append(" ORDER BY C.COST ");
@SuppressWarnings("rawtypes")
ArrayList list = dao.get(sql.toString(), EditorAndBook.class);
// 打印出查询结果
StringBuffer buff = new StringBuffer("查询结果: \n");
for (int i = 0; i < list.size(); i++) {
EditorAndBook editorBook = (EditorAndBook) list.get(i);
// 输出作者姓名、性别、作者、作者所著书的书名、书价、书的内容
buff.append(editorBook.getEditorName() + "\t");
buff.append(editorBook.getEditorSex() + "\t");
buff.append(editorBook.getTitle() + "\t");
buff.append(editorBook.getCost() + "\t");
// EasyDB已经从数据库读取到书的内容, 并以文件的形式存放在JAVA临时目
// 录(java.io.tmp), 现在打印出该文件的全路径。
buff.append(editorBook.getBlobContent() + "\t");
buff.append(editorBook.getTextContent() + "\t");
buff.append("\n");
}
log.info(buff.toString());
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 分页查询, 查出每2-3条记录
* <p/>
* 找出某位作者的资料及其所编写的书 Demostrates the method: exec(String pSql, ParameterMap[]
* paraMapArray).
*
* @throws Exception
*/
public void getEditorAndBookByPager() throws Exception {
log.info("\ngetEditorAndBookByPager()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
StringBuffer sql = new StringBuffer();
// sql.append(" SELECT * FROM (");
sql.append(" SELECT a.name editor_name, a.sex editor_sex, ");
sql.append(" c.title, c.cost, c.blob_content, c.text_content ");
sql.append(" FROM editor a, book_editor b, book c ");
sql.append(" WHERE a.editor_id = b.editor_id ");
sql.append(" AND b.book_id = c.book_id ");
// sql.append(" AND A.NAME like 'Richard%' ");
sql.append(" ORDER BY c.cost ");
@SuppressWarnings("rawtypes")
ArrayList list = dao
.get(sql.toString(), EditorAndBook.class, 1, 15);
// 打印出查询结果
StringBuffer buff = new StringBuffer("查询结果: \n");
for (int i = 0; i < list.size(); i++) {
EditorAndBook editorBook = (EditorAndBook) list.get(i);
// 输出作者姓名、性别、作者、作者所著书的书名、书价、书的内容
buff.append(editorBook.getEditorName() + "\t");
buff.append(editorBook.getEditorSex() + "\t");
buff.append(editorBook.getTitle() + "\t");
buff.append(editorBook.getCost() + "\t");
// EasyDB已经从数据库读取到书的内容,现在打印出该文件的全路径
buff.append(editorBook.getBlobContent() + "\t");
buff.append(editorBook.getTextContent() + "\t");
buff.append("\n");
}
log.info(buff.toString());
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 查询并展示所有的书
*
* @throws Exception
*/
public void showAllBooks() throws Exception {
log.info("\nshowAllBooks()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
String sql = " SELECT book_id,title,price,publish_Time FROM book ORDER BY book_id ";
ArrayList list = dao.get(sql, Book.class);
// 打印出查询结果
StringBuffer buff = new StringBuffer("查询结果: \n");
for (int i = 0; i < list.size(); i++) {
Book b = (Book) list.get(i);
buff.append(b.getBookId() + "\t");
buff.append(b.getTitle() + "\t");
buff.append(b.getPrice() + "\t");
//buff.append(b.getBlobContent() + "\t");
//buff.append(b.getTextContent()+"\t");
buff.append(b.getPublishTime() + "\n");
}
log.info(buff);
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 从某个表中仅取一条记录
*
* @throws Exception
*/
public void getOneBook() throws Exception {
log.info("\ngetOneBook()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
Criteria c = Exp.eq("bookId", 102);
Book book = (Book) dao.getOne(Book.class, c);
// 输出查询结果
StringBuffer buff = new StringBuffer("查询结果: \n");
if (book != null) {
buff.append(book.getBookId() + "\t");
buff.append(book.getTitle() + "\t");
buff.append(book.getPrice() + "\t");
//buff.append(book.getBlobContent() + "\t");
//buff.append(book.getTextContent() + "\t");
buff.append(book.getPublishTime() + "\n");
}
log.info(buff.toString());
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
/**
* 演示嵌套事务
*
* @throws Exception
*/
public void nestedTransaction() throws Exception {
log.info("\nnestedTransaction()>>>>>>>>>>>>>>>>>>>>");
dao.beginTrans(); // 发起事务
boolean commit = false;// 事务执行成功的标识
try {
this.addOneBook(); //第一个子事务
this.addMultiBooks(); //第二个子事务
this.executeSqlToAddBook();
// //开放此代码,整个事务包括所有子事务将回滚
// if (true) {
// throw new Exception(">>>>>throwed by nestedTransaction() ");
// }
this.executeSqlToAddEditors();
this.executeSqlToAddBookEditor();
commit = true;// 标识事务成功执行
} finally {
dao.endTrans(commit);// 结束事务
}
}
public void doBeforeTest() throws Exception {
//创建两个文件
File file1 = new File("d:/unix.txt");
File file3 = new File("d:/三国演义.txt");
FileOutputStream out;
try {
out = new FileOutputStream(file1);
out.write("the history of unix ....".getBytes());
out.flush();
out.close();
out = new FileOutputStream(file3);
out.write("三国啊,孔明兄啊 ".getBytes());
out.flush();
out.close();
} catch (FileNotFoundException e) {
log.error("", e);
} catch (IOException e) {
log.error("", e);
}
}
public void doAfterTest() throws Exception {
File file1 = new File("d:\\unix.txt");
File file2 = new File("d:\\unix.chm");
File file3 = new File("d:\\三国演义.txt");
file1.delete();
file2.delete();
file3.delete();
}
}