1月1日 MyBatis建立+增刪改+Kruskal演算法
MyBatis建立:
利用generator.xml和mybatis-generator-core-1.3.2.jar自動生成通用DAO層和通用Model層,generator.xml檔案修改如下:
其中ANNOTATEDMAPPER為註解生成方法,這個通用生成工具並不會生成目標資料夾,所以targetProject所對應的的位置要保證存在。<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 資料庫驅動包位置 --> <!-- <classPathEntry location="D:\software\lib\mysql-connector-java-5.1.21.jar" /> --> <classPathEntry location="F:\MyBatisMake\mysql-connector-java-5.1.5-bin.jar" /> <context id="mysqltools" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <!-- 資料庫連結URL、使用者名稱、密碼 --> <!-- <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/sy" userId="sypro" password="sypro"> --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8" userId="root" password="111"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- 生成模型的包名和位置 --> <javaModelGenerator targetPackage="com.MyBatis.model" targetProject="C:\mybatisgen"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- 生成的對映檔案包名和位置 --> <sqlMapGenerator targetPackage="com.MyBatis.mapping" targetProject="C:\mybatisgen"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 生成DAO的包名和位置 --> <javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.MyBatis.mapper" targetProject="C:\mybatisgen"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- 要生成那些表(更改tableName和domainObjectName就可以) 更復雜的方式如下: 但基本不常用 <table tableName="tmenu" domainObjectName="Menu" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" /> --> <table tableName="company" domainObjectName="Company" /> <table tableName="emp" domainObjectName="Emp" /> </context> </generatorConfiguration>
生成語句如下:
java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
匯入MyBatis配置文件mybatis.cfg.xml到工程resources資料夾下,mybatis.cfg.xml修改如下:
其中要注意xml中&要由轉義字元&代替<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8" /> <property name="username" value="root" /> <property name="password" value="111" /> </dataSource> </environment> </environments> <mappers> <mapper class="com.MyBatis.mapper.CompanyMapper" /> <mapper class="com.MyBatis.mapper.EmpMapper" /> </mappers> </configuration>
MyBatis增刪改:
package com.MyBatis.service; import com.MyBatis.mapper.CompanyMapper; import com.MyBatis.model.Company; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.jupiter.api.Test; import java.io.InputStream; /** * Created by Administrator on 2017/1/3. */ public class CompanyService { private SqlSessionFactory ssf = null; public CompanyService(){ InputStream is = CompanyService.class.getClassLoader().getResourceAsStream("mybatis.cfg.xml"); ssf = new SqlSessionFactoryBuilder().build(is); } public void add() { SqlSession session = ssf.openSession(); try { Company com = new Company(); com.setAddress("大成街"); com.setName("Sara"); com.setPrice(5000); com.setCity("黑龍江"); com.setPro("哈爾濱"); session.insert("com.MyBatis.mapper.CompanyMapper.insert", com); session.commit(); session.close(); } catch (Exception e) { session.rollback(); e.printStackTrace(); } } public void delete(){ SqlSession session = ssf.openSession(); try{ Company com = new Company(); com.setCid(5); session.delete("com.MyBatis.mapper.CompanyMapper.deleteByPrimaryKey",com); session.commit(); session.close(); }catch (Exception e){ session.rollback(); e.printStackTrace(); } } public void update(){ SqlSession session = ssf.openSession(); try{ Company com = new Company(); com.setCid(3); com.setName("Sara丶YF"); session.update("com.MyBatis.mapper.CompanyMapper.updateByPrimaryKeySelective",com); session.commit(); session.close(); }catch (Exception e){ session.rollback(); e.printStackTrace(); } } }
Kruskal演算法:
1.概覽
Kruskal演算法是一種用來尋找最小生成樹的演算法,由Joseph Kruskal在1956年發表。用來解決同樣問題的還有Prim演算法和Boruvka演算法等。三種演算法都是貪婪演算法的應用。和Boruvka演算法不同的地方是,Kruskal演算法在圖中存在相同權值的邊時也有效。
2.演算法簡單描述
1).記Graph中有v個頂點,e個邊
2).新建圖Graphnew,Graphnew中擁有原圖中相同的e個頂點,但沒有邊
3).將原圖Graph中所有e個邊按權值從小到大排序
4).迴圈:從權值最小的邊開始遍歷每條邊 直至圖Graph中所有的節點都在同一個連通分量中
if 這條邊連線的兩個節點於圖Graphnew中不在同一個連通分量中
新增這條邊到圖Graphnew中
圖例描述:
首先第一步,我們有一張圖Graph,有若干點和邊
將所有的邊的長度排序,用排序的結果作為我們選擇邊的依據。這裡再次體現了貪心演算法的思想。資源排序,對區域性最優的資源進行選擇,排序完成後,我們率先選擇了邊AD。這樣我們的圖就變成了右圖
在剩下的變中尋找。我們找到了CE。這裡邊的權重也是5
依次類推我們找到了6,7,7,即DF,AB,BE。
下面繼續選擇, BC或者EF儘管現在長度為8的邊是最小的未選擇的邊。但是現在他們已經連通了(對於BC可以通過CE,EB來連線,類似的EF可以通過EB,BA,AD,DF來接連)。所以不需要選擇他們。類似的BD也已經連通了(這裡上圖的連通線用紅色表示了)。
最後就剩下EG和FG了。當然我們選擇了EG。最後成功的圖就是右:3.簡單證明Kruskal演算法
對圖的頂點數n做歸納,證明Kruskal演算法對任意n階圖適用。
歸納基礎:
n=1,顯然能夠找到最小生成樹。
歸納過程:
假設Kruskal演算法對n≤k階圖適用,那麼,在k+1階圖G中,我們把最短邊的兩個端點a和b做一個合併操作,即把u與v合為一個點v',把原來接在u和v的邊都接到v'上去,這樣就能夠得到一個k階圖G'(u,v的合併是k+1少一條邊),G'最小生成樹T'可以用Kruskal演算法得到。
我們證明T'+{<u,v>}是G的最小生成樹。
用反證法,如果T'+{<u,v>}不是最小生成樹,最小生成樹是T,即W(T)<W(T'+{<u,v>})。顯然T應該包含<u,v>,否則,可以用<u,v>加入到T中,形成一個環,刪除環上原有的任意一條邊,形成一棵更小權值的生成樹。而T-{<u,v>},是G'的生成樹。所以W(T-{<u,v>})<=W(T'),也就是W(T)<=W(T')+W(<u,v>)=W(T'+{<u,v>}),產生了矛盾。於是假設不成立,T'+{<u,v>}是G的最小生成樹,Kruskal演算法對k+1階圖也適用。
由數學歸納法,Kruskal演算法得證。
4.程式碼演算法實現
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int Maxn = 50005;
int set[Maxn];
int n,m;
struct Edge
{
int a,b;
int dis;
}Ed[Maxn];
int cmp(const void *a,const void *b)
{
struct Edge *c,*d;
c = (Edge*)a;
d = (Edge*)b;
return c->dis - d->dis;
}
int find(int x)
{
int k,j,r;
r = x;
while(r != set[r])
{
r = set[r];
}
k = x;
while(k != r)
{
j = set[k];
set[k] = r;
k = j;
}
return r;
}
void merge(int x,int y)
{
set[y] = x;
}
void init()
{
for(int i=1;i<=n;i++)
{
set[i] = i;
}
}
int Kruskal()
{
int ans = 0;
int cnt = 0;
qsort(Ed,m,sizeof(Ed[0]),cmp);
for(int i=0;i<m;i++)
{
int f1 = find(Ed[i].a);
int f2 = find(Ed[i].b);
if(f1 == f2) continue;
else
{
cnt++;
ans += Ed[i].dis;
merge(f1,f2);
}
if(cnt == n-1)
{
return ans;
}
}
return -1;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&Ed[i].a,&Ed[i].b,&Ed[i].dis);
}
int ans = Kruskal();
printf("%d\n",ans);
}
}
5.時間複雜度
elog2e e為圖中的邊數