发表于: 2017-09-30 20:15:15

1 722


今天完成的事情:
一、整理和回顾小课堂的题目JdbcTemplate和 JDBC

(1)背景介绍

1概念: JDBCJava Data Base Connectivity,数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。1

2由来:

主流的数据有MySQLoracle,sqlserver,.,,,等,他们都有自己的访问协议,Java程序想要跟这些数据库进行数据访问,每种数据库的代码都不通用,这样不利于代码的可复用性。为此jdk提供了数据库访问的规范即JDBCJdbc是一种接口,接口的实现交由各个数据库厂商来实现,做成数据库的驱动。

 

知识剖析

1.      jdbc步骤

1.加载JDBC驱动

           2.建立数据库连接Connection

           3.创建执行SQL语句的statement

           4.处理执行的结果ResultSet

           5.释放资源

2.      jdbcTempalte

1.      配置文件加载datasource

2.      启动IOC容器

3.      JdbeTemplate实例化

4.      调用方法执行SQL语句

(2)代码实战

    1.采用两种方法来对数据的访问,一是基本的JDBC数据库,二是用spring 框架提供的jdbcTemplate。

    2.创建maven项目

   3.新建DBUtil工具类,来获取数据库连接

package jdbctest;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

public class DBUtil {

private static String url="jdbc:mysql://localhost:3306/db_jdbc?useUnicode=true&characterEncoding=utf8&useSSL=false";

private static String user="root";

private static String pwd="1234";

public Connection getConnection() throws Exception {

//1.注册驱动

Class.forName("com.mysql.jdbc.Driver");

//2.建立连接

return DriverManager.getConnection(url,user,pwd);

}

public void connClose(Connection one) {

try {

if(one!=null)

one.close(); 

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

4.新建学生类

package jdbctest;

public class Student {

private int id;

private String name;

private String password;

private String grade;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getGrade() {

return grade;

}

public void setGrade(String grade) {

this.grade = grade;

}

}

5.新建两个测试类,一个是JDBC的,一个是jdbcTemplate的

package jdbc;

import java.sql.*;

import org.junit.AfterClass;

import org.junit.BeforeClass;

import org.junit.Test;

import jdbctest.DBUtil;

public class TestJdbc {

private static Connection conn;

private static DBUtil one=new DBUtil();

@BeforeClass

public static void  getConn() throws Exception {

conn=one.getConnection();

}

/**

*SQL注入危害

*/

@Test

public void sqlTest() throws SQLException {

String sql="select grade  from demo where name='小红'#'adord='123'";

Statement stmt=conn.createStatement();

ResultSet rs=stmt.executeQuery(sql);

while(rs.next()) {

System.out.println(rs.getString("grade"));

}

}

@Test

/**

*/

public void sqlTest02() throws SQLException {

String sql="select grade from demo where name=? and password=? ";

PreparedStatement stmt=conn.prepareStatement(sql);

stmt.setString(1, "小红");

stmt.setString(2, "123");

ResultSet rs= stmt.executeQuery();

while(rs.next()) {

System.out.println(rs.getString("grade"));

}

}

@AfterClass

public static void connclose() {

one.connClose(conn);

}

}

-----------------------------------------------------------------------------------------------

package jdbc;

import java.util.List;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.jdbc.core.BeanPropertyRowMapper;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.RowMapper;

import jdbctest.Student;

public class TestJdbcTemplate {

@SuppressWarnings({ "unused", "resource" })

@Test

public void jdbcTest() {

//1.启动IOC

ApplicationContext context= new ClassPathXmlApplicationContext("ApplicationContext.xml");

//2.获取jdbcTemplate实例

JdbcTemplate jdbcTemplate=(JdbcTemplate) context.getBean("jdbcTemplate");

//3.执行jdbcTemplat查询方法

String sql="select id ,name,grade from demo ";

RowMapper<Student> rowMapper=new BeanPropertyRowMapper<Student>(Student.class);

List<Student> stu=jdbcTemplate.query(sql, rowMapper);

for(Student record:stu) {

System.out.println("id: "+record.getId());

System.out.println("name: "+record.getName());

System.out.println("grade: "+record.getGrade());

System.out.println("-----------");

}

}

/*

public class StudentMapper implements RowMapper<Student>{

public Student mapRow(ResultSet rs, int rowNum) throws SQLException {

Student student=new Student();

student.setId(rs.getInt("id"));

student.setName(rs.getString("name"));

student.setPassword(rs.getString("password"));

student.setGrade(rs.getString("grade"));

return student;

}

}*/

}

(6)运行的结果来看,这两种方法都可以实现数据库查询输出。在执行sql语句的时候,是采用statement执行SQL语句确实会存在SQL注入的问题,在语句拼接的时候sql语句出现一些关键字将导致执行特殊的操作。

就比如说上面的SQL语句明显是错误的,但是依然可以运行得出结果,就是因为有误操作输入#号,导致后面的语句是默认无效的。使用PreparedStatement就可以很好的解决这个问题,它首先进行SQL语句预编译,检查SQL语句是否存在编译错误,然后在传入参数,在执行操作。

明天的计划:
1.开始着手任务2

遇到的问题:

暂无

收获:
1.这个小课堂的准备其实也是让自己在回顾之前学过的内容,加深理解,虽然我对于jdbctemplate还有spring框架的常用用法熟练度还不够,在写这些代码的时候还是要是不是回头参考之前做的project,尤其是xml的配置内容,尽管对大概的配置流程了解,但是真正自己上手写的时候还是不能完全独立的写出来,确实还没有做到位,要多强练习。





返回列表 返回列表
评论

    分享到