Spring Boot 2.x基礎教程:Spring Data JPA的多數據源配置

上一篇我們介紹了在使用JdbcTemplate來做數據訪問時候的多數據源配置實現。接下來我們繼續學習如何在使用Spring Data JPA的時候,完成多數據源的配置和使用。

添加多數據源的配置

先在Spring Boot的配置文件application.properties中設置兩個你要鏈接的數據庫配置,比如這樣:

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

# 日誌打印執行的SQL
spring.jpa.show-sql=true
# Hibernate的DDL策略
spring.jpa.hibernate.ddl-auto=create-drop

這裏除了JPA自身相關的配置之外,與JdbcTemplate配置時候的數據源配置完全是一致的

說明與注意

  1. 多數據源配置的時候,與單數據源不同點在於spring.datasource之後多設置一個數據源名稱primarysecondary來區分不同的數據源配置,這個前綴將在後續初始化數據源的時候用到。
  2. 數據源連接配置2.x和1.x的配置項是有區別的:2.x使用spring.datasource.secondary.jdbc-url,而1.x版本使用spring.datasource.secondary.url。如果你在配置的時候發生了這個報錯java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.,那麼就是這個配置項的問題。

初始化數據源與JPA配置

完成多數據源的配置信息之後,就來創建個配置類來加載這些配置信息,初始化數據源,以及初始化每個數據源要用的JdbcTemplate。

由於JPA的配置要比JdbcTemplate的負責很多,所以我們將配置拆分一下來處理:

  1. 單獨建一個多數據源的配置類,比如下面這樣:
@Configuration
public class DataSourceConfiguration {

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

}

可以看到內容跟JdbcTemplate時候是一模一樣的。通過@ConfigurationProperties可以知道這兩個數據源分別加載了spring.datasource.primary.*spring.datasource.secondary.*的配置。@Primary註解指定了主數據源,就是當我們不特別指定哪個數據源的時候,就會使用這個Bean真正差異部分在下面的JPA配置上。

  1. 分別創建兩個數據源的JPA配置。

Primary數據源的JPA配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerFactoryPrimary",
        transactionManagerRef="transactionManagerPrimary",
        basePackages= { "com.didispace.chapter38.p" }) //設置Repository所在位置
public class PrimaryConfig {

    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;

    @Autowired
    private JpaProperties jpaProperties;
    @Autowired
    private HibernateProperties hibernateProperties;

    private Map<String, Object> getVendorProperties() {
        return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
    }

    @Primary
    @Bean(name = "entityManagerPrimary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
    }

    @Primary
    @Bean(name = "entityManagerFactoryPrimary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(primaryDataSource)
                .packages("com.didispace.chapter38.p") //設置實體類所在位置
                .persistenceUnit("primaryPersistenceUnit")
                .properties(getVendorProperties())
                .build();
    }

    @Primary
    @Bean(name = "transactionManagerPrimary")
    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
    }

}

Secondary數據源的JPA配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerFactorySecondary",
        transactionManagerRef="transactionManagerSecondary",
        basePackages= { "com.didispace.chapter38.s" }) //設置Repository所在位置
public class SecondaryConfig {

    @Autowired
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;

    @Autowired
    private JpaProperties jpaProperties;
    @Autowired
    private HibernateProperties hibernateProperties;

    private Map<String, Object> getVendorProperties() {
        return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
    }

    @Bean(name = "entityManagerSecondary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactorySecondary(builder).getObject().createEntityManager();
    }

    @Bean(name = "entityManagerFactorySecondary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(secondaryDataSource)
                .packages("com.didispace.chapter38.s") //設置實體類所在位置
                .persistenceUnit("secondaryPersistenceUnit")
                .properties(getVendorProperties())
                .build();
    }

    @Bean(name = "transactionManagerSecondary")
    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
    }

}

說明與注意

  • 在使用JPA的時候,需要為不同的數據源創建不同的package來存放對應的Entity和Repository,以便於配置類的分區掃描
  • 類名上的註解@EnableJpaRepositories中指定Repository的所在位置
  • LocalContainerEntityManagerFactoryBean創建的時候,指定Entity所在的位置
  • 其他主要注意在互相注入時候,不同數據源不同配置的命名,基本就沒有什麼大問題了

測試一下

完成了上面之後,我們就可以寫個測試類來嘗試一下上面的多數據源配置是否正確了,比如下面這樣:

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter38ApplicationTests {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private MessageRepository messageRepository;

    @Test
    public void test() throws Exception {
        userRepository.save(new User("aaa", 10));
        userRepository.save(new User("bbb", 20));
        userRepository.save(new User("ccc", 30));
        userRepository.save(new User("ddd", 40));
        userRepository.save(new User("eee", 50));

        Assert.assertEquals(5, userRepository.findAll().size());

        messageRepository.save(new Message("o1", "aaaaaaaaaa"));
        messageRepository.save(new Message("o2", "bbbbbbbbbb"));
        messageRepository.save(new Message("o3", "cccccccccc"));

        Assert.assertEquals(3, messageRepository.findAll().size());
    }

}

