中阶 d03.5 (正篇)完整的Dao 操作数据库

1.目录结构:

  util---JDBCUtil.java(工具包,整合建立链接和释放资源的方法)

  dao---UserDao.java(接口,定义方法)

    impl---UserDaoImpl.java(实现方法)

  test---TestUserDaoImpl.java(单元测试,测试 执行具体增删改查的方法)

2. 代码说明:

util包和之前一样没变化

Dao模式其实就是使用接口和实现来操作数据库

test 里面也不用写具体的方法,直接调用方法

3. ##Statement安全问题

1). Statement执行 ,其实是拼接sql语句的。  先拼接sql语句,然后在一起执行。           

     String sql = "select * from t_user where username=‘"+ username  +"‘ and password=‘"+ password +"‘";

        UserDao dao = new UserDaoImpl();
        dao.login("admin", "100234khsdf88‘ or ‘1=1");

        SELECT * FROM t_user WHERE username=‘admin‘ AND PASSWORD=‘100234khsdf88‘ or ‘1=1‘ 

        前面先拼接sql语句, 如果变量里面带有了 数据库的关键字,那么一并认为是关键字。 不认为是普通的字符串。
        rs = st.executeQuery(sql);
2)## PrepareStatement

> 该对象就是替换前面的statement对象。1. 相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。        

        String sql = "insert into t_user values(null , ? , ?)";
             ps = conn.prepareStatement(sql);

             //给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。
             ps.setString(1, userName);
             ps.setString(2, password);

  

4.最终代码实现

1. interface中:

void findAll();
void login(String username , String password);
void insert(String userName , String password);

