JDBC的封装
dao (代码分层)命名规范:
1、com.XXX.dao 存放dao相关的类型 例如 StudentDAOImpl 处理 数据库的链接 存取数据
2、com.XXX.servlet 存放servlet相关的类 例如:StudentServlet 处理 与浏览器交互的类
3、com.XXX.entity 存放实体类 例如 Student 接受数据库对象模型
4、com.XXX.util 存放工具类 例如 DBUtil
操作步骤:
首先
,创建一个数据库表单,起名为Studetn。内有:id、name、age、sex四个属性。将id设为主键并且设置自动递增。
第二
,在数据库建立完表单之后,在Java中创建一个数据库表单的实体类。(类名和表名一致)
内有:
1、表单的属性值和属性的基本数据类型。
2、无参的构造函数。
3、有参的构造函数。
4、Get和Set方法。
5、toString方法。
第三
:创建一个工具类。
内有:
1、写一个静态代码块。将注册驱动写入其中。
原因:驱动只需要加载一次即可,
所以写在静态代码段中(static),类的静态代码块,随着类的加载,只执行一次。
2、将建立连接进行封装。
3、将增删改的通用方法也一并进行封装。
第四
,先在dao层创建一个接口
内有:
1、返回值类型和方法名、参数。
1.1、可根据增删改分为不同的写法。
1.2、两个以上的参数,全部使用对象传参。
第五
:在dao层下创建一个包,命名为Impl,在这个包内创建一个接口实现类。
内有:
1、写入SQL语句,要增删改的内容可用占位符代替。
2、返回在工具类里给增删改通用方法设定的调用方法。
3、在返回调用方法里加入占位符所代表的对象。
第六
:在servlet里创建测试类。
内有:
1、通过创建的实体类来赋值。
2、通过实现类来调用接口里的方法。
3、调用方法。
实例:
第一步:创建数据库表单。*
第二步: 创建一个数据库表单的实体类。
1 package com.Wuchuang.entiy;
2
3 public class Student {
4
5 private int id;
6 private String name;
7 private int age;
8 private String sex;
9
10
11 public Student() {
12 }
13
14 public Student(int id, String name, int age, String sex) {
15 this.id = id;
16 this.name = name;
17 this.age = age;
18 this.sex = sex;
19 }
20
21 public int getId() {
22 return id;
23 }
24
25 public void setId(int id) {
26 this.id = id;
27 }
28
29 public String getName() {
30 return name;
31 }
32
33 public void setName(String name) {
34 this.name = name;
35 }
36
37 public int getAge() {
38 return age;
39 }
40
41 public void setAge(int age) {
42 this.age = age;
43 }
44
45 public String getSex() {
46 return sex;
47 }
48
49 public void setSex(String sex) {
50 this.sex = sex;
51 }
52
53 @Override
54 public String toString() {
55 return "Student{" +
56 "id=" + id +
57 ", name='" + name + '\'' +
58 ", age=" + age +
59 ", sex='" + sex + '\'' +
60 '}';
61 }
62 }
第三步:创建一个工具类。
1 package com.Wuchuang.util;
2
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.PreparedStatement;
6 import java.sql.SQLException;
7
8 public class DBUtil {
9 //注册驱动,驱动只需要加载一次即可
10 //所以写在静态代码段中(static)
11 //类的静态代码块,随着类的加载,只执行一次。
12 static {
13 try {
14 Class.forName("com.mysql.jdbc.Driver");
15 } catch (ClassNotFoundException e) {
16 e.printStackTrace();
17 }
18 }
19 //建立链接。需要单独创建一个方法。
20 //通过返回值返回链接对象。
21 //链接每次用完之后就会关闭。
22 public static Connection getConnection() {
23 try {
24 return DriverManager.getConnection("jdbc:mysql:///test?characterEnconding=UTF-8", "数据库账户", "密码");
25 } catch (SQLException e) {
26 e.printStackTrace();
27 }
28 return null;
29 }
30
31 /** 增删改的通用方法
32 * @param String sql 要执行的sql
33 * @param Object[] obj 对象类型的数组 里面存放着 sql执行的占位符参数
34 * Object... 可变参数
35 * */
36 public static boolean executeUpdate(String sql,Object... args){
37 PreparedStatement ps = null;
38
39 try {
40 ps = getConnection().prepareStatement(sql);
41 for (int i = 0;i<args.length;i++){
42 ps.setObject(i+1,args[i]);
43 }
44 int i = ps.executeUpdate();
45 if (i>0)return true;
46 } catch (SQLException e) {
47 e.printStackTrace();
48 }
49 return false;
50 }
51 }
第四步:在dao层创建一个接口。
1 package com.Wuchuang.dao;
2
3 import com.Wuchuang.entiy.Student;
4
5 public interface IStudentDAO {
6 /**
7 * 添加新学生
8 * insert into student (name,age,sex) values (?,?,?);
9 * 两个以上的参数 全用对象传参
10 * @param 学生对象 里面存放当着需要添加的学生信息
11 * @return boolean 成功返回 true 失败 返回 false
12 */
13 boolean add (Student s);
14
15
16 /**
17 * 根据id删除学生,所以返回值可以直接填写id的数据类型和id
18 * delete from student where id = ?
19 */
20 boolean delete(int id);
21
22
23 /**
24 * 根据id修改学生
25 * update student set name = ?,age= ? where id = ?
26 */
27 boolean update(Student s);
28 }
第五步:创建一个接口实现类。
1 package com.Wuchuang.dao.Impl;
2
3 import com.Wuchuang.dao.IStudentDAO;
4 import com.Wuchuang.entiy.Student;
5 import com.Wuchuang.util.DBUtil;
6
7 public class StudentDAOImpl implements IStudentDAO {
8 @Override
9 public boolean add(Student s) {
10 String sql = "insert into Student (name,age,sex) values (?,?,?)";
11
12 return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getSex());
13 }
14
15 @Override
16 public boolean delete(int id) {
17 String sql = "delete from Student where id = ?";
18
19 return DBUtil.executeUpdate(sql,id);
20 }
21
22 @Override
23 public boolean update(Student s) {
24 String sql = "update Student set name = ?,age = ?,sex = ? where id = ?";
25
26 return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getSex(),s.getId());
27
28 }
29 }
第六步:进行测试。
1 package com.Wuchuang.servlet;
2
3 import com.Wuchuang.dao.IStudentDAO;
4 import com.Wuchuang.dao.Impl.StudentDAOImpl;
5 import com.Wuchuang.entiy.Student;
6 import org.junit.Test;
7
8 public class ServletTest{
9 @Test
10 public void test(){
11 Student s = new Student(1,"吃饭",38,"男");
12
13 IStudentDAO dao = new StudentDAOImpl();
14
15 dao.add(s);
16 }
17
18 }
2019年4月11日