10分钟理解Android数据库的创建与使用(附详解和示例代码)

1.Android数据库简介.
Android系统的framework层集成了Sqlite3数据库,我们知道Sqlite3是一种轻量级的高效存储的数据库。
Sqlite数据库具有以下优点:
(1)零配置,无需安装和配置;
(2)储存在单一磁盘文件中的一个完整的数据库;
(3)数据库文件可以在不同字节顺序的机器间自由共享;
(4)支持数据大小至2TB;
(5)足够小,全部源代码大致3万行C代码,250KB;
(6)比目前流行的大多数数据库的操作要快;
(7)开源。

2.Sqlite 基本操作语句和重要概念

(1)创建数据库

创建数据库实际上并非通过SQL语句来创建,创建数据库可以通过sqlite3 新数据库名 来创建,比如创建一个名为school.db的数据库,在命令行下输入“sqlite3 school.db;”即可。

(2)创建表

创建表的SQL语法为:
create table 表名(字段1 数据约束类型,…,字段n 数据约束类型);
注意:每一条SQL语句都以分号结尾
Sqlite数据库支持的数据库类型大致分为5种,分别是:

NUll 数据值为空
INTEGER 整型
REAL 浮点型数据
TEXT 字符类型,使用数据库编码(UTF-8等)存放
BLOB 只是一个数据块,完全按照输入存放

注意:SQLite3数据库中任何列,除了整形主键列,可以用于存储任何一个存储列的值,SQLite没有单独的布尔存储类型,你可以使用INTEGER的0和1表示true和false,另外,SQLite也没有代表时间和日期的数据类型,可以转化为TEXT或者INTEGER来存储
常用的数据库约束包括以下几种:

PRIMARY KEY 主键 它是非空且唯一的
NOT NULL 非空
UNIQUE 唯一
FOREIGN KEY 外键
CHECK 条件检查
DEFAULT 字段的默认值

下面举例说明创建一个班级表,表中有3个字段,分别是自增的主键id、专业、年份。创建表的SQL语句如下图所示

创建表

(3)插入数据

SQL语句插入数据的关键字为insert,完整的格式如下图所示

插入数据

例如在classes表中插入一条数据,这里我只插入了一条数据中的2个字段,写法如下图

classes表中插入数据
注意:插入的这些数据在表中一定要有对应的字段,不然就会报错!

insert语句支持批量插入数据,比如我要把students表中的数据都导入表stu中,SQL语句为

insert into stu select * from students;

(4)查询语句
Select语句的通用格式如下:

查询语句标准格式

这段语句简单解释一下,columns是要查询的字段,tables表示从哪张表里面查询,where是查询过滤的条件,group by是指按照某个字段分组查询,order by是排序,limit是限制数量语句,下面我会一一解释每个语句需要注意的地方。

1.字段与表的别名
多表查询时查询条件相对复杂,表之间可能会产生相同的字段,这个时候字段前面可以加上表名以区分,别名就是我们可以将classes的表名设置为cls,将classes表中的major字段显示为cmj字段以简化SQL语句。

2.where条件过滤

where语句中常用的逻辑操作符有and、or、not,分别代表与、或、非。

注意where中有一个较为重要的关系操作符叫做like。它是模糊匹配。例如要找到students表中以t开头的所有学生,那么对应的SQL为:

select * from students where name like “t%”;

3.Group by 分组

    聚合中有一个重要的功能就是分组。分组就是将得到的结果集按照一定的规则划分为多个组。

由于该功能不常使用,想要了解的朋友自行查阅资料。

4.排序
select结果集的排序使用的是order by字句,排序有升序和降序两种,分别对应asc和desc,order by后面紧跟一个或者多个字段,多个字段间用逗号隔开。

5.数量限定
数量限定需要使用limit语句,数量限定的标准格式如下:

    limit 返回的数量 offset 偏移量

例如我们希望从students中索引为3的记录开始索引并且只返回一条语句,SQL如下:

select * from students limit 1 offset 2;

6.distinct去重

    distinct用于去除select语句中重复的行,它紧跟在select之后。

(5)update 语句

update 语句用于更新表中的数据,它的格式为:

update table set update_list where predicate;
    update_list是要修改的字段以及值,其实就是一个字段赋值语句,形式为:字段名 = 字段值,每个字段赋值语句通过逗号分隔开。后续我会在具体的示例代码中举例,在这就不过多阐述。

(6)delete语句
delete语句的格式如下:

//当满足where的条件时,删除表table中的数据,table是表名
delete from table where predicate;