說明與注意

  • 測試驗證的邏輯很簡單,就是通過不同的Repository往不同的數據源插入數據,然後查詢一下總數是否是對的
  • 這裏省略了Entity和Repository的細節,讀者可以在下方代碼示例中下載完整例子對照查看

代碼示例

本文的相關例子可以查看下面倉庫中的chapter3-8目錄:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

如果您覺得本文不錯,歡迎Star支持,您的關注是我堅持的動力!

相關閱讀

  • Spring Boot 1.x基礎教程:多數據源配置

本文首發:Spring Boot 2.x基礎教程:Spring Data JPA的多數據源配置,轉載請註明出處。
歡迎關注我的公眾號:程序猿DD,獲得獨家整理的學習資源和日常乾貨推送。
如果您對我的其他專題內容感興趣,直達我的個人博客:didispace.com。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

新北清潔公司,居家、辦公、裝潢細清專業服務

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

手把手教你基於SqlSugar4編寫一個可視化代碼生成器(生成實體,以SqlServer為例,文末附源碼)

  在開發過程中免不了創建實體類,字段少的表可以手動編寫,但是字段多還用手動創建的話不免有些浪費時間,假如一張表有100多個字段,手寫有些不現實。

這時我們會藉助一些工具,如:動軟代碼生成器、各種ORM框架自帶的代碼生成器等等,都可以使用。

我們現在就基於SqlSugar(ORM框架)自己動手製造一個輪子,以SqlServer為例。我們先看一下成品效果,

 

使用流程:

  配置好數據庫鏈接,點擊【鏈接數據庫】獲取指定服務器上的數據庫名,點擊數據庫名,動態獲取數據庫下面的所有表,

點擊數據表,如果生成過了的會自動獲取生成的實體,如果沒有生成過,點擊【生成實體】自動生成显示,直接複製即可使用。

注:server=xxx.xxx.x.xxx這裏如果是本地沒有配置的話直接server=.即可。

 

 

 

 

開發環境:

編譯器:Visual Studio 2017

運行環境:windows7 x64

數據庫:SqlServer2012

 

代碼實現步驟:

一、創建一個ASP.NET Web應用,命名為GenerateEntity

 

 

 

 

 

 

二、應用SqlSugar動態鏈接庫

 

 

 

三、編寫代碼

