发表于: 2017-09-30 20:15:15
1 722
今天完成的事情:
一、整理和回顾小课堂的题目JdbcTemplate和 JDBC
(1)背景介绍
1概念: JDBC(Java Data Base Connectivity,数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。1
2由来:
主流的数据有MySQL,oracle,sqlserver,.,,,等,他们都有自己的访问协议,Java程序想要跟这些数据库进行数据访问,每种数据库的代码都不通用,这样不利于代码的可复用性。为此jdk提供了数据库访问的规范即JDBC。Jdbc是一种接口,接口的实现交由各个数据库厂商来实现,做成数据库的驱动。
知识剖析
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的配置内容,尽管对大概的配置流程了解,但是真正自己上手写的时候还是不能完全独立的写出来,确实还没有做到位,要多强练习。
评论