【4858.com】的通信方式总计,如鹏网学习笔记

By admin in 4858.com on 2019年3月30日

两种开发方式

ADO.Net基础

ADO.Net基础

1.简介

JDBC(Java DataBase Connectivity) 是一种可用以实践SQL语句的Java
API,是一套面向对象的应用程序接口,

合并了数据库的造访格局,数据库厂商提供了贯彻接口的类,称为‘驱动程序’。因而JDBC并无法直接待上访问数据库,

急需借助数据库厂商提供的JDBC驱动程序。

–SQL语言:

数量定义语言(Data Definition Language,DDL)如:create,alter,drop等

多少操纵语言(Data Manipulation Language,DML)如update,delete等

数码查询语言(Data Query language,DQL),查询

数量控制语言(Data Control Language,DCL),如grant,revoke等

作业控制语言(Transaction Control Language,TCL),如commit,rollback等

1.行使 vs 自带的可视化学工业具,不推荐。

在 vs
的花色中添加
‘数据集’,然后通过可视化的工具添加数据库为数据源,默承认添加 SQL Server
和 Oracle 等,添加 Mysql 前须求极度安装组件。

亮点,自带
sql 语句中特殊字符的转义,不会出现 sql
注入的标题,合营数据绑定能够在项目早先时代急迅推进项目进度。

缺点:可视化学工业具的使用并不流行,不便利开发公司的征集和体系早先时期的改动维护。许多常用的功用很难使用,如:存款和储蓄进度,事务,连接池控制等。

一、ADO.Net简介
  1,程序要因而SQL语句自动化的操作数据库,必供给用1个类库,
【4858.com】的通信方式总计,如鹏网学习笔记。    类库要提供execute(“insert into …”)/executeQuery(“select *
from …”)类似的法门

一、ADO.Net简介
  1,程序要经过SQL语句自动化的操作数据库,必必要用3个类库,
    类库要提供execute(“insert into …”)/executeQuery(“select *
from …”)类似的点子

2.备选干活,以Mysql为例

a.安装了Mysql 数据库

b.下载mysql驱动包并在类型中程导弹入jar包:mysql-connector-java-5.1.42-bin.jar 

2.引用 mysql.data.dll ,在此基础上海展览中心开开发,推荐。

全盘由代码完成报导进程。

可取:能够一本万利的运用各个成效,

症结:在使用的历程中要留心许多坑,如:卓殊的破获,sql
注入 , 非托管财富的自由等。


 


 

  2,ADO.Net是.Net中提供的专业访问数据库的接口,访问不相同的DBMS的底层方法是不雷同的,ADO.Net把走访数据库的艺术实行了联合,
    访问MYSql、Oracle、SqlServer等不等数据库的主意大致是同样的

  2,ADO.Net是.Net中提供的正规化访问数据库的接口,访问不一致的DBMS的平底方法是不一样的,ADO.Net把走访数据库的法子开始展览了合并,
    访问MYSql、Oracle、SqlServer等不等数据库的章程差不多是同一的

3.JDBC的操作

步骤:

1.登记驱动

2.三番五次数据库

3.创设语句对象,用于实践SQL

4.执行SQL

5.甩卖实施结果

6.停歇连接

一体化的简报进程

  3,ADO.Net是正规,被区别的数据库厂商提供ADO.Net的落实,称之为ADO.Net驱动,各样厂商提供的驱动能够用来操作本人的数据库

  3,ADO.Net是明媒正娶,被不一样的数据库厂商提供ADO.Net的贯彻,称之为ADO.Net驱动,每种厂商提供的驱动能够用来操作自身的数据库

① 、JDBC基本操作

1)在数据库先创造一张表Student

CREATE TABLE student(
    id INT AUTO_INCREMENT,
    NAME VARCHAR(20),
    age INT ,
    PRIMARY KEY(id)
);

2)jdbc实现

package com.huan.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo01 {
    public static void main(String[] args) {
        //声明连接
        Connection connection = null;
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //数据库连接信息
            //地址  jdbc:mysql://地址/数据库
            String url = "jdbc:mysql://localhost:3306/huan";
            String user = "root";
            String password = "root";
            //获得连接
            connection = DriverManager.getConnection(url, user, password);
            //语句对象
            Statement st = connection.createStatement();
            String sql = "insert into student (name,age) values ('zhangsan',30)";
            //执行sql  DDL-execute()方法  DML-executeUpdate()方法 DQL-executeQuery()方法
            int n = st.executeUpdate(sql);
            String querySql = "select id,name,age from student";
            ResultSet rs = st.executeQuery(querySql);
            //处理结果
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("id:"+id+" name:"+name+" age:"+age);
            }
            //释放资源
            rs.close();
            st.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            //关闭连接
            if(connection != null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    }
}

地点先进行了一条插入语句,由于主键id是自增的,由此直插入了名字zhangsan和年龄30,然后查询了表的数目

出口如下:

id:1 name:zhangsan age:30

1.起家连接,连接分 “长连接” 和 “短连接” 

长连接在高频次的广播发表时急速便捷,不过占用能源,在产出国访问问下容易耗尽网络能源,对于带宽较低的局域网来说,假设大气行使长连接,会占据网速,影响使用体验。

短连接在行使时
open, 使用到位后
close,此时连年龄资历源会跻身连接池,等待下次总是时接纳。纵然能源未被释放掉,但连接池的支付十分小,是全然能够承受的。短连接一样须要考虑并发难点。