這裏分為前端和後端,前端頁面展示,後端後台邏輯(注:由於我們是代碼展示,所以就不搞三層架構、工廠模式這些,直接在控制器中完成,有需要的同學可以根據項目需求進行更改

內部實現邏輯:

  • 在頁面上配置數據庫鏈接,點擊【鏈接數據庫】按鈕獲取指定數據庫的所有數據庫名显示在左邊;
  • 點擊左邊的數據庫名稱,動態獲取指定數據庫下面所有的表显示出來;
  • 點擊表名,生成過的就显示生成的實體,沒有的則點擊【生成實體】按鈕生成(支持生成單表和數據庫表全部生成);

這裏我直接貼出代碼,直接拷貝即可使用:

前端html頁面

@{
    ViewBag.Title = "Home Page";
}

<script src="~/Scripts/jquery-3.3.1.js"></script>

<div style="margin-top:10px;font-family:'Microsoft YaHei';font-size:18px; ">
    <div style="height:100px;width:100%;border:1px solid gray;padding:10px">
        <div>
            <span>鏈接數據庫:</span>
            <input style="width:800px;max-width:800px;" id="Link" value="server=xxx.xxx.x.xxx;uid=sa;pwd=xxx" />
            <a href="javascript:void(0)" onclick="LinkServer()">鏈接數據庫</a>
        </div>
        <div style="margin-top:10px">
            <span>數據庫名:</span>
            <input style="color:red;font-weight:600" id="ServerName" />

            <span>表名:</span>
            <input style="color:red;font-weight:600" id="TableName" />

            <span>生成類型:</span>
            <select id="type">
                <option value="0">生成單個表</option>
                <option value="1">生成所有表</option>
            </select>
            <a  href="javascript:void(0)" onclick="GenerateEntity()" style="margin-left:20px;font-weight:600;">生成實體</a>
            <br />

        </div>
    </div>
    <div style="height:720px;width:100%;">
        <div style="height:100%;width:40%;float:left; border:1px solid gray;font-size:20px">

            <div id="leftserver" style="float:left;border:1px solid gray;height:100%;width:40%;padding:10px;overflow: auto;">

            </div>
            <div id="lefttable" style="float:left;border:1px solid gray;height:100%;width:60%;padding:10px;overflow: auto;">

            </div>
        </div>
        <div  style="height:100%;width:60%;float:left;border:1px solid gray;overflow: auto;">
            <textarea style="width:100%;height:100%;max-width:10000px" id="righttable"></textarea>
        </div>
    </div>
</div>

<script type="text/javascript">

    //鏈接數據庫
    function LinkServer() {
        $.ajax({
            url: "/Home/LinkServer",
            data: { Link: $("#Link").val() },
            type: "POST",
            async: false,
            dataType: "json",
            success: function (data) {
                if (data.res) {
                    if (data.info != "") {
                        $("#leftserver").html("");
                        var leftserver = "<span>數據庫名</span><hr />";
                        var info = eval("(" + data.info + ")");
                        for (var i = 0; i < info.length; i++) {
                            leftserver += "<a onclick=\"leftserver('" + info[i].Name + "')\">" + info[i].Name + "</a><br />";
                        }

                        $("#leftserver").html(leftserver);
                    }
                }
                else {
                    alert(data.msg);
                }
            }
        });
    }

    //查詢指定數據庫的表
    function leftserver(Name) {
        $("#ServerName").val(Name)
        $.ajax({
            url: "/Home/GetTable",
            data: { Link: $("#Link").val(), Name: Name },
            type: "POST",
            async: false,
            dataType: "json",
            success: function (data) {
                if (data.res) {
                    if (data.info != "") {
                        $("#lefttable").html("");
                        var lefttable = "<span>表名</span><hr />";
                        var info = eval("(" + data.info + ")");
                        for (var i = 0; i < info.length; i++) {
                            lefttable += "<a onclick=\"lefttable('" + info[i].Name + "')\">" + info[i].Name + "</a><br />";
                        }

                        $("#lefttable").html(lefttable);
                    }
                }
                else {
                    alert(data.msg);
                }
            }
        });
    }

    //查詢指定數據庫的表
    function lefttable(Name) {
        $("#TableName").val(Name);
        $.ajax({
            url: "/Home/GetGenerateEntity",
            data: { TableName: Name },
            type: "POST",
            async: false,
            dataType: "json",
            success: function (data) {
                if (data.res) {
                    document.getElementById("righttable").innerHTML = data.info;
                }
                else {
                    alert(data.msg);
                }
            }
        });
    }

    //生成實體
    function GenerateEntity() {

        $.ajax({
            url: "/Home/GenerateEntity",
            data: {
                Link: $("#Link").val(),
                Name: $("#ServerName").val(),
                TableName: $("#TableName").val(),
                type: $("#type").val()
            },
            type: "POST",
            async: false,
            dataType: "json",
            success: function (data) {
                if (data.res) {
                    document.getElementById("righttable").innerHTML = data.info;
                }
                else {
                    alert(data.msg);
                }
            }
        });
    }

</script>

 

後端控制器數據

using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace GenerateEntity.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }


     
        //鏈接數據庫
        public JsonResult LinkServer(string Link)
        {
            ResultInfo result = new ResultInfo();
            try
            {
                //配置數據庫連接
                SqlSugarClient db = new SqlSugarClient(
                                    new ConnectionConfig()
                                    {
                                        ConnectionString = ""+ Link + ";database=master",
                                        DbType = DbType.SqlServer,//設置數據庫類型
                                    IsAutoCloseConnection = true,//自動釋放數據務,如果存在事務,在事務結束后釋放
                                    InitKeyType = InitKeyType.Attribute //從實體特性中讀取主鍵自增列信息
                                });
                string sql = @"SELECT top 100000 Name FROM Master..SysDatabases ORDER BY Name";  //查詢所有鏈接的所有數據庫名
                var strList = db.SqlQueryable<databaseName>(sql).ToList();
                result.info = Newtonsoft.Json.JsonConvert.SerializeObject(strList);
                result.res = true;
                result.msg = "鏈接成功!";
            }
            catch (Exception ex)
            {
                result.msg = ex.Message;
            }

            return Json(result, JsonRequestBehavior.AllowGet);
        }

        //根據數據庫名查詢所有表
        public JsonResult GetTable(string Link,string Name)
        {

            ResultInfo result = new ResultInfo();
            try
            {
                //配置數據庫連接
                SqlSugarClient db = new SqlSugarClient(
                                    new ConnectionConfig()
                                    {
                                        ConnectionString = "" + Link + ";database="+ Name + "",
                                        DbType = DbType.SqlServer,//設置數據庫類型
                                        IsAutoCloseConnection = true,//自動釋放數據務,如果存在事務,在事務結束后釋放
                                        InitKeyType = InitKeyType.Attribute //從實體特性中讀取主鍵自增列信息
                                    });

                string sql = @"SELECT top 10000 Name FROM SYSOBJECTS WHERE TYPE='U' ORDER BY Name";  //查詢所有鏈接的所有數據庫名
                var strList = db.SqlQueryable<databaseName>(sql).ToList();
                result.info = Newtonsoft.Json.JsonConvert.SerializeObject(strList);
                result.res = true;
                result.msg = "查詢成功!";
            }
            catch (Exception ex)
            {
                result.msg = ex.Message;
            }

            return Json(result, JsonRequestBehavior.AllowGet);
        }

        //生成實體
        public JsonResult GenerateEntity(string Link, string Name,string TableName,string type)
        {

            ResultInfo result = new ResultInfo();
            try
            {
                //配置數據庫連接
                SqlSugarClient db = new SqlSugarClient(
                                    new ConnectionConfig()
                                    {
                                        ConnectionString = "" + Link + ";database=" + Name + "",
                                        DbType = DbType.SqlServer,//設置數據庫類型
                                        IsAutoCloseConnection = true,//自動釋放數據務,如果存在事務,在事務結束后釋放
                                        InitKeyType = InitKeyType.Attribute //從實體特性中讀取主鍵自增列信息
                                    });

                string path = "C:\\Demo\\2";

                if (type == "0")
                {
                    path = "C:\\Demo\\2";
                    db.DbFirst.Where(TableName).CreateClassFile(path);
                    result.info = System.IO.File.ReadAllText(@"" + path + "\\" + TableName + ".cs" + "", Encoding.UTF8);
                }
                else if (type == "1")
                {
                    path = "C:\\Demo\\3";
                    db.DbFirst.IsCreateAttribute().CreateClassFile(path);
                    result.info = "";
                }

                
                
                result.res = true;
                result.msg = "生成成功!";
            }
            catch (Exception ex)
            {
                result.msg = ex.Message;
            }

            return Json(result, JsonRequestBehavior.AllowGet);
        }

        //生成全部表時查看
        public JsonResult GetGenerateEntity(string TableName)
        {

            ResultInfo result = new ResultInfo();
            try
            {
                string path = "C:\\Demo\\3";
                result.info = System.IO.File.ReadAllText(@"" + path + "\\" + TableName + ".cs" + "", Encoding.UTF8);
                result.res = true;
                result.msg = "查詢成功!";
            }
            catch (Exception ex)
            {
                result.msg = ex.Message;
                try
                {
                    if (result.msg.Contains("未能找到文件"))
                    {
                       string path = "C:\\Demo\\2";
                        result.info = System.IO.File.ReadAllText(@"" + path + "\\" + TableName + ".cs" + "", Encoding.UTF8);
                        result.res = true;
                        result.msg = "查詢成功!";
                    }
                }
                catch (Exception)
                {
                    result.msg = ex.Message;
                }
            }

            return Json(result, JsonRequestBehavior.AllowGet);
        }

        //數據庫名
        public class databaseName
        {
            public string Name { get; set; }
        }

        //封裝返回信息數據
        public class ResultInfo
        {
            public ResultInfo()
            {
                res = false;
                startcode = 449;
                info = "";
            }
            public bool res { get; set; }  //返回狀態(true or false)
            public string msg { get; set; }  //返回信息
            public int startcode { get; set; }  //返回http的狀態碼
            public string info { get; set; }  //返回的結果(res為true時返回結果集,res為false時返回錯誤提示)
        }

    }
}

 

 

 

