在大型項目中,android的資料庫操作不可能再像第二篇文章那樣,用最基礎的API去實作各方面的操作,那樣效率會十分的底下。那麼,在android開發中,提拱了androrm,Ormlite,greenDao三個主流架構,部落客三生有幸,再開發第一個項目的時候,就被逼着學習使用greenDao這個ORM架構。現在回過頭看,greenDao似乎是三種架構中效率最高的,但是對于初學者來說,使用起來非常的不方面,因為官方是純英文文檔,例子也不夠詳細。部落客那個時候真的是在前進中摸索,各種坎坷,網上的博文介紹的都不夠詳細,不能滿足部落客的需求,對于資料庫的多表設計,網上的例子也都不夠詳細,而且大部分都是從官方文檔直接copy過來,并不是自己寫的,更不會有注釋。對于新手不好上手。最近這段時間部落客比較有時間,于是整理之前的筆記,在資料庫專題來詳細講解一下greendao的使用。部落客從零開始,一段一段代碼自己敲,并配上注釋,保證新手容易上手。熟練掌握greendao的使用。
GreenDao官網:http://greendao-orm.com/
GreenDao github下載下傳位址:https://github.com/greenrobot/greenDAO
GreenDao設計目的:最大性能,最快的Android ORM架構,易于使用的API,高度優化,最小記憶體的損耗
有興趣的同學可以将完整的工程下載下傳下來學習,看完後絕對可以掌握GreenDao的使用,可以直接拿去自己的項目工程裡使用
示例代碼下載下傳位址:http://download.csdn.net/detail/victorfreedom/8353631
好了,廢話說完了,接下來一步一步的開發一個使用greenDao的android項目工程。
一、建立一個JAVA工程,用于裝載GreenDao類,生成Dao類檔案。
在這個工程裡面必須導入 greendao-generator.jar和freemarker.jar或者直接在下載下傳下來的例子裡面的de.greenrobot.daogenerator包内容導入 部落客的項目結構如圖:
接下來,我們來寫Dao類檔案的生成代碼,詳情請看代碼: [java] view plain copy
- package com.batways.apopo.generator;
- import de.greenrobot.daogenerator.DaoGenerator;
- import de.greenrobot.daogenerator.Entity;
- import de.greenrobot.daogenerator.Property;
- import de.greenrobot.daogenerator.Schema;
- import de.greenrobot.daogenerator.ToMany;
- public class TestCase {
- // 資料庫更新
- private static int dbVersion = 1;
- private String modelPackage = "com.example.freedomsql.bean";
- private Schema schema = new Schema(dbVersion, modelPackage);
- public static void main(String[] args) throws Exception {
- TestCase testCase = new TestCase();
- testCase.init();
- testCase.schema.enableKeepSectionsByDefault();
- testCase.schema.enableActiveEntitiesByDefault();
- new DaoGenerator().generateAll(testCase.schema,
- "E:\\mayflygeek\\mayflygeekprojects\\FreedomSql\\src");
- }
- public void init() {
- // 定義一個實體
- Entity OrderHeader = schema.addEntity("OrderHeader");
- // 實作序列化接口
- OrderHeader.implementsSerializable();
- // 定義ID主鍵
- OrderHeader.addIdProperty();
- // 增加其他字段,這裡可以定義很多類型,還可以指定屬性
- OrderHeader.addStringProperty("orderName").notNull();
- //如果不想用上面的定義ID主鍵,還可以自己這樣定義。
- // OrderHeader.addLongProperty("orderId").primaryKey().autoincrement();
- //後面的實體定義和上面的差不多。就不在較長的描述
- Entity OrderItem = schema.addEntity("OrderItem");
- OrderItem.implementsSerializable();
- OrderItem.addIdProperty();
- OrderItem.addStringProperty("itemName");
- // 用于做多表設計使用
- Property orderId = OrderItem.addLongProperty("orderId").getProperty();
- Entity Student = schema.addEntity("Student");
- Student.implementsSerializable();
- Student.addIdProperty();
- Student.addStringProperty("studentName");
- // 增加一個字段,資料庫更新
- // Student.addDoubleProperty("results");
- Entity Teacher = schema.addEntity("Teacher");
- Teacher.implementsSerializable();
- Teacher.addIdProperty();
- Teacher.addStringProperty("teacherName");
- Entity StudentTeacher = schema.addEntity("StudentTeacher");
- Property teacherId = StudentTeacher.addLongProperty("teacherId")
- .getProperty();
- Property studentId = StudentTeacher.addLongProperty("studentId")
- .getProperty();
- // Entity Grade = schema.addEntity("Grade");
- // Grade.implementsSerializable();
- // Grade.addIdProperty();
- // Grade.addStringProperty("gradeName");
- // 樹狀結構,自身實作1對多
- Entity Tree = schema.addEntity("Tree");
- Tree.addIdProperty();
- Tree.addStringProperty("treeName");
- Property parentId = Tree.addLongProperty("parentId").getProperty();
- Tree.addToOne(Tree, parentId).setName("parent");
- Tree.addToMany(Tree, parentId).setName("children");
- // 外鍵添加,1對多
- OrderItem.addToOne(OrderHeader, orderId);
- ToMany addToMany = OrderHeader.addToMany(OrderItem, orderId);
- addToMany.setName("orderItems");
- // greenDao不支援多對多的實作,但是我們可以 自定義實作多對多
- StudentTeacher.addToOne(Student, studentId);
- StudentTeacher.addToOne(Teacher, teacherId);
- Student.addToMany(StudentTeacher, studentId)
- .setName("studentsteachers");
- Teacher.addToMany(StudentTeacher, teacherId)
- .setName("studentsteachers");
- }
- }
二、Android工程中GreenDao的使用
首先需要導入對應的jar包。這個無需在詳細說明。下載下傳下來的例子裡面有。
1、Android工程中代碼生成的結構
1、DaoMaster,DaoSession的生成
這兩個檔案是最關鍵的兩個檔案,資料庫的生成和表的操作都在這兩個類裡面。如果沒有指定生成目錄,會和實體檔案一起生成在同一目錄裡面
2、實體類和對應Dao類的生成
這裡以OrderHeader實體來說明,詳情看代碼: [java] view plain copy
- package com.example.freedomsql.bean;
- import java.util.List;
- import com.example.freedomsql.bean.DaoSession;
- import de.greenrobot.dao.DaoException;
- // THIS CODE IS GENERATED BY greenDAO, EDIT ONLY INSIDE THE "KEEP"-SECTIONS
- // KEEP INCLUDES - put your custom includes here
- // KEEP INCLUDES END
- public class OrderHeader implements java.io.Serializable {
- private Long id;
- private String orderName;
- private transient DaoSession daoSession;
- private transient OrderHeaderDao myDao;
- private List<OrderItem> orderItems;
- // 如果設定了enableKeepSectionsByDefault();enableActiveEntitiesByDefault();這兩個屬性,那麼我們可以再指定的區域内寫入自定義代碼,友善下次更新的時候不會被覆寫掉
- // KEEP FIELDS - put your custom fields here
- // KEEP FIELDS END
- public OrderHeader() {
- }
- public OrderHeader(Long id) {
- this.id = id;
- }
- public OrderHeader(Long id, String orderName) {
- this.id = id;
- this.orderName = orderName;
- }
- public void __setDaoSession(DaoSession daoSession) {
- this.daoSession = daoSession;
- myDao = daoSession != null ? daoSession.getOrderHeaderDao() : null;
- }
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getOrderName() {
- return orderName;
- }
- public void setOrderName(String orderName) {
- this.orderName = orderName;
- }
- public List<OrderItem> getOrderItems() {
- if (orderItems == null) {
- if (daoSession == null) {
- throw new DaoException("Entity is detached from DAO context");
- }
- OrderItemDao targetDao = daoSession.getOrderItemDao();
- List<OrderItem> orderItemsNew = targetDao
- ._queryOrderHeader_OrderItems(id);
- synchronized (this) {
- if (orderItems == null) {
- orderItems = orderItemsNew;
- }
- }
- }
- return orderItems;
- }
- public synchronized void resetOrderItems() {
- orderItems = null;
- }
- public void delete() {
- if (myDao == null) {
- throw new DaoException("Entity is detached from DAO context");
- }
- myDao.delete(this);
- }
- public void update() {
- if (myDao == null) {
- throw new DaoException("Entity is detached from DAO context");
- }
- myDao.update(this);
- }
- public void refresh() {
- if (myDao == null) {
- throw new DaoException("Entity is detached from DAO context");
- }
- myDao.refresh(this);
- }
- // KEEP METHODS - put your custom methods here
- // KEEP METHODS END
- }
這裡需要特别注意的是,在使用getOrderItems()拿到自己1對多的實體内容的時候,一定要記得resetOrderItems一下,不然由于緩存機制,會拿不到最新的實體内容。我們可以看到剛剛在test類中設定的内容都出現了,而且和Orderitem的1對多關系也得到了展現。在資料庫操作的時候會變得非常的便捷 在看看Dao類 [java] view plain copy
- package com.example.freedomsql.bean;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteStatement;
- import de.greenrobot.dao.AbstractDao;
- import de.greenrobot.dao.Property;
- import de.greenrobot.dao.internal.DaoConfig;
- import com.example.freedomsql.bean.OrderHeader;
- // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
- public class OrderHeaderDao extends AbstractDao<OrderHeader, Long> {
- public static final String TABLENAME = "ORDER_HEADER";
- public static class Properties {
- public final static Property Id = new Property(0, Long.class, "id", true, "_id");
- public final static Property OrderName = new Property(1, String.class, "orderName", false, "ORDER_NAME");
- };
- private DaoSession daoSession;
- public OrderHeaderDao(DaoConfig config) {
- super(config);
- }
- public OrderHeaderDao(DaoConfig config, DaoSession daoSession) {
- super(config, daoSession);
- this.daoSession = daoSession;
- }
- public static void createTable(SQLiteDatabase db, boolean ifNotExists) {
- String constraint = ifNotExists? "IF NOT EXISTS ": "";
- db.execSQL("CREATE TABLE " + constraint + "'ORDER_HEADER' (" + //
- "'_id' INTEGER PRIMARY KEY ," + // 0: id
- "'ORDER_NAME' TEXT);"); // 1: orderName
- }
- public static void dropTable(SQLiteDatabase db, boolean ifExists) {
- String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "'ORDER_HEADER'";
- db.execSQL(sql);
- }
- @Override
- protected void bindValues(SQLiteStatement stmt, OrderHeader entity) {
- stmt.clearBindings();
- Long id = entity.getId();
- if (id != null) {
- stmt.bindLong(1, id);
- }
- String orderName = entity.getOrderName();
- if (orderName != null) {
- stmt.bindString(2, orderName);
- }
- }
- @Override
- protected void attachEntity(OrderHeader entity) {
- super.attachEntity(entity);
- entity.__setDaoSession(daoSession);
- }
- @Override
- public Long readKey(Cursor cursor, int offset) {
- return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
- }
- @Override
- public OrderHeader readEntity(Cursor cursor, int offset) {
- OrderHeader entity = new OrderHeader( //
- cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
- cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1) // orderName
- );
- return entity;
- }
- @Override
- public void readEntity(Cursor cursor, OrderHeader entity, int offset) {
- entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
- entity.setOrderName(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
- }
- @Override
- protected Long updateKeyAfterInsert(OrderHeader entity, long rowId) {
- entity.setId(rowId);
- return rowId;
- }
- @Override
- public Long getKey(OrderHeader entity) {
- if(entity != null) {
- return entity.getId();
- } else {
- return null;
- }
- }
- @Override
- protected boolean isEntityUpdateable() {
- return true;
- }
- }
我們可以看到對應的表生成語句和字段綁定等都在這個類裡面。其實這個類和之前哪篇檔案說的Dao類一樣,是操作資料庫用的。增删改查全部靠這個類來實行。
2、使用greenDao在項目中操作資料庫。
1、操作DaoMaster,DaoSession類編寫
之前說過,DaoMaster和DaoSession是非常關鍵的兩個類,是以我們需要單獨将他們兩個類獨立出來處理,建立一個GreenDao類來實作,詳情看代碼: [java] view plain copy
- package com.example.freedomsql.bean;
- import android.content.Context;
- import com.example.freedomsql.utils.Config;
- public class GreenDao {
- private static DaoMaster daoMaster;
- private static DaoSession daoSession;
- public static DaoMaster getDaoMaster(Context context) {
- if (daoMaster == null) {
- DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(context,
- Config.DB_NAME, null);
- daoMaster = new DaoMaster(helper.getWritableDatabase());
- }
- return daoMaster;
- }
- public static DaoSession getDaoSession(Context context) {
- if (daoSession == null) {
- if (daoMaster == null) {
- daoMaster = getDaoMaster(context);
- }
- daoSession = daoMaster.newSession();
- }
- return daoSession;
- }
- }
2、資料庫增删改查接口類編寫
在拿到兩個非常重要的類之後,接下來就是對資料庫操作的接口類的編寫。我們以OrderHeader和OrderItem類來舉例說明我們寫先接口 [java] view plain copy
- package com.example.freedomsql.service;
- import com.example.freedomsql.bean.OrderHeader;
- import com.example.freedomsql.bean.OrderItem;
- import com.example.freedomsql.bean.Student;
- import com.example.freedomsql.bean.Teacher;
- public interface IOrderHeaderService {
- public OrderHeader createOrder(OrderHeader order);
- public OrderHeader updateOrder(OrderHeader orderHeader);
- public OrderHeader findOrderByName(String orderName);
- public OrderHeader findOrderById(long orderId);
- public OrderItem findOrderItemById(long orderItemId);
- public OrderItem findOrderItemByName(String orderItemName);
- public OrderItem createOrderItem(OrderHeader orderHeader, String name);
- }
接下來寫實作類: [java] view plain copy
- package com.example.freedomsql.service.impl;
- import android.content.Context;
- import com.example.freedomsql.bean.DaoSession;
- import com.example.freedomsql.bean.GreenDao;
- import com.example.freedomsql.bean.OrderHeader;
- import com.example.freedomsql.bean.OrderHeaderDao;
- import com.example.freedomsql.bean.OrderItem;
- import com.example.freedomsql.bean.OrderItemDao;
- import com.example.freedomsql.service.IOrderHeaderService;
- public class OrderHeaderService implements IOrderHeaderService {
- private static DaoSession daoSession;
- private static OrderHeaderService service;
- private OrderHeaderDao orderHeaderDao;
- private OrderItemDao orderItemDao;
- private OrderHeaderService(OrderHeaderDao orderHeaderDao,
- OrderItemDao orderItemDao) {
- this.orderHeaderDao = orderHeaderDao;
- this.orderItemDao = orderItemDao;
- }
- public static OrderHeaderService getService(Context context) {
- if (service == null) {
- daoSession = GreenDao.getDaoSession(context);
- service = new OrderHeaderService(daoSession.getOrderHeaderDao(),
- daoSession.getOrderItemDao());
- }
- return service;
- }
- @Override
- public OrderHeader createOrder(OrderHeader order) {
- return orderHeaderDao.loadByRowId(orderHeaderDao.insert(order));
- }
- @Override
- public OrderHeader updateOrder(OrderHeader orderHeader) {
- orderHeaderDao.update(orderHeader);
- return orderHeader;
- }
- @Override
- public OrderHeader findOrderByName(String orderName) {
- OrderHeader orderHeader = orderHeaderDao.queryBuilder()
- .where(OrderHeaderDao.Properties.OrderName.eq(orderName))
- .unique();
- return orderHeader;
- }
- @Override
- public OrderHeader findOrderById(long orderId) {
- return orderHeaderDao.load(orderId);
- }
- @Override
- public OrderItem findOrderItemById(long orderItemId) {
- return orderItemDao.load(orderItemId);
- }
- @Override
- public OrderItem findOrderItemByName(String orderItemName) {
- return orderItemDao.queryBuilder()
- .where(OrderItemDao.Properties.ItemName.eq(orderItemName))
- .unique();
- }
- @Override
- public OrderItem createOrderItem(OrderHeader orderHeader, String name) {
- OrderItem orderItem = new OrderItem();
- orderItem.setItemName(name);
- orderItem.setOrderHeader(orderHeader);
- return orderItemDao.load(orderItemDao.insert(orderItem));
- }
- }
我們可以看到,查詢條件非常容易寫,這裡部落客隻寫了些簡單的查詢條件,在where方法中是可以支援多條件限制查詢的,查詢方法非常的強大。還支援延遲lazy查詢。但是使用延遲查詢的話要記得close()掉。我們可以将相關系的表檔案的Dao檔案寫到一起,便于查詢方法的編寫。這裡部落客沒有示範删除操作,其實也非常簡單,API在Dao類裡面,一看就懂的。
3、在主項目中的編寫
1、接口位置的放置 這些接口,我們肯定是要做成全局變量的,那麼,之前說過,全局變量的最好放置地方就是在Application中,參考代碼如下 [java] view plain copy
- package com.example.freedomsql;
- import android.app.Application;
- import com.example.freedomsql.service.IClassService;
- import com.example.freedomsql.service.IOrderHeaderService;
- import com.example.freedomsql.service.impl.ClassService;
- import com.example.freedomsql.service.impl.OrderHeaderService;
- public class FreedomApplication extends Application {
- public IClassService classService;
- public IOrderHeaderService orderHeaderService;
- @Override
- public void onCreate() {
- super.onCreate();
- classService = ClassService.getService(getApplicationContext());
- orderHeaderService = OrderHeaderService
- .getService(getApplicationContext());
- }
- }
2、主Activity的編寫 我們需要在這裡生成一些資料來觀察資料庫:(那些 注釋掉的東西是部落客後面用來更新資料庫使用的) [java] view plain copy
- package com.example.freedomsql;
- import android.app.Activity;
- import android.os.Bundle;
- import com.example.freedomsql.bean.OrderHeader;
- import com.example.freedomsql.bean.Student;
- import com.example.freedomsql.bean.StudentTeacher;
- import com.example.freedomsql.bean.Teacher;
- import com.example.freedomsql.service.IClassService;
- import com.example.freedomsql.service.IOrderHeaderService;
- public class MainActivity extends Activity {
- private IClassService classService;
- private IOrderHeaderService orderHeaderService;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- classService = ((FreedomApplication) getApplication()).classService;
- orderHeaderService = ((FreedomApplication) getApplication()).orderHeaderService;
- initGreenDaoDB();
- }
- private void initGreenDaoDB() {
- Teacher t1 = new Teacher();
- t1.setTeacherName("freedom");
- // t1.setTeacherName("freedom2");
- classService.createTeacher(t1);
- Teacher t2 = new Teacher();
- t2.setTeacherName("freedom1");
- // t2.setTeacherName("freedom3");
- Student t3 = new Student();
- t3.setStudentName("victor");
- // t3.setStudentName("victor2");
- Student t4 = new Student();
- t4.setStudentName("victor1");
- // t4.setStudentName("victor3");
- classService.createTeacher(t1);
- classService.createTeacher(t2);
- classService.createStudent(t3);
- classService.createStudent(t4);
- StudentTeacher st1 = new StudentTeacher(t1.getId(), t3.getId());
- StudentTeacher st2 = new StudentTeacher(t1.getId(), t4.getId());
- StudentTeacher st3 = new StudentTeacher(t2.getId(), t3.getId());
- StudentTeacher st4 = new StudentTeacher(t2.getId(), t4.getId());
- classService.createStudentTeacher(st1);
- classService.createStudentTeacher(st2);
- classService.createStudentTeacher(st3);
- classService.createStudentTeacher(st4);
- OrderHeader order = new OrderHeader();
- order.setOrderName("訂單1");
- // order.setOrderName("訂單3");
- OrderHeader order1 = new OrderHeader();
- order1.setOrderName("訂單2");
- // order1.setOrderName("訂單4");
- orderHeaderService.createOrder(order);
- orderHeaderService.createOrder(order1);
- orderHeaderService.createOrderItem(order1, "明細1");
- orderHeaderService.createOrderItem(order1, "明細2");
- // orderHeaderService.createOrderItem(order1, "明細3");
- // orderHeaderService.createOrderItem(order1, "明細4");
- }
- }
生成資料後如圖所示:這裡就隻上傳OrderHeader和OrderItem的圖
好了,greenDao的操作基本講解完畢,相信看了代碼的同學基本上學會了如何使用GreenDao,以及多表結構的設計。部落客這裡就不示範那些查詢方法了,都很簡單,通俗易懂。接下來部落客再講講再資料庫更新中,如何儲存原有資料。
3、使用GreenDao更新資料庫
1、TestCase類檔案修改
資料庫的更新,一般是在于字段的增加或者表的增加,這裡,部落客再一個實體中增加一個字段,又增加一個實體來示範 首先,增加資料庫版本号: [java] view plain copy
- private static int dbVersion = 2;
再在Student類中增加一個字段 [java] view plain copy
- // 增加一個字段,資料庫更新
- Student.addDoubleProperty("results");
增加一個實體Grade [java] view plain copy
- Entity Grade = schema.addEntity("Grade");
- Grade.implementsSerializable();
- Grade.addIdProperty();
- Grade.addStringProperty("gradeName");
2、DaoMaster類的修改,這裡我們隻需要重寫一下onUpgrade方法
[java] view plain copy
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- Log.i("greenDAO", "Upgrading schema from version " + oldVersion
- + " to " + newVersion + " by dropping all tables");
- //正常情況下,GreenDao預設更新的時候,将所有的表删除後再建,是以我們需要在這裡處理
- // dropAllTables(db, true);
- // onCreate(db);
- if (oldVersion == 1 && newVersion == 2) {
- // 增加一個實體表
- GradeDao.createTable(db, false);
- // 修改Student表
- db.execSQL("ALTER TABLE 'STUDENT' ADD 'RESULTS' REAL");
- }
- }
3、主Activity的修改,其他地方都不用修改了
對于主Activity,我們需要重新生成一些資料對比之前的資料即可 [java] view plain copy
- package com.example.freedomsql;
- import android.app.Activity;
- import android.os.Bundle;
- import com.example.freedomsql.bean.OrderHeader;
- import com.example.freedomsql.bean.Student;
- import com.example.freedomsql.bean.StudentTeacher;
- import com.example.freedomsql.bean.Teacher;
- import com.example.freedomsql.service.IClassService;
- import com.example.freedomsql.service.IOrderHeaderService;
- public class MainActivity extends Activity {
- private IClassService classService;
- private IOrderHeaderService orderHeaderService;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- classService = ((FreedomApplication) getApplication()).classService;
- orderHeaderService = ((FreedomApplication) getApplication()).orderHeaderService;
- initGreenDaoDB();
- }
- private void initGreenDaoDB() {
- Teacher t1 = new Teacher();
- // t1.setTeacherName("freedom");
- t1.setTeacherName("freedom2");
- classService.createTeacher(t1);
- Teacher t2 = new Teacher();
- // t2.setTeacherName("freedom1");
- t2.setTeacherName("freedom3");
- Student t3 = new Student();
- // t3.setStudentName("victor");
- t3.setStudentName("victor2");
- Student t4 = new Student();
- // t4.setStudentName("victor1");
- t4.setStudentName("victor3");
- classService.createTeacher(t1);
- classService.createTeacher(t2);
- classService.createStudent(t3);
- classService.createStudent(t4);
- StudentTeacher st1 = new StudentTeacher(t1.getId(), t3.getId());
- StudentTeacher st2 = new StudentTeacher(t1.getId(), t4.getId());
- StudentTeacher st3 = new StudentTeacher(t2.getId(), t3.getId());
- StudentTeacher st4 = new StudentTeacher(t2.getId(), t4.getId());
- classService.createStudentTeacher(st1);
- classService.createStudentTeacher(st2);
- classService.createStudentTeacher(st3);
- classService.createStudentTeacher(st4);
- OrderHeader order = new OrderHeader();
- // order.setOrderName("訂單1");
- order.setOrderName("訂單3");
- OrderHeader order1 = new OrderHeader();
- // order1.setOrderName("訂單2");
- order1.setOrderName("訂單4");
- orderHeaderService.createOrder(order);
- orderHeaderService.createOrder(order1);
- // orderHeaderService.createOrderItem(order1, "明細1");
- // orderHeaderService.createOrderItem(order1, "明細2");
- orderHeaderService.createOrderItem(order1, "明細3");
- orderHeaderService.createOrderItem(order1, "明細4");
- }
- }
我們來看看運作前後的資料庫Student表效果圖對比
我們可以看到新生的字段也在,之前的資料也在
在看看新生成的Grade表
我們可以看到GRADE表也成功的生成了。整個資料庫的資料都還保留着。