(7)修改表

    我们知道,随着项目的演化,最初建立的表可能会面临修改的情况。修改表的SQL语句命令为alter。SQLite中的alter命令并没有实现标准SQL中的所有功能,**它只有修改表名和添加字段两个功能**,**删除字段等功能只能通过重新创建表来实现**。

alter的语法格式为:

alter table tableName {rename to newName | add column 新的字段};
    上述的语法表示alter table之后要操作先跟表名,然后rename to newName 和add column 新的字段两者2选1。rename to 是重命名,add column是添加新的字段。

(8)drop 命令

    drop命令用于删除物理存储介质。例如删除表、视图、索引、触发器等。drop的语法格式为:
drop {table | view |index |trigger} name;

(9)数据库事务的介绍

    事务是一个数据库操作的执行单元。它定义了一条或多条SQL语句,这些语句要么被全部执行,要么全部不执行,它保证了SQL语句的原子性。事务有begin、commit、rollback3个命令,begin表示开始一个事务,commit表示整个事务操作成功,rollback表示回滚到begin之前。格式为:
begin;
//SQL语句
[commit | rollback];

注意:事务提供了一种保证多条SQL语句能够被执行或者不执行,很大程度上保证了数据库操作的安全性。而在Android中使用事务,也会提升SQL的执行效率。

    事务的运用简单举个例子,张三给李四转账400元,银行的数据库中张三的存款金额要减400,李四的存款金额要加400,我们要保证张三扣钱的通过李四收到钱,这个时候就需要用到数据库事务,要么两条SQL语句同时成功,要么同时失败。

(10)Android中封装的数据库帮助接口

    我们知道Android的SQLite数据库是由C和C++实现,因此Android在FrameWork层封装了一层Java接口,使得开发人员能够更方便的操作数据库。主要的类型为SQLiteOpenHelper、SQLiteDatabase以及Cusor,不管如何封装,本质上都是通过构建SQL语句并且提交到SQLite中执行。下面详细介绍,Android中创建数据库创建表的所有方法。

3.使用Android的接口创建和操作数据库

一般来说,在Android中创建数据库只需要以下几步:

(1)创建一个Java类继承SQLiteOpenHelper
(2)实现SQLiteOpenHelper的onCreate和onUpdate方法以及构造方法。
(3)通过构造方法创建数据库,需要传入数据库的名称,Context和数据库的版本号。
(4)在onCreate中完成创建表和字段的操作,onUpdate中完成升级操作
(5)通过帮助类的openOrCreateDatabase()方法或者getReadableDatabase()或者getWriteableDatabase()获取到数据库完成数据的操作。

下面附上我的写的一个示例代码,其中封装了判断数据库是否存在某个表,是否存在某个字段的方法

数据库的帮助类,完成了创建数据库,创建表

package com.geocompass.gisdatacollection.database;

import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;

import com.geocompass.gisdatacollection.CollectionApplication;

import java.io.File;

/**
 * Created by liuxu on 2017/4/7.
 * 数据库的操作的帮助类
 */

public class ComplexDatabaseSqlHelper extends SQLiteOpenHelper {
    private static final String TAG = "ComplexDatabaseSqlHelper";
    //数据库的版本号
    private static final int DB_VERSION = 1;

    public SQLiteDatabase getDb() {
        return db;
    }

    private SQLiteDatabase db;
    //数据库db文件的路径,由调用者传入
    private static String mDBPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "giscoll.db";

    private static ComplexDatabaseSqlHelper mDBSqlHelper;

    public ComplexDatabaseSqlHelper(Context context, String DBpath) {
        super(context, DBpath, null, DB_VERSION);
        mDBPath = DBpath;
        if (db == null) {
            db = SQLiteDatabase.openOrCreateDatabase(DBpath, null);
        }
        onCreate(db);
    }

    public ComplexDatabaseSqlHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public ComplexDatabaseSqlHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_POINT = "create table tab_point ("
                + "id integer primary key autoincrement,"
                + "lon double, "
                + "lat double, "
                + "type integer) ";
        String CREATE_INTERSECTION = "create table tab_intersection ("
                + "inter_id integer primary key autoincrement,"
                + "interLon double, "
                + "interLat double, "
                + "interRouteID text) ";
        String CREATE_ROUTE = "create table tab_route ("
                + "route_name text,"
                + "startPointID integer, "
                + "endPointID integer, "
                + "geometryID text, "
                + "Geometry text) ";
        ;
        //如果不存在该表,则创建该表
        if (!tableIsExist("tab_point")) {
            db.execSQL(CREATE_POINT);
        }
        if (!tableIsExist("tab_intersection")) {
            db.execSQL(CREATE_INTERSECTION);
        }
        if (!tableIsExist("tab_route")) {
            db.execSQL(CREATE_ROUTE);
        }

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    /**
     * 获取数据库的帮助类
     *
     * @return
     */
    public static ComplexDatabaseSqlHelper getDBSqlHelper() {
        if (mDBSqlHelper == null) {
            synchronized (ComplexDatabaseSqlHelper.class) {
                if (mDBSqlHelper == null) {
                    mDBSqlHelper = new ComplexDatabaseSqlHelper(CollectionApplication.getmContext(), mDBPath);
                }
            }
        }
        return mDBSqlHelper;
    }