這樣一套可視化代碼生成器就出來了,我們把他發布到IIS上面,然後設置為瀏覽器標籤(收藏),這樣就可以快捷使用了。

我們運行一下看看,是不是感覺很方便呀!

 

 

 

歡迎關注訂閱我的微信公眾平台【熊澤有話說】,更多好玩易學知識等你來取
作者:熊澤-學習中的苦與樂
公眾號:熊澤有話說
出處: https://www.cnblogs.com/xiongze520/p/13181241.html
創作不易,版權歸作者和博客園共有,轉載或者部分轉載、摘錄,請在文章明顯位置註明作者和原文鏈接。  

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

新北清潔公司,居家、辦公、裝潢細清專業服務

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

程序員如何高效學Python,如何高效用Python掙錢

    本人在1年半之前,不熟悉Python(不過有若干年Java開發基礎),由於公司要用Python,所以學習了一通。現在除了能用Python做本職工作外,還出了本Python書,《基於股票大數據分析的Python入門實戰 視頻教學版》,京東鏈接:https://item.jd.com/69241653952.html,還在某網站錄製了視頻課,後面還有其它線上線下課的機會。

    

    本人的感受是,哪怕上班用不到Python,程序員也應該學Python,因為Python能給大家帶來更多的主業副業機會,而且現在做Python的人還沒Java多。在本文里將結合本人的經驗,一方面分享下如何高效學Python,另一方面分享下用Python掙錢的經驗。

1 先說Python的尷尬地位,首先要明確掙錢方式

    尷尬體現在哪裡?一些大廠雖然有專門做Python的高薪崗位,但一般會直接找些深度學習機器學習方向的碩士博士,而且是要名校的,而小公司一般限於成本的原因,無法直接設置單做Python的崗位,而且也就是做些技術含量較低的應用, 比如做個爬蟲或者簡單調個機器學習的庫,所以一般是讓做其它語言的人順帶做掉。

    而且Python用庫和方法的形式包裝掉了一些很複雜的算法,程序員一般只需要調用方法就可以實現基本的機器學習和深度學習之類的活,而在大廠里高薪的Python崗,絕非是簡單地調用Python,而是需要深入了解算法,從而根據業務定製模型,所以一般社會上的程序員很難通過自學,達到大廠里高薪Python程序員的標準。

    總之,你在工作后通過自學Python,未必能達到大廠高薪職位的標準,因為由於你數學基礎不行,未必能深入算法,而一般公司也不會單獨開設Python崗位,所以對應地,學Python之前大家應該明確靠Python的掙錢方式。

    1 主業上,還得以Java等語言為主,但如果你能在簡歷和面試中證明自己很精通一般的Python爬蟲、數據分析和機器學習等方面的應用,絕對能幫你更好地找到工作,並且個人提升也會很快。

    2 雖然Python底層包含的深度學習等方面的算法很難,但用Python做案例並不難,大家可以通過Python做些副業的活。

