当前位置: 首页 > news >正文

盐城网站优化在局网站 作风建设

盐城网站优化,在局网站 作风建设,互联网营销师在哪里报名,广告联盟挂机赚钱//Author 流云 //Version 1.0 一. 引言 1.1 如何操作数据库 使用客户端工具访问数据库#xff0c;需要手工建立连接#xff0c;输入用户名和密码登录#xff0c;编写 SQL 语句#xff0c;点击执行#xff0c;查看操作结果#xff08;结果集或受影响行数#xff09;。… //Author 流云 //Version 1.0 一. 引言 1.1 如何操作数据库 使用客户端工具访问数据库需要手工建立连接输入用户名和密码登录编写 SQL 语句点击执行查看操作结果结果集或受影响行数。     1.2 实际开发中不会采用数据库客户端操作 在实际开发中当用户的数据发生改变时不可能通过客户端操作执行 SQL 语句因为操作量过大无法保证效率和正确性。      二. JDBC 2.1 介绍 JDBCJava Database Connectivity Java 连接数据库的规范标准可以使用 Java 语言连接数据库完成 CRUD 操作。       2.2 核心思想 Java 中定义了访问数据库的接口可以为多种关系型数据库提供统一的访问方式。由数据库厂商提供驱动实现类Driver 数据库驱动。 2.3 驱动包 mysql-connector-java-5.1.X 适用于 5.X 版本 mysql-connector-java-8.0.X 适用于 8.X版本    2.4 常用类 JDBC 是由多个接口和类进行功能实现。      2.5 环境搭建 在项目下新建 lib 文件夹用于存放 jar 文件。 将 mysql 驱动mysql-connector-java-5.1.X复制到项目的 lib 文件夹中。 选中 lib 文件夹右键 Add as Libraay点击 OK。      三. 开发步骤 3.1 注册驱动 使用 Class.forName(com.mysql.jdbc.Driver);手动加载字节码文件到 JVM 中。 Class.forName(com.mysql.jdbc.Driver);//加载驱动    3.2 连接数据库 通过 DriverManager.getConnection(url,user,password) 获取数据库连接对象。         URL:jdbc:mysql://localhost:3306/database         username:root         password:1234 Connection conn DriverManager.getConnection(jdbc:mysql://localhost:3306/database? useUnicodetruecharacterEncodingutf8, root,1234);    URL(Uniform Resource Locator) 统一资源定位符由协议、IP、端口、SID程序实例名称组成。     3.3 获取执行对象 通过 Connection 对象获得 Statement 对象用于对数据库进行通用访问。 Statement statement conn.createStatement();    3.4 执行SQL 语句 执行 SQL 语句并接收执行结果。 String sql INSERT INTO t_jobs(JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY) VALUES(JAVA_Le,JAVA_Lecturer,4000,10000);;int result statement.executeUpdate(sql);//执行SQL语句并接收结果     注意在编写 DML 语句时一定要注意字符串参数的符号是单引号 值。 DML 语句增删改时返回受影响行数int 类型。 DQL 语句查询时返回结果数据(ResultSet 结果集)。      3.5 处理结果 接受处理操作结果。 if(result 1){System.out.println(Success); }     受影响行数逻辑判断、方法返回。 查询结果集迭代、依次获取。    3.6 释放资源 遵循先开后关原则释放所使用到的资源对象。 statement.close(); conn.close();     3.7 综合案例 整合以上核心六步实现向数据库表中插入一条数据。 package com.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class DeleteJdbc {public static void main(String[] args) throws Exception{//1.加载驱动Class.forName(com.mysql.jdbc.Driver);//2.获得连接对象Connection connection DriverManager.getConnection(jdbc:mysql://localhost:3306/companydb,root,1234);//3.获得执行SQL的对象Statement statement connection.createStatement();//4.执行SQL语句并接收结果int result statement.executeUpdate(delete from t_jobs where job_id H5_mgr;);//5.处理结果if(result1){System.out.println(删除成功);}else{System.out.println(删除失败);}//6.释放资源statement.close();connection.close();} }    四. ResultSet 在执行查询 SQL 后存放查询到的结果集数据。    4.1 接收结果集 ResultSet rs statement.executeQuery(sql); ResultSet rs statement.executeQuery(SELECT * FROM t_employees;);    4.2 遍历结果集 ResultSet 以表table结构进行临时结果的存储需要通过 JDBC API 将其中数据进行依次获取。         数据行指针初始位置在第一行数据前每调用一次 boolean next()方法ResultSet 的指针向下移动一行结果为 true表示当前行有数据。         rs.getXxx(整数);代表根据列的编号顺序获得从 1 开始。         rs.getXxx(列名);代表根据列名获得。 boolean next() throws SQLException //判断 rs 结果集中下一行是否存在数据    4.2.1 遍历方法 int getInt(int columnIndex) throws SQLException //获得当前行第N列的int值 int getInt(String columnLabel) throws SQLException //获得当前行columnLabel列的int值double getDouble(int columnIndex) throws SQLException //获得当前行第N列的double值 double getDouble(String columnLabel) throws SQLException //获得当前行columnLabel列的double值String getString(int columnIndex) throws SQLException //获得当前行第N列的String值 String getString(String columnLabel) throws SQLException //获得当前行columnLabel列的String值......    注意列的编号从 1 开始。    4.3 综合案例 对 t_jobs 表中的所有数据进行遍历。      4.3.1 根据列名 package com.www.test;import java.sql.*;public class JobsQuery {public static void main(String[] args) {//1.加载驱动Class.forName(com.mysql.jdbc.Driver);//2.获取数据库连接对象Connection connection DriverManager.getConnection(jdbc:mysql://localhost:3306/product, root, 1234);//3.获取发送 sql 语句对象Statement statement connection.createStatement();//4.执行 SQL 语句并接收结果集ResultSet resultSet statement.executeQuery(select * from t_jobs);//5 处理结果集while(resultSet.next()){//5.1有数据依据列名获取数据String job_id resultSet.getString(job_id);String job_title resultSet.getString(job_title);int min_salary resultSet.getInt(min_salary);int max_salary resultSet.getInt(max_salary);System.out.println(job_id\tjob_title\tmin_salary\tmax_salary);}//6.释放资源rs.close();statement.close();connection.close();} }4.3.2 根据编号 //。。。。与上无异 while(resultSet.next()){//5.2有数据依据列名获取数据String job_id resultSet.getString(1);String job_title resultSet.getString(2);int min_salary resultSet.getInt(3);int max_salary resultSet.getInt(4);System.out.println(job_id\tjob_title\tmin_salary\tmax_salary); } //释放资源    五. 常见错误 java.lang.ClassNotFoundException找不到类类名书写错误、没有导入jar包。 java.sql.SQLException与sql语句相关的错误 约束错误、表名列名书写错误 建议在客户端工具中测试SQL语句之后再粘贴在代码中。 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 原因列值Sting类型没有加单引号。 Duplicate entry 1 for key PRIMARY 原因主键值已存在或混乱更改主键值或清空表。 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column password in 原因可能输入的值的类型不对确定是否插入的元素时对应的值的类型正确。      六. 登录案例 6.1 创建表 创建一张用户表 User         id 主键、自动增长。         用户名字符串类型唯一、非空         密码字符串类型非空         手机号码字符串类型 插入 2 条测试语句     6.2 实现登录 通过控制台用户输入用户名和密码。 用户输入的用户名和密码作为条件编写查询 SQL 语句。 如果该用户存在提示登录成功反之提示失败。      七. SQL注入 7.1 介绍 用户输入的数据中有 SQL 关键字或语法并且参与了 SQL 语句的编译导致 SQL 语句编译后的条件含义为 true一直得到正确的结果。这种现象称为 SQL 注入。    7.2 方案 由于编写的 SQL 语句是在用户输入数据整合后再进行编译。所以为了避免 SQL 注入的问题我们要使 SQL 语句在用户输入数据前就已进行编译成完整的 SQL 语句再进行填充数据。    八. PreparedStatement PreparedStatement 继承了 Statement 接口执行 SQL 语句的方法无异。    8.1 应用 作用 预编译SQL 语句效率高。 安全避免SQL注入 。 可以动态的填充数据执行多个同构的 SQL 语句。    8.1.1 参数标记 //1.预编译 SQL 语句 PreparedStatement pstmt conn.prepareStatement(select * from user where username? and password?);    注意JDBC中的所有参数都由 符号占位这被称为参数标记。在执行SQL语句之前必须为每个参数提供值。       8.1.2 动态参数绑定 pstmt.setXxx(下标,值) 参数下标从 1 开始为指定参数下标绑定值。 //1.预编译 SQL 语句 PreparedStatement pstmt conn.prepareStatement(select * from user where username? and password?);//2.为参数下标赋值 pstmt.setString(1,username); pstmt.setString(2,password);    九. 封装工具类 在实际JDBC的使用中存在着大量的重复代码:例如连接数据库、关闭数据库等这些操作 我们需要把传统的JDBC代码进行重构抽取出通用的JDBC工具类以后连接任何数据库、释放资源都可以使用这个工具类。    9.1 重用性方案 封装获取连接、释放资源两个方法。         提供public static Connection getConnection(){}方法。         提供public static void closeAll(Connection conn , Statement sm , ResultSet rs){}方法。    9.1.1 实现 package com.jdbc;import java.sql.*;/** * 重用性方案 * 获取连接 * 释放资源 */public class DBUtils {static {//类加载执行一次try {Class.forName(com.mysql.jdbc.Driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}//1.获取连接public static Connection getConnection() {Connection connection null;try {connection DriverManager.getConnection(jdbc:mysql://localhost:3306/companydb, root,1234);} catch (SQLException e) {e.printStackTrace();}return connection;}//2.释放资源public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {try {if (resultSet ! null) {resultSet.close();}if (statement ! null) {statement.close();}if (connection ! null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}} }    9.2 跨平台方案 定义public static final Properties prop new Properties(); //读取配置文件的Map。 定义static{         //首次使用工具类时加载驱动 InputStream is JDBCUtil.class.getResourceAsStream(路径); //通过复用本类自带流读取jdbc.properties配置文件。classPath bin prop.load(is); //通过prop对象将流中的配置信息分割成键值对。 String driverName prop.getProperty(driver); //通过driverName的键获取对应的值com.mysql.jdbc.Driver Class.forName(driverName); //加载驱动。 }      9.2.1 实现 在src 目录下新建 db.properties 文件。 drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/mydb3 userroot password123456      工具类的封装。 package com.jdbc2;import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties;public class DBUtils {private static final Properties PROPERTIES new Properties();//存储配置文件的mapstatic {InputStream is DBUtils.class.getResourceAsStream(/db.properties);try {PROPERTIES.load(is);//通过流将配置文件内容加载到properties集合Class.forName(PROPERTIES.getProperty(driver));} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConnection() {Connection connection null;try {connection DriverManager.getConnection(PROPERTIES.getProperty(url),PROPERTIES.getProperty(username), PROPERTIES.getProperty(password));} catch (SQLException e) {e.printStackTrace();}return connection;}public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {try {if (resultSet ! null) {resultSet.close();}if (statement ! null) {statement.close();}if (connection ! null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}} }     十. ORM ORMObject Relational Mapping。 从数据库查询到的结果集(ResultSet)在进行遍历时逐行遍历取出的都是零散的数据。在实际应用开发中我们需要将零散的数据进行封装整理。     10.1 实体类 一行数据中多个零散的数据进行整理。 通过entity的规则对表中的数据进行对象的封装。 表名类名列名属性名提供各个属性的get、set方法。 提供无参构造方法、(视情况添加有参构造)。        10.1.1 ORM应用 entity实体类 package com.www.test;public class T_Jobs {private String job_id;private String job_title;private int min_salary;private int max_salary;Overridepublic String toString() {return T_Jobs{ job_id job_id \ , job_title job_title \ , min_salary min_salary , max_salary max_salary };}public String getJob_id() {return job_id;}public void setJob_id(String job_id) {this.job_id job_id;}public String getJob_title() {return job_title;}public void setJob_title(String job_title) {this.job_title job_title;}public int getMin_salary() {return min_salary;}public void setMin_salary(int min_salary) {this.min_salary min_salary;}public int getMax_salary() {return max_salary;}public void setMax_salary(int max_salary) {this.max_salary max_salary;}public T_Jobs() {}public T_Jobs(String job_id, String job_title, int min_salary, int max_salary) {this.job_id job_id;this.job_title job_title;this.min_salary min_salary;this.max_salary max_salary;} }     查询结果封装 package com.www.test;import java.sql.*;public class JobsQuery {public static void main(String[] args) {Connection connection null;Statement statement null;ResultSet resultSet null;String URL jdbc:mysql://localhost:3306/product;String user root;String password 1234;try {//1.加载驱动Class.forName(com.mysql.jdbc.Driver);//2.获取数据库连接对象connection DriverManager.getConnection(URL, user, password);//3.编写 SQL 语句String sql select * from t_jobs;//4.获取发送 sql 语句对象statement connection.createStatement();//5.执行 SQL 语句并接收结果集resultSet statement.executeQuery(sql);//5.1使用 while 循环判断下一行是否有数据while(resultSet.next()){//5.2有数据依据列名获取数据String job_id resultSet.getString(1);String job_title resultSet.getString(2);int min_salary resultSet.getInt(3);int max_salary resultSet.getInt(4);//5.3 创建实体类对象T_Jobs t_jobs new T_Jobs();//5.4 每列数据对应属性进行赋值t_jobs.setJob_id(job_id);t_jobs.setJob_title(job_title);t_jobs.setMin_salary(min_salary);t_jobs.setMax_salary(max_salary);System.out.println(t_jobs);}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {try {//6.释放资源if (resultSet ! null) {resultSet.close();}if (statement ! null) {statement.close();}if (connection ! null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}} }     十一. 数据访问对象 DAO 实现了业务逻辑与数据库访问相分离。         对同一张表的所有操作封装在XxxDaoImpl对象中。         根据增删改查的不同功能实现具体的方法insert、update、delete、select、 selectAll。    11.1 创建数据库 创建一张表 Person有以下列         idint主键自动增长         namevarchar(20) 非空         ageint 非空         bornDateDate         email字符串         address字符串     11.2 封装实体类 创建entity实体类 Person编写属性私有化构造方法get/set 方法。    11.3 编写 DaoImpl 类 编写 DaoImpl 类提供增删改查方法使用 JDBC 开发步骤完成功能。 package com.person;import sun.awt.image.DataBufferNative; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List;/** * 增、删、改、查单个、查所有 * 只做数据库访问操作不参与逻辑判断 * 数据库一张表的访问的操作复用 */public class PersonDaoImpl {//新增public int insert(Person person){Connection connection null;PreparedStatement preparedStatement null;String sql insert into person(name,age,borndate,email,address) values(?,?,?,?,?);;try {connection DBUtils.getConnection();preparedStatement connection.prepareStatement(sql);preparedStatement.setString(1,person.getName());preparedStatement.setInt(2,person.getAge());preparedStatement.setDate(3,null);preparedStatement.setString(4,person.getEmail());preparedStatement.setString(5,person.getAddress());int result preparedStatement.executeUpdate();return result;} catch (SQLException e) {e.printStackTrace();}finally {DBUtils.closeAll(connection,preparedStatement,null);}return 0;}//修改public int update(Person person){Connection connection null;PreparedStatement preparedStatement null;String sql update person setname?,age?,borndate?,email?,address? where id ?;try {connection DBUtils.getConnection();preparedStatement connection.prepareStatement(sql);preparedStatement.setString(1,person.getName());preparedStatement.setInt(2,person.getAge());preparedStatement.setDate(3,null);preparedStatement.setString(4,person.getEmail());preparedStatement.setString(5,person.getAddress());preparedStatement.setInt(6,person.getId());int result preparedStatement.executeUpdate();return result;} catch (SQLException e) {e.printStackTrace();}finally {DBUtils.closeAll(connection,preparedStatement,null);}return 0;}//删除public int delete(int id){Connection connection null;PreparedStatement preparedStatement null;String sql delete from person where id ?;;connection DBUtils.getConnection();try {preparedStatement connection.prepareStatement(sql);preparedStatement.setInt(1,id);int result preparedStatement.executeUpdate();return result;} catch (SQLException e) {e.printStackTrace();}finally {DBUtils.closeAll(connection,preparedStatement,null);}return 0;}//查单个public Person select(int id){Connection connection null;PreparedStatement preparedStatement null;ResultSet resultSet null;String sql select * from person where id ?;;Person person null;try {connection DBUtils.getConnection();preparedStatement connection.prepareStatement(sql);preparedStatement.setInt(1,id);resultSet preparedStatement.executeQuery();if(resultSet.next()){person new Person();int pid resultSet.getInt(id);String name resultSet.getString(name);int age resultSet.getInt(age);Date bornDate resultSet.getDate(borndate);String email resultSet.getString(email);String address resultSet.getString(address);person.setId(pid);person.setName(name);person.setAge(age);person.setBornDate(bornDate);person.setEmail(email);person.setAddress(address);}return person;} catch (SQLException e) {e.printStackTrace();}finally {DBUtils.closeAll(connection,preparedStatement,resultSet);}return null;}//查所有public ListPerson selectAll(){Connection connection null;PreparedStatement preparedStatement null;ResultSet resultSet null;Person person null;ListPerson personList new ArrayList();try {connection DBUtils.getConnection();preparedStatement connection.prepareStatement(select * from person;);resultSet preparedStatement.executeQuery();while(resultSet.next()){int pid resultSet.getInt(id);String name resultSet.getString(name);int age resultSet.getInt(age);Date bornDate resultSet.getDate(borndate);String email resultSet.getString(email);String address resultSet.getString(address);person new Person(pid,name,age,bornDate,email,address);personList.add(person);}return personList;} catch (Exception e) {e.printStackTrace();}return null;} }    十二. 三层架构 12.1 什么是三层  表示层 命名XXXView 职责收集用户的数据和需求、展示数据。     业务逻辑层 命名XXXServiceImpl 职责数据加工处理、调用DAO完成业务实现、控制事务。     数据访问层 命名XXXDaoImpl 职责向业务层提供数据将业务层加工后的数据同步到数据库。     12.2 三层搭建 utils 存放工具类DBUtils entity 存放实体类Person dao 存放 DAO 接口PersonDao         impl 存放 DAO 接口实现类PersonDaoImpl service 存放 service 接口PersonService         impl 存放 service 接口实现类PersonServiceImpl view 存放程序启动类main 程序设计时考虑易修改、易扩展为Service层和DAO层设计接口便于未来更换实现类。       十三. 通用工具类 在DAO层中对数据库表的增、删、改、查操作存在代码冗余可对其进行抽取封装DaoUtils工具类实现复用。    13.1通用DML /** * 将所有数据表的操作,抽离成一个公用的方法; * Param sql 语句 * Param sql语句对应的参数 * return */ public static boolean executeDML(String sql,Object... params){try {//获取连接Connection connection getConnection();//获取预处理的对象PreparedStatement ps connection.prepareStatement(sql);//设置参数if(null ! params){for(int i 0 ; i params.length ; i){//1:给占位符设置参数;2:获取参数ps.setObject(i1,params[i]);}}int i ps.executeUpdate();close(null,ps,connection);return i 0;} catch (SQLException sqlException) {sqlException.printStackTrace();}return false; }    13.2 通用DQL /** * 通用的查询;需要将我们的数据表信息,封装到List里面进行返回 * param sql 查询语句 * param cls 实体类的字节码对象 * param params 查询语句里面的占位符 * param T 实体类类型泛型 * return 就是我们查询到的数据集合 */public static T ListT executeDQL(String sql, ClassT cls , Object...params) {try {Connection connection getConnection(); //获取连接//获取预处理sqlPreparedStatement preparedStatement connection.prepareStatement(sql);//设置参数if(null ! params){for(int i 0 ; i params.length ; i){preparedStatement.setObject(i1,params[i]);}}//执行查询 得到结果集ResultSet resultSet preparedStatement.executeQuery();//获取元数据(我们的列名)ResultSetMetaData metaData resultSet.getMetaData();//列的总数int columnCount metaData.getColumnCount();//用来保存我们所有的表数据ListT list new ArrayListT();T t;//用来保存我们一条数据//遍历结果集while(resultSet.next()){ //每一行记录的遍历过程中t cls.newInstance();//根据字节码文件,构建一个实体类的对象//获取所有列的数据for(int i 1 ; i columnCount ; i){//你的查询语句有时候有别名String columnLabel metaData.getColumnLabel(i);//根据列名获取我们的记录Object object resultSet.getObject(columnLabel);//需要将拿到的这一列的记录,放到t对象指定的属性里面;//需要拿到这个t对象的属性,然后赋值;//解决方案2: 如果Object是NULL没有必要设置了if(null ! object){try {Field field cls.getDeclaredField(columnLabel);//根据属性的名称通过反射获取他的属性对象field.setAccessible(true);field.set(t,object);} catch (NoSuchFieldException e) {//代表我们当前这个实体类里面,没有这个属性}}}//需要将t对象保存到listlist.add(t);}close(resultSet,preparedStatement,connection);return list;} catch (SQLException sqlException) {sqlException.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();}return null; }     13.3 Apache的DbUtils 13.3.1 简介 DbUtils是Java编程中数据库操作实用小工具小巧、简单、实用。         对于数据表的查询操作可以把结果转换为List、Array、Set等集合。便于操作。         对于数据表的DML操作也变得很简单(只需要写SQL语句)。    13.3.2 API ResultSetHandler接口转换类型接口         BeanHandler类实现类把一条记录转换成对象         BeanListHandler类实现类把多条记录转换成List集合。         ScalarHandler类实现类适合获取一行一列的数据。 QueryRunner执行sql语句的类         增、删、改update();         查询query();    13.3.3 使用步骤 导入jar包         mysql连接驱动jar包         druid-1.1.5.jar         database.properties配置文件         commons-dbutils-1.6.jar       13.3.4 代码 package com.project.utils;import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.io.InputStream; import java.util.Properties;/** * 连接池工具类 */public class DBUtils {private static DruidDataSource dataSource;static {Properties properties new Properties();InputStream is DBUtils.class.getResourceAsStream(/database.properties);try {properties.load(is);dataSource (DruidDataSource)DruidDataSourceFactory.createDataSource(properties);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}// 返回一个数据源public static DataSource getDataSource(){return dataSource;} } package com.project.dao.impl;import com.project.dao.UserDao; import com.project.entity.User; import com.project.utils.DBUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import java.sql.SQLException; import java.util.List;public class UserDaoImpl implements UserDao {//1.创建QueryRunner对象并传递一个数据源对象private QueryRunner queryRunner new QueryRunner(DBUtils.getDataSource());Overridepublic int insert(User user) {Object[] params{user.getId(),user.getUsername(),user.getPassword(),user.getSex(),user.getEmail(),user.getAddress()};try {return queryRunner.update(insert into user(id,username,password,sex,email,address) values(?,?,?,?,?,?),params);} catch (SQLException e) {e.printStackTrace();}return 0;}Overridepublic int update(User user) {Object[] params{user.getUsername(),user.getPassword(),user.getSex(),user.getEmail(),user.getAdd ress(),user.getId()};try {return queryRunner.update(update user setusername?,password?,sex?,email?,address? where id ?,params);} catch (SQLException e) {e.printStackTrace();}return 0;}Overridepublic int delete(int id) {try {return queryRunner.update(delete from user where id ?,id);} catch (SQLException e) {e.printStackTrace();}return 0;}Overridepublic User select(int id) {try {//把查询到的记录封装成 指定对象return queryRunner.query(select * from user where id ?, newBeanHandlerUser(User.class), id);} catch (SQLException e) {e.printStackTrace();}return null;}/*** 查询所有* return*/Overridepublic ListUser selectAll() {try {return queryRunner.query(select * from user;,newBeanListHandlerUser(User.class));} catch (SQLException e) {e.printStackTrace();}return null;} }    十四. 连接池 在程序初始化时预先创建指定数量的数据库连接对象存储在池中。当需要连接数据库时从连接池中取出现有连接使用完毕后也不会进行关闭而是放回池中实现复用节省资源。 资源重用。 更快的系统响应速度。 新的资源分配手段。 统一的连接管理避免数据库连接泄漏。    14.1 Druid 14.1.1 步骤 创建 druid.properties 配置文件。 引入druid-xxx.jar 文件。    14.1.2 druid.properties #连接设置 driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/mytest usernameroot password123456 #!-- 初始化连接 -- initialSize10 #最大连接数量 maxActive50 #!-- 最小空闲连接 -- minIdle5 #!-- 超时等待时间以毫秒为单位 60000毫秒/1000等于60秒 -- maxWait5000      14.1.3 连接池工具类 public class DbUtils {//声明连接池对象private static DruidDataSource ds;static{//实例化配置对象Properties propertiesnew Properties();try {//加载配置文件内容properties.load(DbUtils.class.getResourceAsStream(druid.properties));ds (DruidDataSource)DruidDataSourceFactory.createDataSource(properties);} catch (IOException e) {e.printStackTrace();}}//获取连接对象public static Connection getConnection() {try {return ds.getConnection();} catch (SQLException e) {e.printStackTrace();}return null;}//释放资源。。 }     14.2 HikariCP 引入HikariCP-xxx.jar 文件。 /* 一、主要配置 1、dataSourceClassName 这是DataSourceJDBC驱动程序提供的类的名称。请注意如果您正在使用jdbcUrl“旧式”基于DriverManager的JDBC驱动程序配置则不需要此属性 。 默认值无 2、jdbcUrl 请注意如果使用此属性您仍然可以使用DataSource属性来配置您的驱动程序实际上建议您使用URL本身中指定的驱动程序参数。 默认值无 3、username 此属性设置从基础驱动程序获取连接时使用的默认身份验证用户名。 4、password 此属性设置从基础驱动程序获取连接时使用的默认身份验证密码。 */ public static void main(String[] args) throws SQLException {HikariConfig hikariConfig new HikariConfig();//设置urlhikariConfig.setJdbcUrl(jdbc:mysql://localhost:3306/mytest?characterEncodingUTF-8);//数据库帐号hikariConfig.setUsername(root);//数据库密码hikariConfig.setPassword(123456);HikariDataSource ds new HikariDataSource(hikariConfig); }      十五 . 批处理 addBatch(); 添加到批处理 executeBatch(); 执行批处理 clearBatch(); 清空批处理 //如果保存1w条记录 String sql insert into userinfo(uname,upass) values(?,?); Connection connection DBUtilPool.getConnectionByDruid(); long start System.currentTimeMillis(); PreparedStatement preparedStatement connection.prepareStatement(sql); for(int i 0 ; i 10000 ; i){preparedStatement.setObject(1,jacki);preparedStatement.setObject(2,aaaai);preparedStatement.addBatch(); //将当前的sql预编译好以后,加到批处理; 不会直接执行到数据库里面if(i % 500 0){preparedStatement.executeBatch(); //执行我们批处理preparedStatement.clearBatch(); //把上面的执行了,需要清空} } preparedStatement.executeBatch(); //最后一次进行批处理 long end System.currentTimeMillis(); System.out.println(); System.out.println(end-start);    十六. 事务 16.1 业务 代表用户完成的一个业务功能可以由一个或多个DAO的调用组成。软件所提供的一个功能都叫业务。    16.2 service层     16.3 转账案例 BEGIN ;-- 代表我们开启了一个事务 UPDATE user_acount SET umoney umoney-200 WHERE uname jack;-- 断网了 断电了 UPDATE user_acount SET umoney umoney200 WHERE uname rose;ROLLBACK -- 回滚事务(代表整个事务执行失败) COMMIT; -- 提交事务     16.4 事务 事务应该具有4个属性原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性atomicity。一个事务是一个不可分割的工作单位事务中包括的操作要么都做要么都不做。 一致性consistency。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性isolation。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的并发执行的各个事务之间不能互相干扰。 持久性durability。持久性也称永久性permanence指一个事务一旦提交它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。     16.5 转账事务案例 -- 默认提交事务 begin; commit; -- 提交事务 rollback; -- 事务回滚//代码里面默认回滚事务 connection.setAutoCommit(false); //不自动提交事务 connection.commit();//提交事务 connection.rollback();//回滚事务
http://www.pierceye.com/news/116474/

