JDBC连接数据库快速入门

本文介绍Java数据库连接(JDBC)的概念及其在Java应用程序中操作数据库的基本步骤,包括注册驱动、获取连接、执行SQL等。同时,探讨了SQL注入问题及解决方案,并介绍了JDBC工具类的使用。此外,文章还讲解了Spring框架下JDBC的封装,包括JdbcTemplate对象的创建和使用,以及其提供的简化JDBC开发的方法。

概念

Java DataBase Connectivity——java数据库连接。是官方sun公司定义的一套操作所有关系型数据库的规则,即接口。不同的数据库厂商实现这套接口,提供驱动jar包。我们可以使用这套接口jdbc编程,实际执行的是jar包中的实现类。

快速入门

步骤:

  1. 导入jar包
  2. 注册驱动
  3. 获取数据库连接对象 Connection
  4. 定义sql语句
  5. 获取执行sql对象 Statement
  6. 执行sql,接收返回结果
  7. 处理结果
  8. 释放资源
public class Demo03JDBC {
    public static void main(String[] args) {
        Statement stmt = null;
        Connection conn = null;
        try {
            // 1. 注册驱动(mysql5之后之后的驱动jar包可以省略注册驱动步骤)
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbtest","root","123456");
            // 3. 定义sql
            String sql = "update account set name = 'zhangsan' where id = 1";
            // 4. 获取执行sql对象
            stmt = conn.createStatement();
            // 5. 执行sql 如果执行成功返回1,执行失败返回0
            int count = stmt.executeUpdate(sql);
            // 6. 处理结果
            System.out.println(count);
            if (count>0){
                System.out.println("修改成功");
            }else {
                System.out.println("修改失败");
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            // 释放资源
            if (stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

SQL注入

这里有个sql注入的问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题。
用户名随便输入,输入密码:a’ or ‘a’ ='a

select * from user where username='ghesofaghoa' and password = 'a' or 'a' = 'a';

解决sql问题:引入PreparedStatement
在定义sql的时候,参数使用?作为占位符。

select * from user where username=and password =;

在第五步获取执行sql对象的时候

PreparedStatement pstmt = null;
pstmt = conn.createStatement();
// 如何给?赋值
// setXXX(参数1,参数2)  参数1为?位置编号,参数2为?的值
pstmt.setString(1, 'ghesofaghoa')
pstmt.setString(2, 'hahahahha')

JDBC工具类

如果每次查询都要注册驱动、获取连接对象、最后都要释放资源,代码是冗余的。因此抽取出一个方法来,简化书写,去除重复工作量。
通过配置文件jdbc.properties,可以保证工具的使用

代码实现:

public class JDBCUtils {
	    private static String url;
	    private static String user;
	    private static String password;
	    private static String driver;
	    /**
	     * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
	     */
	    static{
	        //读取资源文件,获取值
	        try {
	            //1. 创建Properties集合类。
	            Properties pro = new Properties();
	            //获取src路径下的文件的方式--->ClassLoader 类加载器
	            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
	            URL res  = classLoader.getResource("jdbc.properties");
	            String path = res.getPath();    // 字符串路径
	            
	            //2. 加载文件
	           // pro.load(new FileReader("D:\\IdeaProjects\\itcast\\day04_jdbc\\src\\jdbc.properties"));
	            pro.load(new FileReader(path));
	
	            //3. 获取数据,赋值
	            url = pro.getProperty("url");
	            user = pro.getProperty("user");
	            password = pro.getProperty("password");
	            driver = pro.getProperty("driver");
	            //4. 注册驱动
	            Class.forName(driver);
	        } catch (IOException e) {
	            e.printStackTrace();
	        } catch (ClassNotFoundException e) {
	            e.printStackTrace();
	        }
	    }
	
	
	    /**
	     * 获取连接
	     * @return 连接对象
	     */
	    public static Connection getConnection() throws SQLException {
	
	        return DriverManager.getConnection(url, user, password);
	    }
	
	    /**
	     * 释放资源
	     * @param stmt
	     * @param conn
	     */
	    public static void close(Statement stmt,Connection conn){
	        if( stmt != null){
	            try {
	                stmt.close();
	            } catch (SQLException e) {
	                e.printStackTrace();
	            }
	        }
	
	        if( conn != null){
	            try {
	                conn.close();
	            } catch (SQLException e) {
	                e.printStackTrace();
	            }
	        }
	    }
	
	
	    /**
	     * 释放资源重载
	     * @param stmt
	     * @param conn
	     */
	    public static void close(ResultSet rs,Statement stmt, Connection conn){
	        if( rs != null){
	            try {
	                rs.close();
	            } catch (SQLException e) {
	                e.printStackTrace();
	            }
	        }
	
	        if( stmt != null){
	            try {
	                stmt.close();
	            } catch (SQLException e) {
	                e.printStackTrace();
	            }
	        }
	
	        if( conn != null){
	            try {
	                conn.close();
	            } catch (SQLException e) {
	                e.printStackTrace();
	            }
	        }
	    }
	
	}

Spring JDBC

* Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
* 步骤:
	1. 导入jar包
	2. 创建JdbcTemplate对象。依赖于数据源DataSource
		* JdbcTemplate template = new JdbcTemplate(ds);

	3. 调用JdbcTemplate的方法来完成CRUD的操作
		update():执行DML语句。增、删、改语句
		queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
			* 注意:这个方法查询的结果集长度只能是1
		queryForList():查询结果将结果集封装为list集合
			* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
		query():查询结果,将结果封装为JavaBean对象
			* query的参数:RowMapper
				* 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
				* new BeanPropertyRowMapper<类型>(类型.class)
		queryForObject:查询结果,将结果封装为对象
			* 一般用于聚合函数的查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值