2 再說Python該怎麼學,該學哪些技能?

    第一步,了解Python的基本語法,比如集合,讀寫文件,讀寫數據庫和異常處理等,如果大家有Java等語言的開發基礎,這塊很簡單,本人也就用了2個星期。但正是因為簡單,所以這些技能很不值錢,別人學起來也快。

    第二步,了解數據分析三劍客,具體來說就是Numpy, Pandas和matplotlib,用Numpy和Pandas清洗數據,用Pandas的DataFrame存儲數據,再用matplotlib繪製柱狀圖餅圖之類的圖形。

    第三步,了解爬蟲技能,這裏除了需要了解自帶的urllib庫之外,還需要了解一種框架,比如Scrapy,需要到能根據需求定製爬蟲代碼的程序。

    其實數據分析和爬蟲相關的語法技能,也不複雜,本人用1個半月也就達到能幹活的程度了,相信大家應該更快。而且,學到這種程序,應該就可以去做些案例以此掙錢了,比如寫分析xx網站的案例,錄成視頻去賣了,而且也能完成公司里大多數數據獲取和數據分析的功能需求了。

    第四步去了解機器學習庫,具體而言就去學習sklearn庫,這個庫里不僅包含了線性回歸嶺回歸和SVM分類等機器學習算法,還包含了波士頓房價、鳶尾花和手寫體識別等的數據集,而且由於已經包裝了相關算法,用sklearn庫學習機器學習的過程並不難,不需要過多的數學知識。學好這個庫,外帶結合爬蟲和數據分析的技能,就更在某個領域幹活掙錢了,比如本人在股票分析領域出了本書,並且也出了些視頻,後繼還可以繼續深入股票量化分析領域。

    第五步,可以去了解深度學習,無非是人工神經網絡,自然語言分析,圖像識別等,這方面雖然包含的數學知識更複雜,但由於也經過包裝,所以直接用接口也不難。這方面學好以後,雖然說高不成低不就,即沒法進大廠,同時小公司也用不到,但用這些知識準備些案例,出書講課錄視頻,甚至做企業培訓,還是能帶來一定的收益的。

    在學上述知識的時候,千萬不能只學語法,因為沒用,一定得結合實例,同時把這些知識變現的時候,也不能單講語法,也是要準備若干案例,比如像我這樣的股票分析,或者是scrapy+數據分析+深度學習的xx網站數據分析案例,這些技能雖然很高大上,但其實做到調用接口實踐案例的程度就能掙錢,如果再有機緣以此進入大廠,那就真的前途無量了。

3 可以先從公眾號做起

    之前講的是如何學,學什麼,這裏就開始講如何掙錢。當然最簡單的就是建個公眾號,在上面發文,吸引粉絲,這個門檻相對低。

    但注意如果僅僅發表入門級的文章,比如numpy庫怎麼用,怎麼用matplotlib庫繪製基本圖形,這絕對不夠,因為此類文章太多,哪些文章能吸引人?

    1 綜合應用類,比如scrapy+數據分析三劍客。

    2 實戰案例類,比如用scrapy爬個網站數據,然後分析。

    3 專業領域類,比如量化分析股票,分析房價等。

    4 深度學習機器學習這些領域現在還很火,這些領域如果把某個算法通俗易懂地講透也行,或者這些方面給寫案例,比如用自然語言分析技術分析某網站的評論等。

    如果能定期發表此類文章,公眾號一定能聚集到不少粉絲,同樣也可以做視頻的up主。

4 更可以出本屬於你的書

    如何讓別人認為你是python某個領域的大牛?要麼有大廠架構師職位加持,這不是每個人都能達到,或者是著名博主公眾號主,但似乎這也需要經歷來積澱,不過如果你在python數據分析和機器學習等方面出本書,那說服力自然就上來了。

    出書可以偏重案例,比如講爬蟲數據分析的書,在合法的前提下給出爬取分析若干知名網頁的案例,如果講機器學習的書,甚至可以結合sklearn庫自帶的數據集,講清楚常用算法的案例應用,如果有時間有機會,我甚至打算再出版本基於python股票量化的書。

    相對而言,寫一本講述包括語法、結合小案例講(機器學習等)庫的用法和結合綜合案例講機器學習算法和數據分析綜合應用的書,並不難。對於一個有5年開發經驗的程序員而言,從零基礎積累個半年,就完全可以達到出書的地步,如果資歷稍微弱些,只有2,3年開發經歷,估計學個1年也應該可以達到出書的地步。

    還是這句話,出書掙的錢不多,但絕對能證明你在python某個領域的能力,小到聯繫副業,大到以此找工作,一定能幫到你。具體操作的話,可以直接在清華出版社,机械工業出版社,人民郵電出版社和电子工業出版社的官網找聯繫方式,然後直接和編輯溝通,至於一些有中介性質的圖書公司,大家自己看着辦。

