1月1日 MyBatis创建+增删改+Kruskal算法

原创 2017年01月03日 15:24:03

MyBatis创建:

利用generator.xml和mybatis-generator-core-1.3.2.jar自动生成通用DAO层和通用Model层,generator.xml文件修改如下:

<?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>
其中ANNOTATEDMAPPER为注解生成方法,这个通用生成工具并不会生成目标文件夹,所以targetProject所对应的的位置要保证存在。

生成语句如下:

java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite

导入MyBatis配置文档mybatis.cfg.xml到工程resources文件夹下,mybatis.cfg.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&amp;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>  
其中要注意xml中&要由转义字符&amp;代替

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为图中的边数




版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 1233.还是畅通工程【最小生成树 kruskal算法(并查集)+prim算法】【1月8】

还是畅通工程 Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的...

Kruskal算法python实现

  • 2017年06月21日 20:20
  • 3KB
  • 下载

最小生成树Kruskal算法

  • 2016年01月05日 18:00
  • 1KB
  • 下载

求最小生成树的Kruskal算法

算法导论中求最小生成树的算法一共有两种,一种是Prim算法,一种是Kruskal算法。           Kruskal算法的基本思路是:                step 1 :一个森林...

kruskal算法,动态规划,背包问题

  • 2013年12月09日 14:46
  • 239KB
  • 下载

数学建模Kruskal算法

  • 2011年10月06日 09:17
  • 1KB
  • 下载

【贪心法求解最小生成树之Kruskal算法详细分析】---Greedy Algorithm for MST

初衷: 最近在看算法相关的东西,看到贪心法解决mst的问题,可惜树上讲解的不是很清新,到网上找了很多资料讲解的也不透彻 只是随便带过就草草了事、这几天抽空看了下,总算基本思路理清楚了 主要还是得...

最小生成树的kruskal算法实现

  • 2017年04月27日 16:37
  • 1KB
  • 下载

kruskal算法matlab

  • 2012年07月14日 10:27
  • 621B
  • 下载

UESTC 1636 梦后楼台高锁,酒醒帘幕低垂 最小生成树Kruskal算法的扩展

题意:给出一个有n个点和m条边的无向连通图,每条边都有一个权值w. 定义,对于一条路径,它的Charm value为该路径上所有边的权值的最大值与最小值的差. 询问从1到n的所有路径的Charm va...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1月1日 MyBatis创建+增删改+Kruskal算法
举报原因:
原因补充:

(最多只允许输入30个字)