    /**
     * 根据sql查询数据库的方法
     *
     * @param sql
     * @return
     */
    public Cursor query(String sql) {
        return db.rawQuery(sql, null);
    }

    /**
     * 执行Sql语句
     *
     * @param sql
     */
    public void execSQL(String sql) {
        db.execSQL(sql);
    }

    /**
     * 判断表格是否存在
     *
     * @param tableName
     * @return
     */
    public boolean tableIsExist(String tableName) {
        boolean result = false;
        if (tableName == null) {
            return false;
        }
        Cursor cursor = null;
        try {
            //db = SQLiteDatabase.openDatabase(this.mDBPath,null,SQLiteDatabase.OPEN_READONLY);
            String sql = "select count(*) as c from Sqlite_master where type ='table' and name ='" + tableName.trim() + "' ";
            cursor = db.rawQuery(sql, null);
            if (cursor.moveToNext()) {
                int count = cursor.getInt(0);
                if (count > 0) {
                    result = true;
                }
            }
            cursor.close();
        } catch (Exception e) {
            // TODO: handle exception
            result = false;
        }
        return result;
    }

    /**
     * 判断表中是否包含某个字段
     *
     * @param tableName
     * @param columnName
     * @return
     */
    public boolean columnIsExistsInTable(String tableName, String columnName) {
        boolean result = false;
        Cursor cursor = null;
        try {
            //  db = SQLiteDatabase.openDatabase(this.mDBPath, null, SQLiteDatabase.OPEN_READONLY);
            cursor = db.rawQuery("select * from sqlite_master where name = ? and sql like ?"
                    , new String[]{tableName, "%" + columnName + "%"});
            result = null != cursor && cursor.moveToFirst();
        } catch (Exception ignored) {

        } finally {
            if (null != cursor && !cursor.isClosed()) {
                cursor.close();
            }
        }
        return result;
    }

    private void open() {
        if (db != null && !db.isOpen())
            db = SQLiteDatabase.openOrCreateDatabase(mDBPath, null);
    }
}

数据库的操作类,完成了对数据库表中数据的插入和查询

package com.geocompass.gisdatacollection.database.manage;

import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

import com.geocompass.gisdatacollection.model.Intersection;
import com.geocompass.gisdatacollection.model.Point;
import com.geocompass.gisdatacollection.model.Route;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by liuxu on 2017/4/10.
 * 封装了对数据库表的增删改查方法
 */

public class ComplexDBDao {
    private SQLiteDatabase db;
    public ComplexDBDao(SQLiteDatabase db) {
        this.db = db;
    }