5 也可以做其它副業

    包括到各大視頻網站去錄製數據分析、爬蟲、機器學習和深度學習等方面的系列課,也可以找你所在城市的線下培訓班去講課,如果你有相關大公司背景,有自己的書,或者業內知名,你就可以聯繫些做企業培訓的公司。這樣做下個半年後,月入1萬應該不是問題。

    在做各種副業的時候,一般來說也是要偏重案例,比如你有若干個深度學習的案例外帶相關算法的說明,再加上些好的文案,應該很能吸引人。當然也可以直接找項目做,目前python方面比較熱門的項目可能還是用爬蟲,但這塊做的時候就要非常慎重了,不能做違法的事情,而當前用到深度學習機器學習技術的項目倒不多,可能因為這些應用更集中在大公司吧。

6 總結:下班后不能總放鬆,更得找點事干

    說實話,python方面的活,哪怕門檻最低的做公眾號,要做好也不簡單,更何況出書了。至於,自己聯繫平台出視頻,或者做線下培訓或者做項目,就不僅得靠技術,更得靠人脈了,經營這類活需要的時間更多。

    不過掙錢拿有容易的,況且,如果下班后總是看手機或者混日子,可能一天天就很快過去了,與其下班做些沒收益的消遣,還不如學些python幹些活,這樣多少好歹也有收益,或者指不定無心插柳柳成蔭,你經營python一段時間后,或者真就以此進了大廠,或者也通過各種途徑成為業內知名人事,拓展了不少副業渠道,也算是不負好時光吧。

    感謝大家看完此文,如果感覺有一定道理,請點贊此文。如果要轉載,也請全文轉載,別刪節本人辛苦寫成的文章。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

特斯拉今年或沿京滬高速布局充電設施

據阿思達克財經報導,特斯拉產品專家表示,特斯拉預計第二或者第三季度在上海開店,同時,特斯拉在中國的充電設施首先會沿著京滬高速布局,只是具體布局時間暫不確定。

上述人士表示,特斯拉(Tesla)中國客戶現在訂車,將於今年年底拿到車。上海客戶屆時則可以直接在上海提車,不需要自己出錢把車從北京提到上海。另外,特斯拉客戶可以用自己的燃油車車牌置換,或者參與上海市拍牌。

據介紹,特斯拉在中國大陸目前有6輛,北京店有3輛上牌車,還有3輛試駕車。

針對客戶關心的充電問題,該產品專家表示,客戶購買特斯拉的車價裡面已經包含了充電樁費用,消費者不會再另外花錢購買充電樁,隻需要再支付從物業拉電到車位的材料、人工等費用。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

2014第三屆混合動力汽車技術高峰會議

展會主題:
時間:2014年06月26日 至 2014年06月27日
地點:Sheraton Shanghai Hongqiao Hotel
主辦單位:Merisis Consulting

會議背景介紹:

在中國日益嚴重的環境污染壓力和“霧霾”陰影籠罩下,混合動力及純電動汽車的發展形成了勢在必行的趨勢。即使《節能與新能源汽車產業發展規劃》以及四部委聯合發佈的《關於繼續開展新能源汽車推廣應用工作的通知》中明確了純電動以及插電式混合動力汽車的補貼政策,第二批新能源汽車試點運行城市也出臺在即,但新能源汽車產業的前景仍然未能明朗化,標準不統一,基礎建設不健全,電池技術受到局限的電動車以及補貼政策不明確的混合動力汽車都面臨各自發展的瓶頸。在全球並未形成一種成熟應用模式的狀況下,中國應該走出怎樣的一條有自我特色的路線圖。

上海麥瑞賽公司舉辦的混合動力技術峰會將在2014年走入第三個年頭,今年的活動將以“技術驅動混合動力汽車市場化”為主題,探討更多整車廠以及關鍵零部件廠商們共同關注的電池、動力總成、變速箱等關鍵技術,也會融合更多探索純電動車,燃料電池汽車及混合動力汽車未來政策趨勢,商業模式以及標準推進方面的資訊。

我們希望本次峰會可以幫助更多業界同仁通過會議的一手資訊更好的判斷行業未來走向,並且在交換前沿及最新技術,展示領先產品的同時,汲取海外整車廠以及頂尖廠商的經驗,推動整車廠們對純電動及混合動力汽車的研發和市場化的進展。也説明技術/材料/產品提供商們展示自身最新研發和技術成果,並在此平臺上找到與整車商項目以及需求的契合點,獲得在中國本土市場上更多的推廣機會和品牌知名度。

關鍵議題:

  • 如何降低新能源汽車成本並提高市場接受度
  • 技術轉化成產業化,依靠企業還是政策
  • 未來HEV的補貼政策出臺的大致時間表
  • 不同整車廠在底盤系統及變速箱方面的新技術進展
  • 整車集成 / 電機集成的項目方案和合作資源,找到適合自身的合作夥伴
  • 探討近年鋰電池安全事故頻發,如何增加安全性。其他電池安全評估現狀如何
  • PHEV的現有技術的最新進展
  • 如何像特拉斯一樣從根本上顛覆傳統汽車設計

 

部分已確認演講嘉賓:

