精华内容
下载资源
问答
  • WFS是用来跟后台进行数据交互的,对矢量要素进行增删改查。WMTS是用来看的,大量地图数据在后端渲染成栅格瓦片,传输到前端显示。一、geoserver条件过滤数据——Layer Preview,Openlayers打开发布的图层v6_t...

    WMS既web map service。

    WFS既web feature server。

    WMTS既web map tile service。

    WMS=WFS+WMTS。

    WFS是用来跟后台进行数据交互的,对矢量要素进行增删改查。

    WMTS是用来看的,大量地图数据在后端渲染成栅格瓦片,传输到前端显示。

    一、geoserver条件过滤

    数据——Layer Preview,Openlayers打开发布的图层v6_time_pref_pgn_utf_wgs84。

    e53b2e134b4625c19432a3769cc88bf6.png

    点击按钮,打开toggle options bar,把工具条打开,Filter选择CQL,筛选函数写name_ch='罕东卫',点击apply就可以对显示的地图内容进行过滤了,仅展示name_ch是罕东卫的要素。

    另外WMS version是WMS服务的版本号。

    Tiling是瓦片类型,如果我们的对象是面的话,为了避免注记重复,最好选择Single tile。

    CQL语句跟SQL有点像,更多可以看https://docs.geoserver.org/stable/en/user/tutorials/cql/cql_tutorial.html

    f338503f99fc2ef37a04fbe7d6a2cdfa.png

    二、WMTS url分析

    需要WMTS的原因是,数据太多的话,一下子传到前端会很慢,且前端渲染会卡死,所以一般都是在后端渲染成图片,再传到前端,还可以避免后台数据被爬取。

    用chrome浏览器开发者工具network看一下过滤条件为name_ch='罕东卫'的网络请求。

    http://localhost:8080/geoserver/gismap/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&LAYERS=gismap%3Av6_time_pref_pgn_utf_wgs84&exceptions=application%2Fvnd.ogc.se_inimage&CQL_FILTER=name_ch%3D%27%E7%BD%95%E4%B8%9C%E5%8D%AB%27&SRS=EPSG%3A4326&STYLES=&WIDTH=768&HEIGHT=591&BBOX=78.486328125%2C9.7998046875%2C145.986328125%2C61.7431640625

    分析一下这条url,url会将中文和特殊符号进行转码:

    %2F是/。

    %3A是:。

    把http://localhost:8080去掉,看剩下的。

    //geoserver/工作区名称/wms服务

    geoserver/gismap/wms

    //服务类型是WMS

    ?SERVICE=WMS

    //WMS的版本是1.1.1

    &VERSION=1.1.1

    //请求类型是获取地图

    &REQUEST= GetMap

    //如果返回图片数据,则格式是png

    &FORMAT=image%2Fpng

    //透明的png

    &TRANSPARENT=true

    //渲染图层

    &LAYERS= gismap%3Av6_time_pref_pgn_utf_wgs84

    //报错设置,默认就行

    &exceptions=application%2Fvnd.ogc.se_inimage

    #过滤条件

    CQL_FILTER=name_ch%3D%27%E7%BD%95%E4%B8%9C%E5%8D%AB%27

    //坐标系

    &SRS=EPSG%3A4326

    //风格设置,返回图片的高和宽

    STYLES=&WIDTH=768&HEIGHT=591

    //返回瓦片的地理空间范围

    BBOX=78.486328125%2C9.7998046875%2C145.986328125%2C61.7431640625

    这条url返回的是这样一张图片。

    9440d16cc964cbbb1213e3772b4a94f6.png

    三、WFS查

    我们再看一个获取要素的url。

    在Openlayers窗口中,点击地图上的要素,通过chrome浏览器开发者工具的network能看到一条获取要素的网络请求:

    http://localhost:8080/geoserver/gismap/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&FORMAT=image%2Fpng&TRANSPARENT=true&QUERY_LAYERS=gismap%3Av6_time_pref_pgn_utf_wgs84&LAYERS=gismap%3Av6_time_pref_pgn_utf_wgs84&exceptions=application%2Fvnd.ogc.se_inimage&CQL_FILTER=name_ch%3D%27%E7%BD%95%E4%B8%9C%E5%8D%AB%27&INFO_FORMAT=text%2Fhtml&FEATURE_COUNT=50&X=50&Y=50&SRS=EPSG%3A4326&STYLES=&WIDTH=101&HEIGHT=101&BBOX=86.9677734375%2C35.57739235460759%2C95.8447265625%2C44.45434547960759

    在这条请求中:

    //获取要素信息

    &REQUEST=GetFeatureInfo

    //查询图层

    &QUERY_LAYERS=gismap%3Av6_time_pref_pgn_utf_wgs84

    //返回要素信息的形式,习惯用json,可改成application/json

    &INFO_FORMAT=text%2Fhtml

    //返回数量限制,默认就行,X和Y是图面像素坐标,不用管

    &FEATURE_COUNT=50&X=50&Y=50

    //框选要素的小矩形,minlng、minlat、maxlng、maxlat,把这个小矩形返回到后台做相交判断,相交的要素都返回。理论上,这个小矩形在图面上像素尺寸是一定的,比例尺越大,地理范围越小。

    &BBOX=86.9677734375%2C35.57739235460759%2C95.8447265625%2C44.45434547960759

    这条url返回的结果是这样的:

    375225666411763f2796c4b8d4b90a95.png

    注意一下fid,它是关联要素几何和属性的唯一ID,一般来说,空间要素的几何信息和属性信息是分开存储的,由这个fid关联。

    三、WFS增删改

    WFS的增删改需要通过post进行。

    需要构建GML语句。GML就是拓展有空间几何信息的XML。

    Geoserver,演示——GeoServer的演示——Demo requests。进入请求的demo示例。

    355a6fbdc8ec6200a61afb28fdeb5b89.png

    在Demo requests中的Request选择WFS_transactionDelete.xml或WFS_transactionInsert.xml或WFS_transactionUpdate.xml可以查看各种操作的GML语句样例。

    这个我们看一下就行,因为GML语句的构建可以在前端通过openlayer的函数来生成。

    35e18fe67fc66205ecacd3059470e63e.png

    本节内容主要分析网络请求的url和交互格式。

    Geoserver的使用就到这里了,接下来要进行的是前端内容,如何在openlayer中加载geoserver发布的WMS服务并进行交互。

    因为leaflet的使用范围更广,在写完openlayer后,会同样写一份如何在leaflet中加载geoserver发布的WMS服务并进行交互。

    展开全文
  • GridView控件增删改查(查)

    千次阅读 2015-03-29 21:55:10
    1.7 GridView绑定 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using MyWebProjectBLL; using ...

    总共6个类~

    模型层Student,Grade

    数据访问层StudentServices,GradeServices

    逻辑处理层StudentManager,GradeManager

    UI层的绑定方法在1.7标题位置

    关于1.3 DAL.StudentServices类后面Gender字段的那个详细可以搜索一下三元运算符的语法

    这其中代码不考虑安全性 仅供学习参考。

    没有写返回类型的方法是构造函数,分别为无参和带参

    使用方法:

    Student stu = new Student();
    Student stu = new Student("此处参数与构造函数中的参数类型、数量相同");


    1.1 Model.Student实体类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace MyWebProjectModel
    {
        public class Student
        {
            /// <summary>
            /// 学号
            /// </summary>
            public string StudentNo { get; set; }
            /// <summary>
            /// 密码
            /// </summary>
            public string LoginPwd { get; set; }
            /// <summary>
            /// 姓名
            /// </summary>
            public string StudentName { get; set; }
            /// <summary>
            /// 性别
            /// </summary>
            public string Gender { get; set; }
            /// <summary>
            /// 年级
            /// </summary>
            public int GradeId { get; set; }
            /// <summary>
            /// 电话
            /// </summary>
            public string Phone { get; set; }
            /// <summary>
            /// 地址
            /// </summary>
            public string Address { get; set; }
            /// <summary>
            /// 日期
            /// </summary>
            public DateTime BornDate { get; set; }
            /// <summary>
            /// 邮箱
            /// </summary>
            public string Email { get; set; }
            public string GradeName { get; set; }
            /// <summary>
            /// 身份证
            /// </summary>
            public string IdentityCard { get; set; }
            public Student() { }
            /// <summary>
            /// 带参构造函数
            /// </summary>
            /// <param name="StudentNo">学号</param>
            /// <param name="LoginPwd">密码</param>
            /// <param name="StudentName">姓名</param>
            /// <param name="Gender">性别</param>
            /// <param name="GradeId">年级</param>
            /// <param name="Phone">电话</param>
            /// <param name="Address">地址</param>
            /// <param name="BornDate">日期</param>
            /// <param name="Email">邮箱</param>
            /// <param name="IdentityCard">身份证</param>
            public Student(string StudentNo, string LoginPwd, string StudentName, string Gender, int GradeId, string Phone, string Address, DateTime BornDate, string Email, string IdentityCard)
            {
                this.StudentNo = StudentNo;
                this.LoginPwd = LoginPwd;
                this.StudentName = StudentName;
                this.Gender = Gender;
                this.GradeId = GradeId;
                this.Phone = Phone;
                this.Address = Address;
                this.BornDate = BornDate;
                this.Email = Email;
                this.IdentityCard = IdentityCard;
            }
        }
    }
    


    1.2 Model.Grade实体类

    <pre name="code" class="csharp">using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace MyWebProjectModel
    {
        public class Grade
        {
            public string GradeId { get; set; }
            public string GradeName { get; set; }
        }
        public Grade(){}
        public Grade(string GradeId,string GradeName)
        {
    <span style="white-space:pre">	</span>this.GradeId = GradeId;
    <span style="white-space:pre">	</span>this.GradeName = GradeName;
        }
    }

    
    

    1.3 DAL.StudentServices类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using MyWebProjectModel;
    using System.Data.SqlClient;
    
    namespace MyWebProjectDAL
    {
        public class StudentServices
        {
            public List<Student> GetStudentAll()
            {
                List<Student> list = new List<Student>();
                string sql = "select * from Student";
                using (SqlDataReader reader = DBHelper.GetExecuteReader(sql))
                {
                    while (reader.Read())
                    {
                        Student stu = new Student()
                        {
                            StudentNo = reader["StudentNo"].ToString(),
                            LoginPwd = reader["loginPwd"].ToString(),
                            StudentName = reader["studentName"].ToString(),
                            Gender = Convert.ToBoolean(reader["gender"]) == true ? "男" : "女",
                            GradeId = int.Parse(reader["gradeId"].ToString()),
                            GradeName = new GradeServices().GetGradeById(Convert.ToInt32(reader["gradeId"])),
                            Phone = reader["phone"].ToString(),
                            Address = reader["address"].ToString(),
                            BornDate = Convert.ToDateTime(reader["bornDate"]),
                            Email = reader["email"].ToString(),
                            IdentityCard = reader["identityCard"].ToString()
                        };
                        list.Add(stu);
                    }
                    return list;
                }
            }
        } 
    }


    1.4 DAL.GradeServices类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.SqlClient;
    using MyWebProjectModel;
    
    namespace MyWebProjectDAL
    {
        public class GradeServices
        {
    <span style="white-space:pre">	</span>public List<Grade> GetGradeAll()
            {
                List<Grade> list = new List<Grade>();
                string sql = "select * from Grade";
                using (SqlDataReader reader = DBHelper.GetExecuteReader(sql))
                {
                    while (reader.Read())
                    {
                        Grade gd = new Grade()
                        {
                            GradeId = reader["GradeId"].ToString(),
                            GradeName = reader["gradeName"].ToString()
                        };
                        list.Add(gd);
                    }
                }
                return list;
            }
        }
    }
    


    1.5 BLL.StudentManager类

    <pre name="code" class="csharp">using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using MyWebProjectDAL;
    using MyWebProjectModel;
    
    
    namespace MyWebProjectBLL
    {
        public class StudentManager
        {
    
    
            StudentServices ss = new StudentServices();
            public List<Student> GetStudentAll()
            {
                return ss.GetStudentAll();
            }
        }
    }
    
    


    1.6 BLL.GradeManager类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using MyWebProjectModel;
    using MyWebProjectDAL;
    
    namespace MyWebProjectBLL
    {
        public class GradeManager
        {
            GradeServices gs = new GradeServices();
            public string GetGradeById(int Id)
            {
                return gs.GetGradeById(Id);
            }
            public Grade GetGradeAllById(int Id)
            {
                return gs.GetGradeAllById(Id);
            }
            public List<Grade> GetGradeAll()
            {
                return gs.GetGradeAll();
            }
        }
    }
    

    1.7 GridView绑定

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using MyWebProjectBLL;
    using MyWebProjectModel;
    
    namespace MyWebProject
    {
        public partial class FromStudentAll : System.Web.UI.Page
        {
            StudentManager sm = new StudentManager();
            protected void Page_Load(object sender, EventArgs e)
            {
                GetDataBind();
            }
            public void GetDataBind()
            {
                List<Student> list = sm.GetStudentAll();
                GridView1.DataSource = list;
                GridView1.DataBind();
            }
        }
    }


    1.8 DropDownList控件绑定




    此处需要注意  如果用实体类为返回类型是没作用的~

    绑定方式并不是唯一 但却是比较省时间的 其他绑定方式后续案例中提到

    1.3 DAL.StudentServices类
    展开全文
  • XML映射类 前两篇文章中了解到通过Mapper类路径+方法名映射xxMapper.xml中的namespace+statementID,而namespace+statementID块其实在初始化的时候在Configuration中保存在MappedStatement中,所以我们在增删改查的...
    157f2b95d7037d20d13581954b415420.png

    前言

    上文Mybatis之方法如何映射到XML中介绍了Mybatis是如何将方法进行分拆出方法名映射到statementID,参数如何解析成xml中sql所需要的,以及返回类型的处理;本文将从XML端来看是如何同方法端进行映射的。

    XML映射类

    前两篇文章中了解到通过Mapper类路径+方法名映射xxMapper.xml中的namespace+statementID,而namespace+statementID块其实在初始化的时候在Configuration中保存在MappedStatement中,所以我们在增删改查的时候都会看到如下代码:

    MappedStatement ms = configuration.getMappedStatement(statement);

    在Configuration中获取指定namespace+statementID的MappedStatement,而在Configuration是通过Map维护了对应关系;已最常见的Select语句块为例,在XML中的配置的结构如下:

    681206cacf823f00e1208e69cadfa546.png

    其他增删改除了个别的几个关键字比如:keyProperty,keyColumn等,其他和select标签类似;再来看一下MappedStatement类中相关的属性:

    public final class MappedStatement { private String resource; private Configuration configuration; private String id; private Integer fetchSize; private Integer timeout; private StatementType statementType; private ResultSetType resultSetType; private SqlSource sqlSource; private Cache cache; private ParameterMap parameterMap; private List resultMaps; private boolean flushCacheRequired; private boolean useCache; private boolean resultOrdered; private SqlCommandType sqlCommandType; private KeyGenerator keyGenerator; private String[] keyProperties; private String[] keyColumns; private boolean hasNestedResultMaps; private String databaseId; private Log statementLog; private LanguageDriver lang; private String[] resultSets; ...省略...}

    select标签里面的关键字基本可以在类MappedStatement中找到对应的属性,关于每个属性代表的含义可以参考官方文档:https://mybatis.org/mybatis-3/sqlmap-xml.html;除了关键字还有sql语句,对应的是MappedStatement中的SqlSource,sql语句有动态和静态的区别,对应的SqlSource也提供了相关的子类:StaticSqlSource和DynamicSqlSource,相关的sql解析类在XMLScriptBuilder中:

    public SqlSource parseScriptNode() { MixedSqlNode rootSqlNode = parseDynamicTags(context); SqlSource sqlSource = null; if (isDynamic) { sqlSource = new DynamicSqlSource(configuration, rootSqlNode); } else { sqlSource = new RawSqlSource(configuration, rootSqlNode, parameterType); } return sqlSource; }

    具体哪种sql是动态的,哪种是静态的,相关逻辑在parseDynamicTags中判断的,此处大致说一下其中的原理:遇到${}和动态标签如,,则为DynamicSqlSource,否则为StaticSqlSource也就是常见的#{};在解析动态sql的时候Mybatis为每个标签专门提供了处理类NodeHandler,初始化信息如下:

    private void initNodeHandlerMap() { nodeHandlerMap.put("trim
    展开全文
  • } D:AccountDaoImpl 实现类 由于今天要完成的是一个增删改查的操作,所以我们引入了 DBUtils 这样一个操作数据库的工具,它的作用就是封装代码,达到简化 JDBC 操作的目的,由于以后整合 SSM 框架的时候,持久层的...
    • Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC
    • 阿里一线架构师分享的技术图谱,进阶加薪全靠它
    • 2020复工跳槽季,ZooKeeper灵魂27连问,这谁顶得住?
    • 秋招Java面试大纲:Java+并发+spring+数据库+Redis+JVM+Netty等

    开篇絮叨

    大家应该清楚,XML与注解常常是形影不离的,他们就像一对双胞胎,但兄弟两个的想法都是一致的,那就是帮助开发者实现想要的功能,我们所说的IOC 技术,无疑是为了降低程序间的耦合,那么,今天就来聊一聊,基于注解的IOC配置,当然为了大家有对比学习,两种配置同时讲解,同时我把例举得尽量完整一些,就来完成一个对单表进行 CURD 的案例

    (一) 准备代码与环境

    (1) 添加必要的依赖

    • spring-context
    • mysql-connector-java
    • c3p0(数据库连接池)
    • commons-dbutils(简化JDBC的工具)—后面会简单介绍一下
    • junit (单元自测)

    说明:由于我这里创建的是一个Maven项目,所以在这里修改 pom.xml 添加一些必要的依赖坐标就可以

    如果创建时没有使用依赖的朋友,去下载我们所需要的 jar 包导入就可以了

    org.springframework            spring-context            5.0.2.RELEASEmysql            mysql-connector-java            5.1.6c3p0            c3p0            0.9.1.2commons-dbutils            commons-dbutils            1.4junit            junit            4.12test

    简单看一下,spring核心的一些依赖,以及数据库相关的依赖等就都导入进来了

    00b0e36c6908f2253227979cb5f75240.png

    (2) 创建账户表以及实体

    A:创建 Account 表

    -- ------------------------------ Table structure for account-- ----------------------------CREATE TABLE `account`  (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(32),  `balance` float,  PRIMARY KEY (`id`))

    B:创建 Account 类

    没什么好说的,对应着我们的表创出实体

    public class Account implements Serializable {    private  Integer id;    private String name;    private Float balance;    ......补充 get set toString 方法

    (3) 创建Service以及Dao

    A:AccountService 接口

    public interface AccountService {    void add(Account account);    void delete(Integer accpuntId);    void update(Account account);    List findAll();    Account findById(Integer accountId);}

    B:AccountServiceImpl 实现类

    public class AccountServiceImpl implements AccountService {    private AccountDao accountDao;    public void setAccountDao(AccountDao accountDao) {        this.accountDao = accountDao;    }    public void add(Account account) {        accountDao.addAccount(account);    }    public void delete(Integer accpuntId) {        accountDao.deleteAccount(accpuntId);    }    public void update(Account account) {        accountDao.updateAccount(account);    }    public List findAll() {        return accountDao.findAllAccount();    }    public Account findById(Integer accountId) {        return accountDao.findAccountById(accountId);    }}

    C:AccountDao 接口

    public interface AccountDao {    void addAccount(Account account);    void deleteAccount(Integer accountId);    void updateAccount(Account account);    List findAllAccount();    Account findAccountById(Integer accountId);}

    D:AccountDaoImpl 实现类

    由于今天要完成的是一个增删改查的操作,所以我们引入了 DBUtils 这样一个操作数据库的工具,它的作用就是封装代码,达到简化 JDBC 操作的目的,由于以后整合 SSM 框架的时候,持久层的事情就可以交给 MyBatis 来做,而今天我们重点还是讲解 Spring 中的知识,所以这部分会用就可以了,重点看 XML 与 注解 两种配置方式

    用到的内容基本讲解:

    QueryRunner 提供对 sql 语句进行操作的 API (insert delete update)

    ResultSetHander 接口,定义了查询后,如何封装结果集(仅提供了我们用到的)

    • BeanHander:将结果集中第第一条记录封装到指定的 JavaBean 中
    • BeanListHandler:将结果集中的所有记录封装到指定的 JavaBean 中,并且将每一个 JavaBean封装到 List 中去
    public class AccountDaoImpl implements AccountDao {        private QueryRunner runner;    public void setRunner(QueryRunner runner) {        this.runner = runner;    }    public void addAccount(Account account) {        try {            runner.update("insert into account(name,balance)values(?,?)", account.getName(), account.getBalance());        } catch (Exception e) {            throw new RuntimeException(e);        }    }    public void updateAccount(Account account) {        try {            runner.update("update account set name=?,balance=? where id=?", account.getName(), account.getBalance(), account.getId());        } catch (Exception e) {            throw new RuntimeException(e);        }    }    public void deleteAccount(Integer accountId) {        try {            runner.update("delete from account where id=?", accountId);        } catch (Exception e) {            throw new RuntimeException(e);        }    }    public List findAllAccount() {        try {            return runner.query("select * from account", new BeanListHandler(Account.class));        } catch (Exception e) {            throw new RuntimeException(e);        }    }    public Account findAccountById(Integer accountId) {        try {            return runner.query("select * from account where id = ? ", new BeanHandler(Account.class), accountId);        } catch (Exception e) {            throw new RuntimeException(e);        }    }}

    (二) XML 配置方式

    在这里有两基本的方式,一是通过构造函数注入,另一种就是通过Set注入,实际上所做的就是,使用类的构造函数或者Set给成员变量进行赋值,但特别的是,这里是通过配置,使用 Spring 框架进行注入首先就是头部的依赖信息,顺便提一句,当然我们可以去官网查找贴过来

    edaa78b65e3ec596ebb3ffbb74024471.png

    先把针对上面功能的具体配置代码贴出来

    <?xml version="1.0" encoding="UTF-8"?>

    分析一下:

    配置 Bean 标签的时候,我们见到了两种形式 property、constructor-arg 也就是对应着 set 方式 与构造函形式,先说一下比较常见的 set 方式,用上面的代码中距离:

    (1) Set 方式

    顾名思义,就是通过去找你给出对应的 Set 方法,然后对成员变量进行赋值,先看下类中的代码

    public class AccountServiceImpl implements AccountService {//成员    private AccountDao accountDao;//Set方法    public void setAccountDao(AccountDao accountDao) {        this.accountDao = accountDao;    }     ...... 下面是增删改查的方法}

    这是 bean.xml 中的配置

    然后 property 配置的过程中,有一些属性需要说一下

    • name:与成员变量名无关,与set方法后的名称有关,例如 setAccountDao() 获取到的就是accountDao,并且已经小写了开头
    • value:这里可以写基本数据类型和 String
    • ref:这里可以引入另一个bean,帮助我们给其他类型赋值 (例如这里就通过 ref 引入了下面 id 值为accountDao的 bean)

    当然,以后可能会见到一种方式就是 使用 p名称空间注入数据 (本质还是set)

    头部中需要修改引入这一句

    xmlns:p="http://www.springframework.org/schema/p"

    我直接拿以前文章中的一个例子:

    (2) 构造函数方式

    下面就是使用构造函数的一种方式,这一种的前提就是:类中必须提供一个和参数列表相对应的构造函数

    由于我们选择的是 DBUtils 这样一个工具,而它为我们提供了两种构造函数,即带参和无参,所以我们可以在其中注入数据源,也可以使得每一条语句都独立事务

    还有一点需要说明的就是:我们下面的数据源使用了 c3p0 这只是一种选择方式,并不是一定的,是因为使用 DBUtils 的时候需要手动传递一个 Connection 对象

    来说一下所涉及到的标签:

    • constructor-arg(放在 bean 标签内) 再说一说其中的一些属性值 给谁赋值: index:指定参数在构造函数参数列表的索引位置 type:指定参数在构造函数中的数据类型 name:指定参数在构造函数中的名称(更常用) 赋什么值: value:这里可以写基本数据类型和 String ref:这里可以引入另一个bean,帮助我们给其他类型赋值

    (3) 注入集合属性

    为了演示这些方式,我们在一个实体成员中将常见的一些集合都写出来,然后补充其 set 方法

    private String[] strs;private List list;private Set set;private Map map;private Properties props;

    在配置中也是很简单的,只需要按照下列格式写标签就可以了,由于增删改查中并没有涉及到集合的相关信息,这里就是简单提一下,可以自己测试一下

    张三李四王五张三李四王五张三李四王五张三21

    (4) 测试代码

    public class AccountServiceTest {    private ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");    private AccountService as = ac.getBean("accountService", AccountService.class);    @Test    public void testAdd(){        Account account = new Account();        account.setName("jack");        account.setBalance(1000f);        as.add(account);    }    @Test    public void testUpdate(){        Account account = as.findById(4);        account.setName("杰克");        account.setBalance(1500f);        as.update(account);    }    @Test    public void testFindAll(){        List list = as.findAll();        for(Account account : list) {            System.out.println(account);        }    }    @Test    public void testDelete(){        as.delete(4);    }}

    (5) 执行效果

    添加,修改(包含了查询指定id),删除

    d462e626071980bf8abd3dfb8177b26d.png
    3df2d5d68988854adb5de4b472abbfef.png
    170d16dba87defa841ecbe97ec1927dc.png

    查询所有

    0d29e0ecb9dcdeb6db42bdfaf7311807.png

    (三) 注解配置方式

    首先,我们先将上面的例子使用注解来实现一下,再来具体的讲解:

    (1) 改造原程序为注解配置

    首先需要为 Dao 和 Service 的实现类中 添加注解

    @Service("accountService")public class AccountServiceImpl implements AccountService {    @Autowired    private AccountDao accountDao;    下面的原封不动}
    @Repository("accountDao")public class AccountDaoImpl implements AccountDao {    @Autowired    private QueryRunner runner;       下面的原封不动}
    <?xml version="1.0" encoding="UTF-8"?>

    到这里,一个最基本的注解改造就完成了,大家可以用前面的测试类进行一下测试

    下面我们正式说一下注解配置相关的知识

    (2) 常用注解

    A:创建对象

    @Component

    • 让Spring 来管理资源,相当于XML 中配置一个 bean
    • 可以在括号内指定 value 值,即指定 bean 的 id ,如果不指定就会默认的使用当前类的类名
    • 如果注解中只有一个value属性要赋值,value可以不写,直接写名称,如上面例子中

    @Controller @Service @Repository

    对于创建对象的注解,Spring 还提供了三种更加明确的说法,作用是完全相同的,但是针对不同的场景起了不同的叫法罢了

    • @Controller:一般用于表现层
    • @Service:一般用于业务层
    • @Repository:一般用于持久层

    B:注入数据

    @Autowired

    • 自动按类型注入,相当于XML 中配置一个 bean 或者
    • 容器中有一个唯一的 bean 对象类型和注入的变量类型一致,则注入成功
    @Autowiredprivate AccountDao accountDao;@Repository("accountDao")public class AccountDaoImpl implements AccountDao {......}
    • 比如上面的例子,Spring的IOC中容器是一个Map的结构,字符串“accountDao” 以及这个可以认为是 AccountDao 类型的 AccountDaoImpl 类就被以键值对的形式存起来,被注解 @Autowired的地方,会直接去容器的 value 部分去找 AccountDao 这个类型的类 当 IoC 中匹配到了多个符合的,就会根据变量名去找,找不到则报错:例如下面,根据 AccountDao类型匹配到了两个类,所以根据变量名去找找到了 AccountDaoImplA 这个类
    @Autowiredprivate AccountDao accountDaoA;@Repository("accountDaoA")public class AccountDaoImplA implements AccountDao {......}@Repository("accountDaoB")public class AccountDaoImplB implements AccountDao {......}
    • 可以对类的成员变量、方法以及构造函数进行标注,完成自动装配
    • 使用此注解可以省略 set 方法

    @Qualifier

    • 在自动按类型注入的基础之上,按照 Bean 的 id 注入,给字段注入的时候不能够单独使用,需要配合上面的 @Autiwire 使用,但是给方法参数注入的时候,可以独立使用
    • 使用时:value 值指定 bean 的 id

    它有时候必须配合别的注解使用,有没有一个标签可以解决这个问题呢?答案就是 @Resource

    @Resource

    • 直接按照 bean 的 id 注入,不过只能注入其他 bean 类型
    • 使用时:name 值指定 bean 的 id

    前面三个都是用来注入其他的 bean 类型的数据,下面来说一说,基本类型以及String的实现

    (特别说明:集合类型的注入只能通过 XML 来实现)

    @Value

    • 这个注解就是用来注入基本数据类型和 String 类型数据的
    • 使用时:value 属性用于指定值

    C:改变作用范围

    @Scope

    • 指定 bean 的作用范围 相当于XML 中配置一个
    • 使用时:value 属性用于指定范围的值(singleton prototype request session globalsession)

    D:生命周期相关

    相当于:

    @PostConstruct

    • 指定初始化方法

    @PreDestroy

    • 指定销毁方法

    (四) XML和注解 的对比与选择

    (1) 优缺点

    一般来说,我们两种配置方式都是有人使用的,不过我个人更习惯使用注解的方式

    • XML 类之间的松耦合关系,扩展性强,利于更换修改 对象之间的关系清晰明了
    • 注解: 简化配置,并且使用起来也容易,效率会高一些 在类中就能找对配置,清晰明了 类型安全

    (2) 两者对比

    3cdae126740b64ac0c93c2b4a1010d44.png

    (五) 补充新注解

    为什么要补充新注解呢? 在我们使用注解时,在书写代码时,简化了很多,但是我们在 bean.xml 文件中 仍然需要 开启扫描、 进行配置QueryRunner 以及 数据源,如何彻底摆脱 xml 配置全面使用注解呢?

    这也就是我们将要补充的几个新注解,作用就是让我们全面使用注解进行开发

    (1) 注解讲解

    A: 配置类注解

    @Configuration

    • 指定当前类是 spring 的一个配置类,相当于 XML中的 bean.xml 文件
    • 获取容器时需要使用下列形式

    依旧使用上方的 CURD 的案例代码进行修改,首先与cn同级创建了一个名为 config 的包,然后编写一个名为 SpringConfiguration 的类,当然实际上这两个名字无所谓的,添加注解

    @Configurationpublic class SpringConfiguration {}

    B: 指定扫描包注解

    @ComponentScan

    @Configuration 相当于已经帮我们把 bean.xml 文件创立好了,按照我们往常的步骤,应该指定扫描的包了,这也就是我们这个注解的作用

    • 指定 spring 在初始化容器时要扫描的包,在 XML 中相当于:
     
    • 其中 basePackages 用于指定扫描的包,和这个注解中value属性的作用是一致的

    具体使用:

    @Configuration@ComponentScan("cn.ideal")public class SpringConfiguration {}

    C: 创建对象

    @Bean

    写好了配置类,以及指定了扫描的包,下面该做的就是配置 QueryRunner 以及数据源了,在 XML 中我们会通过书写 bean 标签来配置,而 Spring 为我们提供了 @Bean 这个注解来替代原来的标签

    • 将注解写在方法上(只能是方法),也就是代表用这个方法创建一个对象,然后放到 Spring 的容器中去
    • 通过 name 属性 给这个方法指定名称,也就是我们 XML 中 bean 的 id

    具体使用:

    package config;import com.mchange.v2.c3p0.ComboPooledDataSource;import org.apache.commons.dbutils.QueryRunner;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class JdbcConfig {/**     * 创建一个 QueryRunner对象     * @param dataSource     * @return     */    @Bean(name = "runner")    public QueryRunner creatQueryRunner(DataSource dataSource){        return  new QueryRunner(dataSource);    }    /**     * 创建数据源,并且存入spring     * @return     */    @Bean(name = "dataSource")    public DataSource createDataSource() {        try {            ComboPooledDataSource ds = new ComboPooledDataSource();            ds.setUser("root");            ds.setPassword("1234");            ds.setDriverClass("com.mysql.jdbc.Driver");            ds.setJdbcUrl("jdbc:mysql:///spring_day02");            return ds;        } catch (Exception e) {            throw new RuntimeException(e);        }    }}

    D: 配置 properties 文件

    @PropertySource

    上面在创建数据源的时候,都是直接把配置信息写死了,如果想要使用 properties 进行内容的配置,在这时候就需要,使用 @PropertySource 这个注解

    • 用于加载 .properties 文件中的配置
    • value [] 指定 properties 文件位置,在类路径下,就需要加上 classpath
    @Configuration@ComponentScan("cn.ideal")@PropertySource("classpath:jdbcConfig.properties")public class SpringConfiguration {}
    public class JdbcConfig {    @Value("${jdbc.driver}")    private String driver;    @Value("${jdbc.url}")    private String url;    @Value("${jdbc.username}")    private String username;    @Value("${jdbc.password}")    private String password;    /**     * 创建一个 QueryRunner对象     * @param dataSource     * @return     */    @Bean(name = "runner")    public QueryRunner creatQueryRunner(DataSource dataSource){        return  new QueryRunner(dataSource);    }    /**     * 创建数据源,并且存入spring     * @return     */    @Bean(name = "dataSource")    public DataSource createDataSource() {        try {            ComboPooledDataSource ds = new ComboPooledDataSource();            ds.setUser(username);            ds.setPassword(password);            ds.setDriverClass(driver);            ds.setJdbcUrl(url);            return ds;        } catch (Exception e) {            throw new RuntimeException(e);        }    }}

    E:导入其他配置类

    @Import

    这样看来一个 JdbcConfig 就基本写好了,我们在其中配置了 QueryRunner 对象,以及数据源,这个时候,实际上我们原先的 bean.xml 就可以删掉了,但是我们虽然写好了 JdbcConfig 但是如何将两个配置文件联系起来呢?这也就是这个注解的作用

    @Configuration@ComponentScan("cn.ideal")@Import(JdbcConfig.class)@PropertySource("classpath:jdbcConfig.properties")public class SpringConfiguration {}

    (2) 注解获取容器

    修改获取容器的方式后,就可以进行测试了

    private ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);private AccountService as = ac.getBean("accountService", AccountService.class);

    (五) Spring 单元测试改进

    由于我们需要通过上面测试中两行代获取到容器,为了不每一次都写这两行代码,所以我们在前面将其定义在了成员位置,但是有没有办法可以省掉这个步骤呢?

    也就是说,我们想要程序自动创建容器,但是原来的 junit 很显然是实现不了的,因为它并不会知道我们是否使用了 spring ,不过 junit 提供了一个注解让我们替换它的运行器,转而由 spring 提供

    首先需要导入 jar 包 或者说导入依赖坐标

    org.springframeworkspring-test5.0.2.RELEASE

    使用 @RunWith 注解替换原有运行器 然后使用 @ContextConfiguration 指定 spring 配置文件的位置,然后使用 @Autowired 给变量注入数据

    @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = SpringConfiguration.class)public class AccountServiceTest {    @Autowired    private AccountService as;    }


    作者:BWH_Steven

    原文链接:https://juejin.im/post/5e537b2851882549431febe2

    展开全文
  • } D:AccountDaoImpl 实现类 由于今天要完成的是一个增删改查的操作,所以我们引入了 DBUtils 这样一个操作数据库的工具,它的作用就是封装代码,达到简化 JDBC 操作的目的,由于以后整合 SSM 框架的时候,持久层的...
  • 三层架构下GridView控件实现增删改查,初学者的参考,我也是刚开始学
  • GridView控件实现增删改查

    千次阅读 2020-04-22 17:49:59
    第二步:添加GridView表格,并且套用格式样式,如下图所示: 第三步:点击表格右侧的小三角,并选中编辑列,如下图所示: 第四步:添加三个绑定列,并为其绑定上数据,如下图所示: 并且修改命令列的名称为...
  • protected void Page_Load(object sender, EventArgs e) { } /// /// 删除操作 /// /// /// protected void GridView_user_RowDeleting(object sender, GridViewDeleteEventArgs e) { int id = int.Parse(GridView_...
  • 第二步:添加GridView表格,并且套用格式样式,如下图所示:   第三步:点击表格右侧的小三角,并选中编辑列,如下图所示:   第四步:添加三个绑定列,并为其绑定上数据,如下图所示: ...
  • View Code 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UserList.aspx.cs" Inherits="TopWin.DongFengYL.SQLMemberShip.WebCtrl._layout.WebForm2" %> 2 <%@ Register Assembly=...
  • 1、新建一个空项目,添加Web也页,拖入GridView 在前台中的form标签里拖入一个GridView,转入设计,在编辑列中BoundField,HeaderText设置表头文本,DataField设置为要显示的数据库字段。 如果要加入修改,删除按钮...
  • 备注:这是我辅导的一个项目开发组的一个例子,用文章的方式分享出来...很多企业业务程序的页面,其实本质上都是对数据的操作,诸如增加、删除、修改和查询(简称:增删改查),如果有可能在一个页面中完整地实现(...
  • asp.net中如果想要在GridView控件上实现增删改查,通过给GridView添加数据源就可以实现,前提是使用的数据库必须是数据源中有的。在SqlDataSource控件中添加数据源最方便的是使用SQLServer、Access数据库,但是有很...
  • DataList,Repeater,DetailsView,FormView,GridView,ListView的增删改查实例,用反射进行更换数据源,自己写的;是新手学习的好资料! DataListOpener.aspx DetailsViewOpener.aspx FormViewOpener.aspx ...
  • 含有dropdownlist的gridview增删改查

    千次阅读 多人点赞 2012-03-27 09:26:03
    GridView控件修改、删除例子,修改时含有DropDownList控件。 示例运行效果图: GridViewUp.aspx文件代码: 无标题页 <asp:GridView I
  • 网上很多例子都没有查找和分页这个配套的功能,所以自己写了一个简单的例子。里面的样式用了 bootstrap
  • GridView增删改查之RowCommand事件

    千次阅读 2012-05-12 15:14:22
    GridView模板列中,添加LinkButton控件(只要是模板控件就行);  2.在LinkButton控件的属性:  CommandName属性:del/editor/search/add //可以自定义  CommandArgument属性:要绑定的值     后台CS...
  • 不涉及业务的增删改查,包括从数据库取数放入Gridview控件,利用了三层架构思想,包括对数据库操作的封装希望对新手有帮助

空空如也

空空如也

1 2 3 4
收藏数 76
精华内容 30
关键字:

gridview控件增删改查