    /**
     * 插入一个点到tab_point表
     * @param point
     * @return
     */
    public boolean insert(Point point){
        String INSERT_POINT = "INSERT INTO tab_point(lon,lat,type) VALUES (" + point.lon + "," + point.lat + "," + point.point_type + ")";
        try{
            db.execSQL(INSERT_POINT);
        }catch(SQLException e){
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 插入一个节点到tab_intersection表中
     * @param intersection
     * @return
     */
    public boolean insert(Intersection intersection){
        String INSERT_INTERSECTION = "insert into tab_intersection(interLon,interLat,interRouteID) values ("+intersection.interLon+","+intersection.interLat+",'"+
                intersection.inter_route_id+"')";
        try{
            db.execSQL(INSERT_INTERSECTION);
        }catch(SQLException e){
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 插入一条Route到tab_route表中
     * @param route
     * @return
     */
    public boolean insert(Route route){
        String  INSERT_ROUTE = "insert into tab_route (route_name,startPointID,endPointID,geometryID,Geometry) values('"+route.route_name+
                "',"+route.startPointID+","+route.endPointID+",'"+route.geometryID+"','"+route.Geometry+"')";
        try{
            db.execSQL(INSERT_ROUTE);
        }catch(SQLException e){
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 查询出数据库中所有的Points
     * @return
     */
    public List<Point> findAllTabPoint(){
        String sql_select = "select * from tab_point order by id";
        //请补充sql执行语句
        Cursor cursor = db.rawQuery(sql_select,null);
        int IDIndex = cursor.getColumnIndex("id");
        int lonIndex = cursor.getColumnIndex("lon");
        int latIndex = cursor.getColumnIndex("lat");
        int typeIndex = cursor.getColumnIndex("type");
        List<Point> list = new ArrayList<>();
        while (cursor.moveToNext()) {
            Point point = new Point();
            point.id = cursor.getInt(IDIndex);
            point.lon = cursor.getDouble(lonIndex);
            point.lat = cursor.getDouble(latIndex);
            point.point_type = cursor.getInt(typeIndex);
            list.add(point);
        }
        return list;
    }

    /**
     * 查询出数据库中所有的Intersection
     * @return
     */
    public List<Intersection> findAllTabIntersection(){
        String sql_select = "select * from tab_intersection order by inter_id";
        //请补充sql执行语句
        Cursor cursor = db.rawQuery(sql_select,null);
        int interIdIndex = cursor.getColumnIndex("inter_id");
        int interLonIndex = cursor.getColumnIndex("interLon");
        int interLatIndex = cursor.getColumnIndex("interLat");
        int interRouteIDIndex = cursor.getColumnIndex("interRouteID");
        List<Intersection> list = new ArrayList<>();
        while (cursor.moveToNext()) {
            Intersection intersection = new Intersection();
            intersection.inter_id = cursor.getInt(interIdIndex);
            intersection.interLon = cursor.getDouble(interLonIndex);
            intersection.interLat = cursor.getDouble(interLatIndex);
            intersection.inter_route_id = cursor.getString(interRouteIDIndex);
            list.add(intersection);
        }
        return list;
    }

    /**
     * 查询出数据库中所有的Route
     * @return
     */
    public List<Route> findAllTabRoute(){
        String sql_select = "select * from tab_route ";
        //请补充sql执行语句
        Cursor cursor = db.rawQuery(sql_select,null);
        int routeNameIndex = cursor.getColumnIndex("route_name");
        int startPointIDIndex = cursor.getColumnIndex("startPointID");
        int endPointIDIndex = cursor.getColumnIndex("endPointID");
        int geometryIDIndex = cursor.getColumnIndex("geometryID");
        int geometryIndex = cursor.getColumnIndex("Geometry");
        List<Route> list = new ArrayList<>();
        while (cursor.moveToNext()) {
            Route route = new Route();
            route.route_name = cursor.getString(routeNameIndex);
            route.startPointID = cursor.getInt(startPointIDIndex);
            route.endPointID = cursor.getInt(endPointIDIndex);
            route.geometryID = cursor.getString(geometryIDIndex);
            route.Geometry = cursor.getString(geometryIndex);
            list.add(route);
        }
        return list;
    }
}

这些知识都是数据库的基础知识,当然复杂的知识也是在基础知识的基础上拼接起来的,先学好了基础才能谈复杂项目中多个表多个字段数据库的运用!我很喜欢的一句话,不积跬步无以至千里,一直陪伴着我的学习和工作!
不足之处请指正,谢谢!

已标记关键词 清除标记
相关推荐
<p><span style="font-size: 24px; background-color: #e53333; color: #ffffff;"><strong>课程目标</strong></span></p> <p> </p> <p><span style="font-size: 18px;">从零开始掌握Premiere影视剪辑基础知识,学会</span><span style="font-size: 18px; color: #e53333;"><span style="color: #e53333;"><strong>视频剪辑+影视特效+视频调色+字幕制作</strong></span></span></p> <p> </p> <p><span style="font-size: 24px; background-color: #e53333; color: #ffffff;">适用人群</span></p> <p> </p> <p><span style="font-size: 18px;">PR零基础小白,在校大学生,职场新人,想成为影视剪辑、影视后期、短视频制作、自媒体等高手朋友。</span></p> <p> </p> <p><span style="font-size: 24px; background-color: #e53333; color: #ffffff;">课程简介</span></p> <p> </p> <p><span style="font-size: 18px;">课程以新版PR 2020讲解,可使用PR任意版本学习,绝大多数功能兼容旧版,但强烈建议使用新版本。</span></p> <p><span style="font-size: 18px;">【Adobe认证专家讲师精耕细作精品教程,非学院派照本宣科软件操作教程,以任务为导向,面向实际应用场景,每一章都能学会实打实高手技能,讲解细致,小白也能轻松入门成大神!】</span></p> <p><span style="font-size: 18px;">课程好不好,看过就知道,前面免费章节欢迎试看。</span></p> <p><span style="font-size: 18px;">本课程学习不需要任何PR基础,只需要电脑操作基础即可。兼容WindowsMac操作系统,同时讲解两种系统下快捷键操作,不用担心操作障碍问题。</span></p> <p> </p> <p><span style="font-size: 24px; background-color: #e53333; color: #ffffff;">课程特色</span></p> <p> </p> <p><span style="font-size: 18px;">1、以实际PR影视编辑特效流程为导向,绝大多数内容都是为了完成某个具体任务,而不是为了讲解某个软件操作而凑数。</span></p> <p><span style="font-size: 18px;">2、不同于国内多数教程书籍,每个知识点务求讲精、讲透,帮助你掌握PR精髓,而非软件操作皮毛,让你真正学到PR本质,一次学习,终身受用,少走弯路,节约生命。</span></p> <p><span style="font-size: 18px;">3、课程会随PR新版本推出持续更新,不必担心有新功能却不知道怎么用。</span></p> <p><span style="font-size: 18px;">4、充足练习题作业题,让你在不断练习挑战中提升PR技能。</span></p> <div> <p> </p> <p><img src="https://img-bss.csdnimg.cn/202009230003497469.png" alt="" width="880" height="2635" /><img src="https://img-bss.csdnimg.cn/202009230004006917.png" alt="" width="880" height="2635" /><img src="https://img-bss.csdnimg.cn/202009230004102289.png" alt="" width="880" height="2635" /><img src="https://img-bss.csdnimg.cn/202009230004197845.png" alt="" width="880" height="1445" /></p> </div>
<p>本套课程适用于有一定<span style="color: #e03e2d;">iOS、Android、Flutter</span>开发基础。</p> <p>学完本次课程,能够让大家对Flutter如何调用移动端原生页面有一个清晰认识;在纯Flutter开发过程中遇到需要调用原生功能时候,能够快速定制属于自己或者公司私有插件- Plugin。</p> <p>课程一共氛围两部分:</p> <p>1、Flutter插件跟iOS交互部分:包括调用iOS原生页面、如何使用iOS<span style="color: #e03e2d;">framework二进制</span>、<span style="color: #e03e2d;">bundle资源文件</span>、依赖cocoapods资源;</p> <p>2、Flutter插件跟安卓交互部分:包括调用Android原生页面、如何接收原生页面回调、如何使用aar文件、依赖其他资源。</p> <p>最终能够帮助大家定制私有插件;提升工作技能。</p> <p><span style="color: #e03e2d;">备注:课程中使用环境</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #2fb41d;">[✓]</span><span style="font-variant-ligatures: no-common-ligatures;"> Flutter (Channel stable, 1.22.5, on macOS 11.0.1 20B29 darwin-arm, locale zh-Hans-CN)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9); min-height: 14px;"><span style="font-variant-ligatures: no-common-ligatures;"> </span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #9fa01c;">[!]</span><span style="font-variant-ligatures: no-common-ligatures;"> Android toolchain - develop for Android devices (Android SDK version 30.0.3)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #00ff00; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures;">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #9fa01c;">!</span><span style="font-variant-ligatures: no-common-ligatures;"> Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #2fb41d;">[✓]</span><span style="font-variant-ligatures: no-common-ligatures;"> Xcode - develop for iOS and macOS (Xcode 12.2)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #9fa01c;">[!]</span><span style="font-variant-ligatures: no-common-ligatures;"> Android Studio (version 4.1)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #2fb41d;">[✓]</span><span style="font-variant-ligatures: no-common-ligatures;"> IntelliJ IDEA Community Edition (version 2020.3)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"><span style="font-variant-ligatures: no-common-ligatures; color: #2fb41d;">[✓]</span><span style="font-variant-ligatures: no-common-ligatures;"> Connected device (1 available)</span></p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9); min-height: 14px;"> </p> <p style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: 'Andale Mono'; color: #2fff12; background-color: rgba(0, 0, 0, 0.9);"> </p>
<p> <strong><span style="font-size:18px;">课程目标</span></strong> </p> <p> <span style="font-size:18px;">从零开始掌握PS基础知识,学会抠图修图调色合成制作特效,涵盖平面设计淘宝美工照片修复网页设计UI</span> </p> <p> <strong><span style="font-size:18px;">适用人群</span></strong> </p> <p> <span style="font-size:18px;">PS零基础小白,在校大学生,职场新人,想从事平面设计、摄影后期、电商设计、UI设计、自媒体工作人</span> </p> <p> <strong><span style="font-size:18px;">课程简介</span></strong> </p> <p> <span style="color:#666666;font-size:18px;">课程以新版PS CC 2020讲解,可使用PS CC任意版本学习,绝大多数功能兼容旧版,但建议使用新版。</span><br /> <span style="color:#666666;font-size:18px;">【Adobe认证专家讲师精耕细作精品教程,非学院派照本宣科软件操作教程,以任务为导向,面向实际应用场景,每一章都能学会实打实高手技能,讲解细致,小白也能轻松入门】</span><br /> <span style="color:#666666;font-size:18px;">课程好不好,看过就知道,前面免费章节欢迎试看。</span><br /> <span style="color:#666666;font-size:18px;">本课程学习不需要任何PS基础,只需要电脑操作基础即可。兼容WindowsMac操作系统,同时讲解两种系统下快捷键操作,不用担心操作障碍问题。</span><br /> <span style="color:#666666;font-size:18px;"><strong>课程特色:</strong></span><br /> <span style="color:#666666;font-size:18px;">1、以实际PS图像编辑合成流程为导向,绝大多数内容都是为了完成某个具体任务,而不是为了讲解某个软件操作而凑数。</span><br /> <span style="color:#666666;font-size:18px;">2、不同于国内多数教程书籍,每个知识点务求讲精、讲透,帮助你掌握PS精髓,而非软件操作皮毛,让你真正学到PS本质,一次学习,终身受用,少走弯路,节约生命。</span><br /> <span style="color:#666666;font-size:18px;">3、课程会随PS新版本推出持续更新,不必担心有新功能却不知道怎么用。</span><br /> <span style="color:#666666;font-size:18px;">4、充足练习题作业题,让你在不断练习挑战中提升PS技能。</span> </p> <p> <img src="https://img-bss.csdnimg.cn/202007270604434777.jpg" alt="" /><img src="https://img-bss.csdnimg.cn/202007270606519854.png" alt="" /><img src="https://img-bss.csdnimg.cn/202007270607061438.jpg" alt="" /><img src="https://img-bss.csdnimg.cn/202007270607183610.jpg" alt="" /><img src="https://img-bss.csdnimg.cn/202007270607312915.jpg" alt="" /><img src="https://img-bss.csdnimg.cn/202007270607393129.jpg" alt="" /><img src="https://img-bss.csdnimg.cn/202007270607483175.jpg" alt="" /><img src="https://img-bss.csdnimg.cn/202007270607551373.jpg" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
<p> <span style="color:#E53333;font-size:24px;"><strong>主要内容</strong></span> </p> <p> 掌握MyBatis常用配置,MyBatisMapper映射文件编写,包含select, update, insertdelete,MyBatis映射文件 </p> 之parameters@Param注解,MyBatis映射文件resultMap使用,MyBatis映射之association(一对一)配置使用,<br /> MyBatis映射之collection(一对多)配置使用,MyBatis映射之associationcollection复杂使用(一对一一对多同时使用<br /> ),MyBatis动态SQL之if,choose, when, otherwise,where,set,foreach,分页查询,主键回填,日志配置等技术;掌握<br /> SpringMVC项目整合配置,@Controller,@RequestMapping,@Resource,@PathVariable,@ResponseBody,<br /> @ModelAttribute,@CookieValue,@Transactional等注解使用,json数据传值,国际化,拦截器,权限控制,生成日志,文<br /> 件上传下载,日期格式转换等。<br /> <br /> <span style="font-size:24px;color:#E53333;"><strong>开发技术:</strong></span>java,jsp,mysql,MyBatis,jquery,ajax,json,springmvc<br /> <span style="font-size:24px;color:#E53333;"><strong>运行环境</strong>:</span>jdk1.7及以上版本,tomcat7.0及以上版本,mysql5.5及以上版本<br /> <p> <span style="font-size:24px;color:#E53333;"><strong>开发工具: </strong></span>本项目开发工具是Eclipse,也支持myEclipse,Intellij Idea等其他版本开发工具 </p> <p> <span style="font-size:24px;color:#E53333;"><strong>适用人群:</strong></span> </p> <p> 零基础开始讲解MyBatis,SpringMVC,通过项目实战达到精通各种技术能力,包括权限控制 </p> <div> <br /> </div> <br /> <br />
<p> <img src="https://img-bss.csdn.net/201909231423115500.png" alt="" /> </p> <p> <img src="https://img-bss.csdn.net/201909231423337403.png" alt="" /> </p> <p> <img src="https://img-bss.csdn.net/201909231423434581.png" alt="" /> </p> <p> <img src="https://img-bss.csdn.net/201909231424065321.png" alt="" /><img src="https://img-bss.csdn.net/201909231424244483.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <div style="color:#444444;"> 适用人群 <p style="color:#666666;"> Java开发人员,Vue开发人员,前后端分离开发人员,权限管理配置开发人员 </p> </div> <div style="color:#444444;"> 课程概述 <div style="color:#666666;"> 【讲师介绍】<br />       现某知名大型互联网公司资深架构师,技术总监,职业规划师,首席面试官,曾在某上市培训机构,高校任教多年。<br />      Array(Array老师)10多年互联网公司实战经验,知名大型互联网公司架构师,高管等职,在企业长期从事于技术源码阅读新技术研究;擅长于职业规划,面试辅导,从事面试官多年 <br /> 技术选型<br /> 开发环境:Eclipse/Idea ,JDK 1.8以上 <br /> 后端技术<br /> 核心框架:SpringBoot2.x框架系列(同样适用Springcloud F版本以后版本),如下(节选):    <br /> 持久层框架:MyBatis 3.x + Mybatis-plus 3.x<br /> 日志管理:SLF4J 1.7 + Log4j2 2.7<br /> 工具类:Apache Commons、Jackson 、fastjson、Gson<br /> 权限验证<br /> 前端技术  <br /> Vue  <br /> Vue-cli<br /> ElementUI ---https://element.eleme.io/<br /> JSX (JavaScript Xml)<br /> 前台权限验证路由设置<br /> 开发模式  <br />      前后端分离开发<br /> 数据库 <br />       Mysql5<br /> IDE<br />     Intellij Idea<br /> 【课程收益】<br /> 学完课程能独立完成springboot2+vue+elementUI整合项目开发(前后端分离) <br /> 学完课程能Shiro权限控制,按钮级别权限控制 <br /> 学完课程能独立后端开发独立前端开发Vue <br /> 学完课程能快速掌握目前互联网用前沿框架技术实战 </div> </div>
<p style="word-break: break-all; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #666666; font-family: Verdana, 'Microsoft YaHei', 宋体; font-size: 14px; background-color: #ffffff;"><strong style="word-break: break-all;">本课程为Django第六季课程:</strong>后台管理项目实战, 本项目主要实现基本学生管理,包含主要知识点有:virtualenv虚拟环境、pip下载包、多app项目开发、templates模板继承、font-awesome图标使用、原生SQL语句数据库交互、ORM模型数据库交互、LayUI页面布局、jQuery实现用户交互、Ajax异步请求、页面块状展示数据、表格展示数据、表格分页、数据增改删改、Layer弹出层使用、表单验证等等知识点。</p> <p style="word-break: break-all; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #666666; font-family: Verdana, 'Microsoft YaHei', 宋体; font-size: 14px; background-color: #ffffff;"> </p> <p style="word-break: break-all; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #666666; font-family: Verdana, 'Microsoft YaHei', 宋体; font-size: 14px; background-color: #ffffff;">本案例完整演示了项目实现过程,虽然不复杂,但涉及内容非常多,特别是前后端交互时候,有诸多坑等着你去踩,好在王老师全程代码呈现,带着大家一起填坑,大大提高学习效率同时,也培养了大家良好代码习惯,希望大家一致跟着王老师学习Python开发。</p> <p style="word-break: break-all; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #666666; font-family: Verdana, 'Microsoft YaHei', 宋体; font-size: 14px; background-color: #ffffff;"> </p> <p style="word-break: break-all; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #666666; font-family: Verdana, 'Microsoft YaHei', 宋体; font-size: 14px; background-color: #ffffff;"> </p> <p style="word-break: break-all; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #666666; font-family: Verdana, 'Microsoft YaHei', 宋体; font-size: 14px; background-color: #ffffff;"> </p> <p style="word-break: break-all; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #666666; font-family: Verdana, 'Microsoft YaHei', 宋体; font-size: 14px; background-color: #ffffff;"><span style="word-break: break-all;"><span style="word-break: break-all; color: #ff0000;"><strong style="word-break: break-all;">课程目标:</strong></span><br style="word-break: break-all;" /><span style="word-break: break-all;">本系列课程是从零基础开始并深入讲解Django,最终学会使用Django框架开发企业级项目。课程知识点详细,项目实战贴近企业需求。本系列课程除了非常详细讲解Django框架本身知识点以外,还讲解了web开发中所需要用到技术,学完本系列课程后,您将独立做出一个具有后台管理系统,并且前端非常优美实用网站。对于从事一份Python Web开发相关工作简直轻而易举。</span></span></p> <p style="word-break: break-all; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #666666; font-family: Verdana, 'Microsoft YaHei', 宋体; font-size: 14px; background-color: #ffffff;"> </p> <p style="word-break: break-all; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #666666; font-family: Verdana, 'Microsoft YaHei', 宋体; font-size: 14px; background-color: #ffffff;"> </p> <p style="word-break: break-all; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #666666; font-family: Verdana, 'Microsoft YaHei', 宋体; font-size: 14px; background-color: #ffffff;"><span style="word-break: break-all;"><span style="word-break: break-all;"><img src="https://img-bss.csdnimg.cn/202102061554519299.png" alt="" /></span></span></p>
<p class="MsoNormal"> <span style="font-family:'微软雅黑',sans-serif;">YOLO</span><span style="font-family:'微软雅黑',sans-serif;">系列是基于深度学习端到端实时目标检测方法。 <span>PyTorch</span>版<span>YOLOv5</span>轻量而性能高,更加灵活便利。</span><span style="font-family:微软雅黑, sans-serif;"> </span> </p> <p class="MsoNormal"> <span style="font-family:'微软雅黑',sans-serif;">本课程将手把手地教大家使用<span>labelImg</span>标注使用<span>YOLOv5</span>训练自己数据集。课程实战分为两个项目:单目标检测(足球目标检测)多目标检测(足球梅西同时检测)。</span><span style="font-family:微软雅黑, sans-serif;"> </span> </p> <p class="MsoNormal"> <span style="font-family:'微软雅黑',sans-serif;">本课程<span>YOLOv5</span>使用<span>ultralytics/yolov5</span>,在<span style="color:#e03e2d;"><strong><span>Windows</span></strong></span>系统上做项目演示。包括:安装<span>YOLOv5</span>、标注自己数据集、准备自己数据集、修改配置文件、训练自己数据集、测试训练出网络模型性能统计。</span><span style="font-family:微软雅黑, sans-serif;"> </span> </p> <p class="MsoNormal"> <span style="font-family:微软雅黑, sans-serif;">希望学习Ubuntu上演示同学,请前往 </span><span style="font-family:微软雅黑, sans-serif;">《</span><span style="font-family:微软雅黑, sans-serif;">YOLOv5(PyTorch)</span><span style="font-family:微软雅黑, sans-serif;">实战:训练自己数据集(Ubuntu)》课程链接:https://edu.csdn.net/course/detail/30793</span><span style="font-family:宋体;"><span style="font-size:14px;"> </span></span> </p> <p style="margin-left:0cm;">   </p> <p style="margin-left:0cm;"> 本人推出了有关YOLOv5目标检测系列课程。请持续关注该系列其它视频课程,包括: </p> <p> 《YOLOv5(PyTorch)目标检测实战:训练自己数据集》 </p> <p> Ubuntu系统 <strong><a href="https://edu.csdn.net/course/detail/30793"><span style="color:#7c79e5;">https://edu.csdn.net/course/detail/30793</span></a></strong> </p> <p> Windows系统 <strong><a href="https://edu.csdn.net/course/detail/30923"><span style="color:#7c79e5;">https://edu.csdn.net/course/detail/30923</span></a></strong> </p> <p> 《YOLOv5(PyTorch)目标检测:原理源码解析》<strong><a href="https://edu.csdn.net/course/detail/31428"><span style="color:#7c79e5;">https://edu.csdn.net/course/detail/31428</span></a></strong> </p> <p> 《YOLOv5(PyTorch)目标检测实战:Flask Web部署》<strong><a href="https://edu.csdn.net/course/detail/31087"><span style="color:#7c79e5;">https://edu.csdn.net/course/detail/31087</span></a></strong> </p> <p> 《YOLOv5(PyTorch)目标检测实战:TensorRT加速部署》<strong><a href="https://edu.csdn.net/course/detail/32303"><span style="color:#7c79e5;">https://edu.csdn.net/course/detail/32303</span></a></strong> </p> <p> <img src="https://img-bss.csdnimg.cn/202010090636458614.jpg" alt="课程内容" width="880" height="356" /> </p> <p> <img src="https://img-bss.csdnimg.cn/202010090637068681.jpg" alt="技巧" width="880" height="706" /> </p> <p> <img src="https://img-bss.csdnimg.cn/202010090637267536.jpg" alt="功能" width="880" height="913" /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页