相关文章:

  • 做网站的积木式编程网站开发中的qq登录
  • 官方网站作用咨询公司简介
  • 个人手机版网站建设电影网站模板html
  • 招聘网站开发源码广州服务类拓客软件
  • 婚庆策划公司加盟江门关键词优化价格
  • 百度网站入口ps网页设计实验报告
  • 做网站准备材料怎么做优化网站排名
  • asp技校网站手游网页版
  • 网站建设合同要交印花税吗烟台网站的建设
  • 可以做锚文本链接的网站广告公司创意广告语
  • 建设网站的题目旅游网页素材
  • 做网站很难吗新手学做网站 pdf
  • 建设电影推荐网站的项目背景网站开发的公司电话
  • 建设银行 福建分行招聘网站cctv5体育现场直播
  • 网站那个做的比较好的微信辅助网站制作
  • 网站设计大全推荐wordpress后台登录
  • 网站运营与数据分析网站开发学习什么
  • 上海网站备案在哪里查询网站建设哪家稳妥
  • 建设网站做什么赚钱网站制作.
  • 小企业公司网站怎么建做网站英文编辑有前途吗
  • 优化图片传网站wordpress背景图片
  • 网站服务器哪家好些外包做网站不付尾款
  • 建站系统wordpress下载哪个公司的微信商城系统
  • 网站建设app开发合同深圳企业网站制作设计方案
  • 免费网站整站模板下载寻找做网站
  • 做此广告的网站做家纺的网站
  • 湖南畅想网站建设个人网站建设基本定位
  • 建站公司外包钓鱼网站怎么做
  • 个人网站logo需要备案吗鑫灵锐做网站多少钱
  • .xyz做网站怎么样网站产品预算