2.实现方法中:
/*
faindAll没变
login 使用PreparedStatement预先对sql进行处理,解决安全问题(login也属于查询语句)
查询语句:ResultSet rs = ps.executeQuery();
增删改:int result = ps.executeUpdate();

最终 所有语句都使用使用PreparedStatement预先对sql进行处理,解决安全问题
*/
     @Override
	public void findAll() {
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		try {
			//1. 获取连接对象
			conn = JDBCUtil.getConn();
			//2. 创建statement对象
			st = conn.createStatement();
			String sql = "select * from t_user";
			rs = st.executeQuery(sql);

			while(rs.next()){
				String userName = rs.getString("username");
				String password = rs.getString("password");

				System.out.println(userName+"="+password);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.release(conn, st, rs);
		}
	}

     @Override
	public void login(String username, String password) {

		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		try {
			//1. 获取连接对象
			conn = JDBCUtil.getConn();
			//2. 创建statement对象
			String sql = "select * from t_user where username=? and password=?";

			//预先对sql语句执行语法的校验, ? 对应的内容,后面不管传递什么进来,都把它看成是字符串。 or select
			PreparedStatement ps = conn.prepareStatement(sql);
			//? 对应的索引从 1 开始。
			ps.setString(1, username);
			ps.setString(2, password);

			rs = ps.executeQuery();
			if(rs.next()){
				System.out.println("登录成功");
			}else{
				System.out.println("登录失败");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.release(conn, st, rs);
		}
	}

     @Override
	public void insert(String userName, String password) {
		Connection conn = null;
		PreparedStatement ps = null;

		try {
			 conn = JDBCUtil.getConn();
			String sql = "insert into t_user values(null , ? , ?)";
			 ps = conn.prepareStatement(sql);

			 //给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。
			 ps.setString(1, userName);
			 ps.setString(2, password);

			int result = ps.executeUpdate();
			if(result>0){
				System.out.println("添加成功");
			}else{
				System.out.println("添加失败");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			JDBCUtil.release(conn, ps);
		}
	}

  

原文地址:https://www.cnblogs.com/longesang/p/11478401.html

时间: 2024-11-10 05:16:12

中阶 d03.5 (正篇)完整的Dao 操作数据库的相关文章

在MVC3中使用code first生成数据局库并操作数据库

1.建立Users和UserInfos两个实体类 对应的是数据库中的表 public class User { //类名+Id(User+Id)组成的字符串在数据库表中会设置该字段是主键且是按1的增量增长 public int UserId { get; set; } public string UserName { get; set; } } UserInfos表 public class UserInfo { public int UserInfoId { get; set; } publi

中阶d03 JDBC 使用

1.首先在数据库中创建表 2.安装驱动 java开发环境中导入jdbc连接mysql的jar包 mysql-connector-java-5.1.7-bin.jar 下载地址:https://dev.mysql.com/downloads/connector/j/5.1.html 3.加载驱动程序 Class.forName(“com.mysql.jdbc.Driver”); //固定写法 4.获取数据库连接 Connection connection = DriverManager.getCo

来篇完整的,小说接着更,为博客园早日开小说板块努力

如题,发篇完整的小说,话说本人现有一百多万的存稿,慢慢发,为代码也写到一百多万而努力. 九州2 楔子 千里江山,塞外狼烟,当是男儿去处,纵马挥戈,傲笑生死,多少君侯事! 华檐翠宇,深闺梦里,多少旧人容颜,却化作,雨打风吹去.天阙辉煌,如柯一梦,终不负帝王业! 平安时代,历经三百余年国祚的大綦王朝终于走向了时代的尽头,战乱四起,诸侯割据,这注定是一个群雄逐鹿的时代. 第一卷 乱世风云 第一章 千里追杀 但凡是稍有阅历的人都知道,在这片幅员千万里的九州土地上,秋雨楼是整个天下势力最广,根脉最深,实力

javascript中外部js文件取得自身完整路径得办法

原文:javascript中外部js文件取得自身完整路径得办法 有时候我们需要引入一个外部js文件,这个js文件又需要用到自己的路径或者是所在的目录,别问怎么又这么变态的需求,开发做久了各种奇葩需求也就有了! 有人第一时间想到的是location.href,可是哥哥,那个引用页面的路径啊.比如a.html: <html> <script src="/b/c.js"></script> </html> 这样的话我们用location.hre

redis 在 php 中的应用(Sorted-set篇)

上一篇:redis 在 php 中的应用(Set篇) 本文为我阅读了 redis参考手册 之后编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序. 有序集合的成员是唯一的,但分数(score)却可以重复. 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色 本篇文章是系列文章中的第四篇,也是最后一篇,本篇文章需要前三篇的文章知识作为基础,前三篇的文章地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色 简介 生产环境下的数据是如果可以写在资产负债表上的话,我想这个资产所占的数额一定不会

JavaScript中的正则表达式(终结篇)

JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScript中的使用: JavaScript对正则表达式的支持程度 支持正则表达式的RegExp类型 RegExp的实例属性 RegExp的实例方法 RegExp的构造函数属性 简单的应用 第一部分:JavaScript对正则表达式的支持程度 之前我介绍了正则表达式的基本语法,如果大家不是很了解可以先看下面

iOS工程中的info.plist文件的完整研究

原地址:http://blog.sina.com.cn/s/blog_947c4a9f0100zf41.html 们建立一个工程后,会在Supporting files下面看到一个"工程名-Info.plist"的文件,这个是对工程做一些运行期配置的文件,很重要,不能删除. 如果你在网上下载的工程中的这个文件名只是Info.plist,那么恭喜你,这个工程太老了,是用包含SDK2.0以前的Xcode生成的,不过没关系,不影响使用. 如果你使用文本编辑器打开这个文件,你会发现这是一个XM

视觉SLAM中的数学基础 第三篇 李群与李代数

视觉SLAM中的数学基础 第三篇 李群与李代数 前言 在SLAM中,除了表达3D旋转与位移之外,我们还要对它们进行估计,因为SLAM整个过程就是在不断地估计机器人的位姿与地图.为了做这件事,需要对变换矩阵进行插值.求导.迭代等操作.例如,在经典ICP问题中,给定了两组3D点,我们要计算它们之间的变换矩阵.假设第一组的3D点为$\mathbf{P}=\{ \mathbf{p}_i | i = [1,2, \ldots, N] \}$,第二组3D点为$\mathbf{Q}=\{ \mathbf{q}