短连接在选拔到位后方可直接dispose,只怕接纳 using(){}
来界定连接的作用域,使用完了后活动释放掉,不进来连接池,那种方法能源占用最少,但在急需反复建立连接的意况下接二连三功用较低。

在骨子里支出的时候最佳利用短连接,并在应用完成后关闭并放入连接池。

string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open(); 
conn.Close();

二、ADO.Net连接MYSQL

二、ADO.Net连接MYSQL

② 、JDBC连接的卷入

是因为总是数据库的历程都以均等,为了增强代码的任用,能够将数据库的总是封装起来:

首先将数据库的一而再消息放到配置文件中,比如在项目根目录下新建文件db.properties,如下:

#db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/huan
jdbc.user=root
jdbc.password=root

JDBCUtil类

package com.huan.jdbc;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;


public class JDBCUtil {

    private static String driverClass;
    private static String url;
    private static String user;
    private static String password;
    //静态块加载数据库配置属性
    static{
        Properties config = new Properties();
        try {
            config.load(new FileInputStream("db.properties"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        driverClass = config.getProperty("jdbc.driver");
        url = config.getProperty("jdbc.url");
        user = config.getProperty("jdbc.user");
        password =config.getProperty("jdbc.password");
    }


    //获取数据库连接
    public static Connection getConnection() throws SQLException {

        try {
            Class.forName(driverClass);
            Connection connection = DriverManager.getConnection(url, user, password);
            return connection;
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new SQLException("没有找到驱动",e);
        }

    }

    //关闭资源
    public static void close(Connection connection,Statement st,ResultSet rs){

        if(connection != null){
            try {
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        if(st != null){
            try {
                st.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}

测试JDBCUtil

package com.huan.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtilTest {
    public static void main(String[] args) {
        Connection connection = null;
        Statement st = null;
        ResultSet rs =null;
        try {
            connection = JDBCUtil.getConnection();
            String sql = "select id ,name ,age from student" ;
            st = connection.createStatement();
            rs = st.executeQuery(sql);
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("id:"+id+" name:"+name+" age:"+age);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JDBCUtil.close(connection, st, rs);
        }



    }
}

输出:

id:1 name:zhangsan age:30

2.选择连接创设 sql 命令并执行

  1,安装MySql的.Net驱动mysql-connector-net-***.msi添加到花色的库中。
    倘诺设置碰着标题,则间接下载mysqlnetconnection(V4.5).zip。

  1,安装MySql的.Net驱动mysql-connector-net-***.msi添加到花色的库中。
    假使设置境遇标题,则直接下载mysqlnetconnection.zip。

三 SQL预处理及业务

SQL预处理:在事先的拍卖中都以将sql语句发送到数据库,有数据库的sql解释器把sql语句生成底层的当中命令,然后执行命令,达成操作,当前持续的

                 
向数据库发送sql语句,会扩大数据库sq解释器的负责,影响执行进程。

                  而Connection的prepareStatement(Stirng
sql)方法能够对sql语句进行预处理,生成数据底层的通令,并封装在PrepareStatement对

                 
象中,通过相应的法子执行底层数据库的指令,从而减轻数据库的承负,进步访问速度。

                 
并且在此之前的sql都以东拼西凑的,当带参数拼接时便于造成SQL的注入(参数中隐含sql成分,改变原来的sql语句逻辑),而PrepareStatement在

                
编译之后,个中的sql执行安插已经规定,当替换参数时不会变动执行陈设,因而得防止止sql注入。

工作控制:  
当大家在编排逻辑的时候,存在多条的插入或然更新语句,前边的sql成功施行之后现身错误,那时导致业务逻辑中断,而举行成功的数据现已

                
存入数据库,从而致使数据不完全。为幸免那种事情的爆发就供给手动实行作业控制。

                1.关门自动提交–connection.setAutoCommit(false);

                2.业务实践到位后交由-connection.commit();

                3.在境遇特别时回滚-connection.rollback();

package com.huan.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

public class PrepareStatementDemo {
    public static void main(String[] args) {
        Connection connection = null;
        //SQL预处理对象
        PreparedStatement ps = null;
        ResultSet rs =null;

        try {
            connection = JDBCUtil.getConnection();
            connection.setAutoCommit(false);
            //?代表参数
            String sql = "insert into student (name,age) values(?,?)";
            //编译预执行计划 在数据库上创建执行计划  
            //(第二个参数可以不要-Statement.RETURN_GENERATED_KEYS 代表返回主键,没有的话下面的要去掉ps.getGeneratedKeys()会)
            ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            //?的位置 和 替换的值
            ps.setString(1, "lisi");
            ps.setInt(2, 20);
            //n 更新结果的数量
            int n = ps.executeUpdate();
            System.out.println("成功插入"+n+"条数据");
            //获取插入成功数据的主键
            ResultSet keySet = ps.getGeneratedKeys();
            int key = -1;
            while(keySet.next()){
                key = keySet.getInt(1);
            }
            System.out.println("插入数据的主键:"+key);
            //查询
            String querySql = "select id , name ,age from student";
            ps = connection.prepareStatement(querySql);
            rs = ps.executeQuery();
            //获取结果集的元数据相关信息
            ResultSetMetaData metaData = rs.getMetaData();
            //列数
            int count = metaData.getColumnCount();
            for(int i = 1; i <= count; i++){
                System.out.print(metaData.getColumnName(i)+" ");
            }
            System.out.println();
            //查询结果打印
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println(id+" "+name+" "+age);
            }
            //提交
            connection.commit();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            if(connection != null){
                try {
                    //出现异常回滚
                    connection.rollback();
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        }finally {
            JDBCUtil.close(connection, ps, rs);
        }

    }
}

输出结果:

成功插入1条数据
插入数据的主键:2
id name age 
1 zhangsan 30
2 lisi 20

事业有成插入了 lisi 那条记下,且再次回到主键为2.末尾打字与印刷了列名和查询获得的多少

此处用了政工的回滚,假设保留完事后再查询的高级中学级出现很是,数据是不会存到数据库的,能够入手试下。

1.纯 sql 语句,执行后有三种回到格局:

cmd.ExecuteScalar();  //
查询结果仅一行一列,直接收取

string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
MySqlCommand cmd = conn.CreateCommand();
string name = "Tom";
cmd.CommandText = string.Format("select  count(*) from student where Name = '{0}';", name);
object obj = cmd.ExecuteScalar(); //可能未null
int count = 0;
if (!obj.Equals(DBNull.Value))
{
  count = Convert.ToInt32(obj);
}  
conn.Close();  

 

 

MySqlDataReader
reader = cmd.ExecuteReader();  // 通过 reader 获得大批量多少

string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandText = string.Format("select  Name from student;");
MySqlDataReader reader = cmd.ExecuteReader();
List<string> list = new List<string>();
while (reader.Read())
{
    list.Add(reader.GetString("Name"));
}
reader.Close();
conn.Close();

 

cmd.ExecuteNonQuery();  //
获得增删改语句执行后影响的行数

string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
MySqlCommand cmd = conn.CreateCommand();
string name = "Tom";
cmd.CommandText = string.Format("update student SET Name='Tommy' where Name = '{0}';", name);
int count = cmd.ExecuteNonQuery();
conn.Close();

 

平凡
sql 语句的败笔:假若地点例子中的 name 参数中涵盖单引号,整个 sql
语句将实施错误,因为未对特殊字符进行转义。重要特殊字符有单引号,反斜杠,#
等,而那些特殊字符在区别的行使境况下有时供给转义,有时不必要转义。Mysql
提供了接近 QUOTE(str) 那样的字符串处理函数,但无法一心满意供给。

那就是sql 注入,sql
注入的定义网上资料较多,在此不再赘述,而常用的消除方案是使用参数化的 sql
语句。

  2,新建项目,添加引用——“增加”,添加Mysql.Data;假诺是一直解压版,然后径直抬高对MySql.Data.dll的文本的引用
    static void Main(string[] args)
    {
      string connStr =
ConfigurationManager.ConnectionStrings[“connStr”].ToString();
      using (SqlConnection conn = new SqlConnection(connStr))
      using (SqlCommand cmd = conn.CreateCommand())
      {
        conn.Open();
        cmd.CommandText = “insert into t_fuxi “;
        int count = cmd.ExecuteNonQuery();
        Console.WriteLine(count+”受到震慑”);
        Console.ReadKey();
      }
    }

  2,新建项目,添加引用——“增加”,添加Mysql.Data;假诺是直接解压版,然后径直抬高对MySql.Data.dll的文件的引用
    static void Main(string[] args)
    {
      string connStr =
ConfigurationManager.ConnectionStrings[“connStr”].ToString();
      using (SqlConnection conn = new SqlConnection
      using (SqlCommand cmd = conn.CreateCommand
4858.com,      {
        conn.Open();
        cmd.CommandText = “insert into t_fuxi “;
        int count = cmd.ExecuteNonQuery();
        Console.WriteLine(count+”受到震慑”);
        Console.ReadKey();
      }
    }

四 、JDBC的批量操作

PrepareStatement和Statement都提供了能够批量操作SQL的章程

1.将sql添加至缓存区

Statement: addBatch(sql)方法,能够将sql直接添加Statement缓存区;

PrepareStatement:必要先实施setxxx(n,参数)方法将参数赋值,然后调用addBatch(sql)方法

2.执行executeBatch()将参数批量发送到数据库,并且实施

3.能够使用clearBatch()清空缓存区的参数或然sql

package com.huan.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;

import org.junit.Test;

public class JDBCBatchDemo {


    @Test
    public void testJdbcPrepareBatch(){

        Connection connection = null;
        PreparedStatement ps = null;

        try {
            connection = JDBCUtil.getConnection();
            String sql  = "insert into student (name,age) values (?,?)";
            ps = connection.prepareStatement(sql);
            ps.setString(1, "ps1");
            ps.setInt(2, 11);
            ps.addBatch();
            ps.setString(1, "ps2");
            ps.setInt(2, 12);
            ps.addBatch();
            int [] n = ps.executeBatch();
            System.out.println(Arrays.toString(n));    
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }




    }


    @Test
    public void testJdbcStatementBatch(){
        Connection connection = null;
        Statement st = null;
        try {
            connection = JDBCUtil.getConnection();
            String sql1 = "insert into student(name,age) values('statement1',20)";
            String sql2 = "insert into student(name,age) values('statement2',30)";
            String sql3 = "insert into student(name,age) values('statement3',40)";

            st = connection.createStatement();
            //批量添加
            st.addBatch(sql1);
            st.addBatch(sql2);
            st.addBatch(sql3);
            //执行
            int [] n = st.executeBatch();

            System.out.println(Arrays.toString(n));

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            JDBCUtil.close(connection, st, null);
        }
    }


}

testJdbcStatementBatch()测试方法完毕后翻看数据库,数据成功添加:

4858.com 1

testJdbcPrepareBatch()测试方法执行之后查看数据库,数据成功添加:

4858.com 2

2.sql 语句和 sql 参数

饱含参数的
sql 语句和 sql 参数会分开传入数据库服务器中,服务器先将 sql
语句进行编写翻译,然后将 sql 参数导入编译后的 sql
语句中(在此进度中机动对特殊字符进行转义),从而从根源上预防了 sql
注入的产生。

string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select  count(*) from student where Name = @Name;";
MySqlParameter[] sps = new MySqlParameter[1];
sps[0] = new MySqlParameter("@Name", "Tom");
cmd.Parameters.AddRange(sps);
object obj = cmd.ExecuteScalar(); //可能未null
int count = 0;
if (!obj.Equals(DBNull.Value))
{
    count = Convert.ToInt32(obj);
}   
conn.Close();  

    代码解释:
    1,MySQLConnection、MySQLCommend完成了IDisposable接口,由此利用using实行能源回收

    代码解释:
    1,MySQLConnection、MySQLCommend达成了IDisposable接口,因而利用using举办能源回收

五、连接池(数据源)的使用

连接池能够重用数据库的接连,控制数据库的连接总数,当关闭从连接池中获得的连续时,只是将此一而再归还给连接池,没有真的的与数据库断开连接。

引用的连接池有:DBCP和c3p0

1)c3p0的使用

官网下载jar包,将c3p0-0.9.5.2.jar和mchange-commons-java-0.2.11.jar出席项目中。

package com.huan.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;


public class C3p0DataSourceDemo {

    public static void main(String[] args) {
        Connection connection = null;

        try {
            ComboPooledDataSource cpds = new ComboPooledDataSource();
            //配置连接池参数
            cpds.setDriverClass("com.mysql.jdbc.Driver");
            cpds.setJdbcUrl("jdbc:mysql://localhost:3306/huan");
            cpds.setUser("root");
            cpds.setPassword("root");
            //连接池的管理策略 ...
            //最小连接数量
            cpds.setMinPoolSize(5);
            //最大连接数量
            cpds.setMaxPoolSize(20);
            //超时时间ms
            cpds.setCheckoutTimeout(10000);
            //获取连接
            connection = cpds.getConnection();
            String sql = "select id,name,age from student";
            PreparedStatement ps = connection.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("id:"+id+" name:"+name+" age:"+age);
            }

            rs.close();
            ps.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}

出口结果:

id:1 name:zhangsan age:30
id:2 name:lisi age:20
id:3 name:statement1 age:20
id:4 name:statement2 age:30
id:5 name:statement3 age:40
id:6 name:ps1 age:11
id:7 name:ps2 age:12

2)DBCP的使用

官网下载jar包,将commons-logging-1.2.jar,commons-dbcp2-2.1.1.jar和commons-pool2-2.4.2.jar下载后导入项目

package com.huan.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.commons.dbcp2.BasicDataSource;

public class DBCPDemo {
    public static void main(String[] args) {
        Connection connection = null;

        try {
            BasicDataSource bds = new BasicDataSource();
            // 连接参数
            bds.setDriverClassName("com.mysql.jdbc.Driver");
            bds.setUrl("jdbc:mysql://localhost:3306/huan");
            bds.setUsername("root");
            bds.setPassword("root");
            // 管理策略参数
            bds.setInitialSize(5);
            bds.setMinIdle(5);
            bds.setMaxTotal(20);
            bds.setMaxWaitMillis(10000);

            connection = bds.getConnection();
            String sql = "select id,name,age from student";
            PreparedStatement ps = connection.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("id:" + id + " name:" + name + " age:" + age);
            }

            rs.close();
            ps.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }

            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}

输出结果:

id:1 name:zhangsan age:30
id:2 name:lisi age:20
id:3 name:statement1 age:20
id:4 name:statement2 age:30
id:5 name:statement3 age:40
id:6 name:ps1 age:11
id:7 name:ps2 age:12

至于JDBC的一对总计就写这么多了~~

3.事务

多条 sql 语句的组合会现身某一条 sql 语句执行出错,而别的 sql
语句顺遂推行的气象,那或者与预期不合乎。此时急需选拔工作。

业务在履行出错开上下班时间能够回滚。

思想政治工作往往带有多条 sql 语句,在动用参数化的 sql
语句时要留意参数名称不可能平等。

conn.Open();
MySqlCommand cmd = conn.CreateCommand();
MySqlTransaction myTrans = conn.BeginTransaction();
cmd.Connection = conn;
cmd.Transaction = myTrans;
cmd.CommandText = "";
cmd.ExecuteNonQuery();
myTrans.Commit();
conn.Close();

 

 

    2,”Server=localhost;Database=study1;uid=root;pwd=root;Charset=utf8″叫连接字符串,
      Server是Mysql服务器的地方,Database是一而再的数据库,uid、pwd是用户名和密码,选取utf8编码

    2,”Server=localhost;Database=study1;uid=root;pwd=root;Charset=utf8″叫连接字符串,
      Server是Mysql服务器的地方,Database是接二连三的数据库,uid、pwd是用户名和密码,选取utf8编码

4.仓库储存进程

甭管是 sql
语句依旧业务,在传输指令的时候都亟待消耗大批量的时刻,数据库编写翻译那个指令也亟需消耗多量时刻,那不利于高访问量的数据库的运作。

存款和储蓄进度是将 sql
指令写在数据库中,此时数据库直接到位编写翻译,与数据库通信是只须求传递参数即可。节省了传输时间和编写翻译时间。

conn.Open();
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "SpFillStudent";

MySqlParameter paraMoney;
paraMoney = cmd.Parameters.Add("@inMoney", MySqlDbType.Decimal);
paraMoney.Direction = ParameterDirection.Input;
paraMoney.Value = 50;

MySqlParameter paraTradeType;
paraTradeType = cmd.Parameters.Add("@inTradeType", MySqlDbType.String);
paraTradeType.Direction = ParameterDirection.Input;
paraTradeType.Value = "会员卡充值";

MySqlParameter paraPayDetailStr;
paraPayDetailStr = cmd.Parameters.Add("@inPayDetailStr", MySqlDbType.String);
paraPayDetailStr.Direction = ParameterDirection.Input;
paraPayDetailStr.Value = "";

MySqlParameter paraOutResult;
paraOutResult = cmd.Parameters.Add("@outResult", MySqlDbType.String);
paraOutResult.Direction = ParameterDirection.Output;

cmd.ExecuteNonQuery();
string result = (string)paraOutResult.Value;
conn.Close();

 

    3,conn.Open();在履行MySqlCommand以前一定要先打开数据库连接,不然会报错

    3,conn.Open();在推行MySqlCommand此前一定要先打开数据库连接,不然会报错

    4,ExecuteNoQuery是实践Update、Insert、Delete等非查询语句,重临值为受影响的行数

    4,ExecuteNoQuery是实施Update、Insert、Delete等非查询语句,再次来到值为受影响的行数

  3,ExecuteScalar
    执行查询,并重返查询所再次回到的结果集中第三行的率先列,忽略别的行列。一般用来大约的拿走自由一行一列的查询结果的值

  3,ExecuteScalar
    执行查询,并回到查询所再次来到的结果集中第三行的首先列,忽略别的行列。一般用来总结的获得自由一行一列的询问结果的值

    案例1
    cmd.CommandText = “Select count(*) from T_Users”;
    long count = (long)cmd.ExecuteScalar();

    案例1
    cmd.CommandText = “Select count from T_Users”;
    long count = cmd.ExecuteScalar();

    案例2
    cmd.CommandText = “Select Password from T_Users where UserName
= ‘admin'”;
    string pwd = (string)cmd.ExecuteScalar();
    if(string.isNullOrEmpty(pwd))
    {
      Console.WriteLine(“找不到admin”);
    }
    else
    {
      Console.WriteLine(“admin的密码:”+pwd);
    }

    案例2
    cmd.CommandText = “Select Password from T_Users where UserName
= ‘admin'”;
    string pwd = cmd.ExecuteScalar();
    if(string.isNullOrEmpty
    {
      Console.WriteLine(“找不到admin”);
    }
    else
    {
      Console.WriteLine(“admin的密码:”+pwd);
    }

  4,执行查询 MySqlDataReader

  4,执行查询MySqlDataReader

    cmd.CommandText = “select * from T_Users”;
    using(MySqlDataReader reader = cmd.ExecuteReader())
    {
      while(reader.Read())
      {
        long id = reader.GetInt64(“Id”);
        string userName = reader.GetString(“UserName”);
        string passWord = reader.GetString(“Password”);
        Console.WriteLine(“id=”+id+”;UserName=”+userName+”;Password=”+passWord);
      }
    }

    cmd.CommandText = “select * from T_Users”;
    using(MySqlDataReader reader = cmd.ExecuteReader
    {
      while(reader.Read
      {
        long id = reader.GetInt64;
        string userName = reader.GetString(“UserName”);
        string passWord = reader.GetString(“Password”);
        Console.WriteLine(“;UserName=”+userName+”;Password=”+passWord);
      }
    }

    注意:
      里德r的遍历、读取时索要Connection保持接二连三,假诺关闭了Connection,使用会出错
      也能够依照列序号获取列的值,功能略高,不进程序不便于读;通过reeder.GetOrdinal(“Age”)获取列名对应的行列号

    注意:
      Reader的遍历、读取时需求Connection保持一连,固然关闭了Connection,使用会出错
      也能够依照列序号获取列的值,功能略高,不进度序不不难读;通过reeder.GetOrdinal获取列名对应的种类号

③ 、SQL注入漏洞

③ 、SQL注入漏洞

  1,是由于Sql语句的拼凑造成的,
    在先后接收用户的输入时,供给考虑用户输入的剧情对数据库操作发生的震慑,

  1,是出于Sql语句的拼凑造成的,
    在先后接收用户的输入时,必要考虑用户输入的内容对数据库操作产生的熏陶,

  2,对应的化解措施,参数化查询

  2,对应的消除方法,参数化查询

    cmd.CommandText = “select count(*) from TUsers where
username=@username and password=@password”;
    cmd.Parameters.Add(new SqlParameter() { ParameterName =
“@UserName”, Value = username });
    cmd.Parameters.Add(new SqlParameter() { ParameterName =
“@Password”, Value = password });

    cmd.CommandText = “select count from TUsers where
username=@username and password=@password”;
    cmd.Parameters.Add(new SqlParameter() { ParameterName =
“@UserName”, Value = username });
    cmd.Parameters.Add(new SqlParameter() { ParameterName =
“@Password”, Value = password });

    为啥那样能够免止“SQL注入漏洞”,
    由此使用参数化查询,就足以对用户输入的剧情展开判断和拍卖了,本质上是参数赋值

    为啥那样可防止止“SQL注入漏洞”,
    因而使用参数化查询,就能够对用户输入的情节展开判定和处理了,本质上是参数赋值

    注意:
    1,全体SQL中都能够利用参数化查询传递;表名、字段名等不能够应用参数化实行轮换
    2,不要用SqlParameter(string parameterName,object
value)那几个构造函数,
    因为(“Age”,0)会被匹配成Sqlparameter(string
parameterName,SqlDbType dbType)那几个构造函数

    注意:
    1,全部SQL中都能够采用参数化查询传递;表名、字段名等无法使用参数化实行轮换
    2,不要用SqlParameter(string parameterName,object
value)那些构造函数,
    因为会被匹配成Sqlparameter(string parameterName,SqlDbType
dbType)这一个构造函数

肆 、基本数据类型为空的题材

四 、基本数据类型为空的难题

  1,把T_Persons表的Name、Age列修改为“允许为空”,插入一条Name、Age为空的行
    执行后意识,对于空数据reader.Get**方法会抛相当SqlNullValueException,
    也正是问数据库“当前行的Name”是怎样,数据库告诉您“不精通”。

  1,把T_Persons表的Name、Age列修改为“允许为空”,插入一条Name、Age为空的行
    执行后意识,对于空数据reader.Get**方法会抛极度SqlNullValueException,
    也等于问数据库“当前行的Name”是怎么着,数据库告诉你“不掌握”。

    怎么消除?
    使用ISDBNull获取钦赐序号的列的值是还是不是为null

    怎么消除?
    使用ISDBNull获取钦命序号的列的值是还是不是为null

    int? age = null;
    if(!reader.IsDBNull(reader.GetOrdinal(“Age”)))
    {
      age = reader.GetInt32(“Age”);
    }

    int? age = null;
    if(!reader.IsDBNull(reader.GetOrdinal
    {
      age = reader.GetInt32;
    }

5、离线结果集DataSet

⑤ 、离线结果集DataSet

  DATA里德r是服务器结果集游标的呈现,全部查询出来的数量都在MySql服务器上。
  好处是:当查问结果数据量打客车时候制止占用地面内部存款和储蓄器。

  DATAReader是服务器结果集游标的体现,全体查询出来的数额都在MySql服务器上。
  好处是:当查问结果数据量打客车时候制止占用地面内部存款和储蓄器。

  但是多数类别中都会幸免大查询结果,由此缺点就明摆着了
  读取的时候必须维持Connection,不仅用起来麻烦,而且会较长期占用MySql服务器的连天能源

  可是多数品类中都会幸免大查询结果,因而缺点就明显了
  读取的时候必须保证Connection,不仅用起来麻烦,而且会较长期占用MySql服务器的连年龄资历源

  DataSet是2个离线结果集容器,它把结果数据放到本地内部存款和储蓄器中。
  因为查询结果恐怕会包蕴四个表,由此DataSet包罗若干DataTable(ds.Tables),
  DataTable包罗若干DataRow(dt.Rows)

  DataSet是四个离线结果集容器,它把结果数据放到本地内存中。
  因为查询结果只怕会包括多少个表,因此DataSet包罗若干DataTable(ds.Tables),
  DataTable包括若干DataRow

  用法1:
  DataSet ds = new DataSet();
  MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
  adapter.Fill(ds);
  DataTable table = ds.Tables[0];

  用法1:
  DataSet ds = new DataSet();
  MySqlDataAdapter adapter = new MySqlDataAdapter;
  adapter.Fill;
  DataTable table = ds.Tables[0];

六、DataTable
  DataSet能够盛放五个查询结果集到DataTable

六、DataTable
  DataSet能够盛放多少个查询结果集到DataTable

  DataAdapter还足以对结果开始展览傻瓜化更新、删除、修改。

  DataAdapter还可以对结果开始展览傻瓜化更新、删除、修改。

  我们一般查询结果集就多少个DataTable,DataAdapter的傻瓜化更新不相符专业的类别,由此有更简约的用法

  大家一般查询结果集就二个DataTable,DataAdapter的傻瓜化更新不相符专业的品种,由此有更不难的用法

  DataTable dt = new DataTable();
  dt.Load(reader);

  DataTable dt = new DataTable();
  dt.Load;

  注意: 把DataTable表明到using外,using外再利用查询结果

  注意:把DataTable证明到using外,using外再选拔查询结果

  遍历DataTable

  遍历DataTable

  for(int i =0;i<dt.Rows.Count;i++)
  {
    DataRow row = dt.Rows[i];
    string name =
row.IsNull(“name”)?null:(string)row[“Name”];//NULL处理
    Console.WriteLine(“name=”+name);
  }

  for(int i =0;i<dt.Rows.Count;i++)
  {
    DataRow row = dt.Rows[i];
    string name = row.IsNull?null:row[“Name”];//NULL处理
    Console.WriteLine(“name=”+name);
  }

⑦ 、封装3个库:分析

⑦ 、封装一个库:分析

  1,ADO.Net的连年字符串写到配置文件中。

  1,ADO.Net的连接字符串写到配置文件中。

  2,每一次操作数据库都要写一坨代码,太累,因而封装1个简化ADO.Net操作的库出来:
    配置文件的安装连接字符串;简化连接的始建;简化SQL的实施

  2,每一趟操作数据库都要写一坨代码,太累,由此封装3个简化ADO.Net操作的库出来:
    配置文件的安装连接字符串;简化连接的始建;简化SQL的实行

  3,尽管3个操作要实行多条SQL语句,假使每条都开辟2个总是——执行——关闭连接的话,功效会好低,而且会有“事务”的难题。
    因而应该提供“打开、执行、关闭”那样的措施,也要提供“使用后现有连接执行的艺术”。

  3,要是一个操作要推行多条SQL语句,若是每条都开辟二个一而再——执行——关闭连接的话,效用会很低,而且会有“事务”的标题。
    因而相应提供“打开、执行、关闭”那样的方式,也要提供“使用后现有连接执行的方法”。

  4,参数化查询的查询参数个数不鲜明,可变长度参数会更方便人民群众

  4,参数化查询的询问参数个数不鲜明,可变长度参数会更有益

  5,为了有利于超越3/6情景下的小结果集,执行查询重临DataTable

  5,为了有利于半数以上景色下的小结果集,执行查询再次回到DataTable

捌 、MySqlHelper方法规划

⑧ 、MySqlHelper方法规划

  1,public static MySqlConnection CreateConnection()

  1,public static MySqlConnection CreateConnection()

  2,public static int ExecuteNonQuery(MySqlConnection conn,string
sql,params MySqlParameter[] parameters)

  2,public static int ExecuteNonQuery(MySqlConnection conn,string
sql,params MySqlParameter[] parameters)

  3,public static int ExecuteNonQuery(string sql,params
MySqlParameter[] parameters)

  3,public static int ExecuteNonQuery(string sql,params
MySqlParameter[] parameters)

  4,public static object ExecuteScalar(MySqlConnection conn,string
sql,params MySqlParameter[] parameters)

  4,public static object ExecuteScalar(MySqlConnection conn,string
sql,params MySqlParameter[] parameters)

  5,public static object ExecuteScalar(string sql,params
MySqlParameter[] parameters)

  5,public static object ExecuteScalar(string sql,params
MySqlParameter[] parameters)

  6,public static DataTable ExecuteQuery(MySqlConnection conn, string
sql, params MySqlParameter[] parameters)

  6,public static DataTable ExecuteQuery(MySqlConnection conn, string
sql, params MySqlParameter[] parameters)

  7,public static DataTable ExecuteQuery(string sql, params
MySqlParameter[] parameters)

  7,public static DataTable ExecuteQuery(string sql, params
MySqlParameter[] parameters)

九、实现MySqlHelper

九、实现MySqlHelper

  1,连接字符串一般配备到App.config(网站是Web.config)中的<connectionStrings>段中
    然后使用ConfigurationManager类(要求丰盛对System.Configuration的引用)读取
    string connStr =
ConfigurationManager.ConnectionStrings[“connStr”].ConnectionString
    

  1,连接字符串一般配备到App.config(网站是Web.config)中的<connectionStrings>段中
    然后选取ConfigurationManager类(须求添加对System.Configuration的引用)读取
    string connStr =
ConfigurationManager.ConnectionStrings[“connStr”].ConnectionString
    

    注意:
    一定要力保代码中的名字和布置文件中的名字是相同的

    注意:
    一定要力保代码中的名字和配备文件中的名字是一致的

  2,别的办法的落到实处

  2,别的艺术的贯彻

  3,测试几个法子,调用不必要本身控制连接的,再调用公用2个接连的

  3,测试多少个措施,调用不须求团结控制连接的,再调用公用3个老是的

10、得到自行增加字段的值

⑩ 、获得自行拉长字段的值

  1,不能够用插入后收获最大值的措施,有出现难题

  1,无法用插入后得到最大值的方法,有现身问题

  2,要在同2个接连中:select LAST_INSERT_ID()

  2,要在同1个连连中:select LAST_INSERT_ID()

  3,可以Insert、LAST_INSERT_ID()在同二个老是中独立实施,也能够把LAST_INSERT_ID()放到insert语句前边用;
    分割(使用ExecuteScalar执行即可)

  3,可以Insert、LAST_INSERT_ID()在同几个一而再中单独实施,也足以把LAST_INSERT_ID()放到insert语句前边用;
    分割(使用ExecuteScalar执行即可)

十壹 、事务基础

十一 、事务基础

  1,有三个须求,类似于转账,从汤姆的工资上转走10元,转到杰瑞的薪给上加码10元

  1,有贰个需要,类似于转账,从汤姆的薪给上转走10元,转到杰瑞的工钱上加码10元

    Update T_Employees Set Salary = Salary – 10 where Name =
‘Tom’
    Update T_Employees Set Salary = Salary + 10 where Name =
‘Jerry’

    Update T_Employees Set Salary = Salary – 10 where Name =
‘Tom’
    Update T_Employees Set Salary = Salary + 10 where Name =
‘Jerry’

    借使履行从杰里账上加10元的时候实施出错(使用SQL语法写错误模拟),那么就会产出总体丢失10元的标题,要是是转载呢?

    要是推行从杰瑞账上加10元的时候实施出错(使用SQL语法写错误模拟),那么就会见世总体丢失10元的难题,要是是转载呢?

  2,事务(Transaction)有四大特征:
    原子性、一致性、隔离性、持久性
    原子性指的是:多少个操作依然都成功,要么都未果

  2,事务(Transaction)有四大特征:
    原子性、一致性、隔离性、持久性
    原子性指的是:多少个操作依然都事业有成,要么都未果

十二、ADO.Net事务

十二、ADO.Net事务

  1,要在二个接连中(不然要提到到分布式事务)
    MySqlTransaction tx = conn.BeginTransaction();
    操作甘休后执行tx.Commit()提交业务;
    固然推行出错,则tx.Rollback()回滚(当前政工的操作全体撤除)

  1,要在八个总是中(不然要提到到分布式事务)
    MySqlTransaction tx = conn.BeginTransaction();
    操作截止后执行tx.Commit()提交业务;
    假如执行出错,则tx.Rollback()回滚(当前思想政治工作的操作全体裁撤)

    示例代码:
    MySqlTransaction tx = conn.BeginTransaction();
    try
    {
      MySqlHelper.ExecuteNonQuery(conn,”Update T_Accounts set
Amount = Amount-1000 where Number =’0001′”);
      string s = null;
      s.ToLower();//创立极度
      MySqlHelper.ExecuteNonQuery(conn, “Update t_accounts Set
Amount=Amount+1000 where Number=’0002′”);
      tx.Commit();
    }
    catch(Exception ex)
    {
      tx.Rollback();
    }

    示例代码:
    MySqlTransaction tx = conn.BeginTransaction();
    try
    {
      MySqlHelper.ExecuteNonQuery(conn,”Update T_Accounts set
Amount = Amount-1000 where Number =’0001′”);
      string s = null;
      s.ToLower();//创造格外
      MySqlHelper.ExecuteNonQuery(conn, “Update t_accounts Set
Amount=Amount+1000 where Number=’0002′”);
      tx.Commit();
    }
    catch(Exception ex)
    {
      tx.Rollback();
    }

    事务还有隔开分离级别、嵌套事务等题材

    事务还有隔开级别、嵌套事务等题材

十三、SQLServer的使用

十三、SQLServer的使用

  1,安装,版本:二零零六有包容性的难题,有bug、由此推荐安装SQLServer 二〇一〇冠道2

  1,安装,版本:二零零六有包容性的题目,有bug、由此推荐安装SQLServer 2009安德拉2

  2,Management Studio的使用

  2,Management Studio的使用

    SQLServer的二种连接格局:
    Windows 身份验证(相互信任的局域网中);
    SQLServer身份验证(使用SQLServer用户名密码验证,密码要复杂一点)。
    Windows 身份验证还有一个用途:忘了sa密码,能够本机进去改。

    SQLServer的两种连接方式:
    Windows 身份验证(相互信任的局域网中);
    SQLServer身份验证(使用SQLServer用户名密码验证,密码要复杂一点)。
    Windows 身份验证还有五个用途:忘了sa密码,能够本机进去改。

  3,新建数据库、新建表
    SQLServer的数据类型
    (varchar和nvarchar;nvarchar(n)和nvarchar(MAX);
    long是bigint;
    获取前10条数据: select top 10 * from t_persons )、
    SQLServer的自发性增进(是标识)、不供给新鲜钦命编码

  3,新建数据库、新建表
    SQLServer的数据类型
    (varchar和nvarchar;nvarchar和nvarchar;
    long是bigint;
    获取前10条数据: select top 10 * from t_persons )、
    SQLServer的全自动增进、不须要特别钦赐编码

  4,保存表设计修改的时候,就算报错“差异意保留更改”:
    工具→选项→Designers→把“阻止保存须要再度创造表的更高”勾选掉。
    遭逢报错新闻:要先仔细翻阅。

  4,保存表设计修改的时候,假使报错“不容许保留更改”:
    工具→选项→Designers→把“阻止保存要求重复创建表的更高”勾选掉。
    碰着报错音讯:要先仔细翻阅。

  5,执行SQL语句(数据库上点右键“新建查询”,不要点【调节和测试】)

  5,执行SQL语句(数据库上点右键“新建查询”,不要点

十四、ADO.Net连接SQLServer
  1,ADO.Net如何连接SQLServer:
    SQLServer驱动内置

十四、ADO.Net连接SQLServer
  1,ADO.Net咋样连接SQLServer:
    SQLServer驱动内置

  2,连接字符串:
    server=ip;user id =sa;passWord = 密码;database = db1

  2,连接字符串:
    server=ip;user id =sa;passWord = 密码;database = db1

  3,SQLHelper:
    把MySql替换到Sql就能够了

  3,SQLHelper:
    把MySql替换到Sql就能够了

  4,获得活动拉长列的值:
    Insert into t1(…) output insert.Id values(….)

  4,获得自行拉长列的值:
    Insert into t1 output insert.Id values

  5,假如依照接口编制程序,只要改变CreateConnection就能够了,查询参数以Directory<string,object>传递
    假使运用Provider,连代码都不用改,改配置文件即可

  5,倘诺依据接口编制程序,只要改变CreateConnection就足以了,查询参数以Directory<string,object>传递
    假若应用Provider,连代码都无须改,改配置文件即可

 

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有