孟凡一    秘書長    中國機電產品進出口商會汽車分會
張銅柱    高級工程師    中國汽車技術研究中心
劉彥龍    副秘書長    中國化學與物理電源行業協會
鄧先泉    新能源汽車研究所所長    深圳市五洲龍汽車有限公司
Phil Barker    合動力及電動車輛產品總工程師    蓮花汽車科技工程公司
梁春奇    總工程師    長城汽車研究院  底盤研究院院長
徐嚴冬    總工程師    上海電驅動股份有限公司

欲瞭解更多詳情,請登錄官網:

聯繫方式:

聯繫電話:021-61808505*212
手 機:15900722272
傳 真:021-61808511
郵 件:
聯 系 人:萬小姐
網 址:

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

新技術如何驅動混合動力汽車市場化-第三屆混合動力汽車技術峰會

在中國日益嚴重的環境污染壓力和“霧霾”陰影籠罩下,混合動力及純電動汽車的發展形成了勢在必行的趨勢。即使《節能與新能源汽車產業發展規劃》以及四部委聯合發佈的《關於繼續開展新能源汽車推廣應用工作的通知》中明確了純電動以及插電式混合動力汽車的補貼政策,第二批新能源汽車試點運行城市也出臺在即,但新能源汽車產業的前景仍然未能明朗化,標準不統一,基礎建設不健全,電池技術受到局限的電動車以及補貼政策不明確的混合動力汽車都面臨各自發展的瓶頸。在全球並未形成一種成熟應用模式的狀況下,中國應該走出怎樣的一條有自我特色的路線圖。

目前,全球能源和環境系統面臨巨大的挑戰,汽車作為石油消耗和二氧化碳排放的大戶,需要進行革命性的變革。目前全球新能源汽車發展已經形成了共識,從長期來看,包括純電動、燃料電池技術在內的純電驅動將是新能源汽車的主要技術方向,在短期內,油電混合、插電式混合動力將是重要的過渡路線。目前來看,全球新能源汽車的發展還面臨著一些共同的難題,例如關鍵技術的突破、汽車工業的轉型、基礎設施的建設以及消費者的接受度等。

為了提升中國混合動力汽車技術發展,幫助整車廠獲得一手的技術和市場訊息,第三屆混合動力汽車技術峰會茲定於2014年6月26日至27日,在虹橋喜來登上海太平洋大飯店舉行,主題為“技術驅動混合動力汽車市場化”。

市場方面,中國汽車技術研究中心的高級工程師張銅柱將在此次會議上對電動汽車分標委工作及標準最新制修訂情況做相關發言,介紹工作組成立背景、工作組籌備情況、成員構成、工作內容及工作計畫等。中國化學與物理電源行業協會副秘書長劉彥龍將會就新能源汽車用動力電池市場需求發表演講,深度分析目前國內外鋰電池的發展處於一個什麼狀態,決定鋰電池未來應用之路的關鍵是什麼。中國機電產品進出口商會汽車分會秘書長孟凡一將會對中國汽車進出口情況進行回顧及展望,並分析在全球經濟活動較弱以及國際貿易保護主義抬頭的態勢下,2014年國際汽車市場的總體形勢和客觀上嚴重影響我國汽車出口行業的諸多不確定因素。

技術方面,精進電動創始人兼CTO蔡蔚將會對汽車電動化的動力總成與動力總成的電機系統做相關介紹,講述他觀點中混合動力汽車長期存在的基礎,動力總成的拓撲結構,混合動力變速箱的分析與比較,以及動力總成對電機系統要求與電機系同的開發及產業化。上海電驅動股份有限公司技術中心主任徐延東將結合領先的Demo project解析混合動力電機控制器集成裝置及其技術解決方案。其他技術題目還包括底盤,控制器軟硬體,逆變器,插電式混合動力,增程式混合動力汽車以及超級電容等領域的領先技術。

歷屆混合動力汽車技術峰會得到了發改委能源研究所、中國汽車工業協會專家委員會、上海汽車工程學會、中國汽車技術研究中心、中國電源產業創新聯盟、上海交通大學汽車工程研究院、汽車安全與節能國家重點實驗室、中國北方車輛研究所動力電池實驗室等組織的大力支持。

更多詳情請聯繫第三屆混合動力汽車技術峰會組委會
朱小姐電話:+86 21 61808505*212
郵箱:

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

豐田、本田或於明年量產並銷售燃料電池車

行駛時不會排放二氧化碳的燃料電池車(FCV)在日本一直受到企業與政府的推崇與支持。FCV目前以租賃販售為主,但自2015年起,FCV將開始針對一般消費者、企業進行販售,可望進一步加快普及。

據日經新聞26日報導,本田汽車(Honda)將在2015年11月透過狹山工廠開始生產FCV,並將在2015年內於日美歐進行販售,年產量預估為1,000台、售價預估將壓在1,000萬日圓以下。

本田所將生產的FCV為5人座車款,且充飽一次燃料所能行駛的距離可達約500km、為現行電動車(EV)的2倍水準。

除了本田之外,豐田(Toyota)也將透過本社工廠生產FCV,年產量將同樣為1,000台、也同樣將在2015年內於日美歐開賣,且之後並計劃於2020年將年產量擴增至數萬台的規模。

豐田預計在2015年開賣的FCV售價將壓在1,000萬日圓以下,且之後並計劃於2020年代將售價壓低至300-500萬日圓的水準。

燃料電池車研發「三國鼎立」格局

豐田汽車於2013年1月宣布將攜手德國車廠BMW研發燃料電池車。

雷諾-日產聯盟(The Renault-Nissan Alliance)也於2013年1月宣布將攜手德國戴姆勒(Daimler)、美國福特汽車(Ford)研發燃料電池(FC)系統,以藉此大幅刪減投資成本,目標為在2017年開賣全球首款經濟實惠的量產款FCV。

另外,本田也於2013年7月宣布,將與美國汽車大廠通用汽車(General Motors;GM)攜手研發燃料電池車(FCV),而本田預計在2015年開賣的FCV就可能使用GM的技術。

日本政府補助建造燃料站

據華爾街日報去年12月26日的報導,日本政府宣布,2014年4月起的會計年度,將撥款72億日圓,補助建造氫燃料站;同時也將挹注64億日圓研發如何降低燃料電池的製造成本。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

特斯拉向企業客戶推出電動車租賃計劃 以提振需求

特斯拉(Tesla)於8日推出面向企業客戶的S型豪華跑車租賃計劃,以爭取更多的美國國內客戶。消費者可分期支付車款,在租期截止後可選擇支付餘款並擁有汽車,也可選擇將汽車歸還。有意願者在網上僅需5分鐘就可提交一份租賃申請。

此舉正逢S型豪華跑車在美國的銷量開始放慢增長。今年第一季度,S型車在美國市場售出4700輛,比去年同期僅增長1%。特斯拉公司表示,相比去年向個人客戶推出的一種功能相當於租賃計劃的推銷模式,面向中小企業的租賃計劃更為直接透明,租賃費可在企業納稅時扣抵。

S型全電動跑車是特斯拉的主打產品,去年登上美國最暢銷豪華車榜單。但市場分析人士認為,美國消費者對該系列汽車的興趣開始消退,需求進入穩定階段,因此開拓國際市場對特斯拉來說尤為重要。他們預計,中國消費者早期的強勁需求可能是提升S型車銷量的最大因素。

特斯拉電池工廠計畫面臨危機

另外,特斯拉早前宣佈將耗資數十億美元建造全球最大的電池工廠,以求大幅降低電動車成本,幫助特斯拉進入中端市場。不過,特斯拉新聞發言人西恩曾表示,特斯拉電動車電池的兩項重要原料資源,現在均面臨缺乏危機。

石墨是特斯拉電動車電池最重要的原料之一,特斯拉目前使用的石墨原料絕大部分來自日本和歐洲市場,且都是化學合成石墨,而並非天然開採的石墨。美國稀有金屬諮詢分析公司Technology Metal預計,未來需要新增6個石墨礦才能夠滿足不斷增長的電池生產對原材料的需求,石墨的價格則會繼續上漲。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

第四屆中國國際新能源汽車論壇2014

活動網址:

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

※教你寫出一流的銷售文案?

未來3到4年 Tesla規劃在中國生產電動汽車

特斯拉(Tesla)執行長 Elon Musk 昨(21) 日在華盛頓 Geekpark 大會上表示,公司正準備交付首批S型號的電動車給中國的客戶。Tesla 也正在中國佈建“龐大”的充電站網路,包括在北京及上海的超級充電站。Musk預期,未來 3 ~4 年內,Tesla 公司將開始在中國生產電動汽車。

在中國本土生產可避免繳付中國25%的入口關稅,因此可讓公司降低電動車售價。Tesla 公司預測,最快在明年,其在中國市場的銷售量將追平在美國的銷量。

配備85千瓦時電池的S型號電動車,在中國的售價為73.4萬元人民幣(約11.8萬美元),遠高於在美國未計聯邦稅務寬減前的售價約為7.1萬美元,因為加入了運費、增值稅及入口稅。

該公司自去年8月開始接受中國客戶的訂購,並在去年底於北京一個商場開設了一個800平方米的銷售點,展示其電動車。

中國商務部:今年是電動汽車消費元年

中國政府竭盡所能想讓人們購買使用電動汽車,以改善中國的空氣污染問題,而 Musk 相信,Tesla 能幫助中國政府達成這一目標。

中國商務部研究院消費經濟研究部主任趙萍近日在《2014年消費市場發展報告》新聞發布會上表示,今年將是電動汽車消費元年。政策、產品、設施「三位一體」協同推進,意味著今年將迎來中國汽車電子市場的蓬勃發展。

趙萍指出,今年限購或將席捲更多城市,使汽車消費在一二線主要城市遭遇到行政力量預製的「天花板」。由於空氣污染等環境壓力,中國汽車市場的產銷趨勢將存在較大的不確定性,自主品牌也將遭受到更大的挑戰。佔社會消費品零售總額比重高達1/4的汽車消費增速放緩,將會降低總消費增長對汽車的過度依賴。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?