머리말: 데이터베이스를 설치한 후에는 우리가 작성하는 Java 프로그램이 데이터베이스를 직접 사용할 수 없으며 JDBC(Java Database Connectivity, Java 데이터베이스 연결)는 클라이언트 프로그램의 데이터베이스 액세스를 표준화하는 데 사용되는 Java 언어의 API입니다. , SQL 문을 다양한 관계형 데이터베이스에 보내 데이터베이스 추가, 삭제, 수정 및 쿼리와 같은 작업을 수행할 수 있습니다.
1. 데이터베이스: 여기에서는 MySQL을 예로 들어 Person 테이블을 만듭니다. 네 가지 필드는 자동 증가된 기본 키 ID, 이름, 성별, 나이
1 DROP TABLE IF EXISTS `person`; 2 CREATE TABLE `person` ( 3 `id` int(11) NOT NULL AUTO_INCREMENT, 4 `name` varchar(11) DEFAULT NULL, 5 `gender` varchar(11) DEFAULT NULL, 6 `age` int(11) DEFAULT NULL, 7 PRIMARY KEY (`id`) 8 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 9 10 INSERT INTO `person` VALUES ('1', '小明', '男', '18');11 INSERT INTO `person` VALUES ('2', '小芳', '女', '19');12 INSERT INTO `person` VALUES ('3', '小刚', '男', '20');13 INSERT INTO `person` VALUES ('4', '小丽', '女', '21');
2입니다. 데이터베이스 드라이버 jar 패키지: Mysql-connector-java-5.1.42-bin.jar가 여기에서 사용됩니다
3. Eclipse에서 드라이버 패키지 가져오기: 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 빌더 경로----빌더 경로 구성--을 클릭합니다. -- 외부 JAR 추가----jar 패키지의 위치를 찾아 선택하여 엽니다----좋아요, 이제 작업을 시작할 수 있습니다!
다이어그램은 다음과 같습니다.
1 package com.jdbc.demo; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 //一段完整的jdbc操作过程,后面会详细介绍,为了代码视图简洁,异常均抛出。10 public class Demo {11 12 public static void main(String[] args) throws ClassNotFoundException, SQLException {13 //第1步,注册加载驱动类14 Class.forName("com.mysql.jdbc.Driver");15 //第2步,获取数据库连接,方法中3个参数依次为:16 //url:就是你要连接的数据库的地址,不同的数据库格式会有差异17 //user:就是数据库的用户名,例如MySQL的root18 //password:数据库连接密码19 String url = "jdbc:mysql://127.0.0.1/hb?characterEncoding=utf-8";20 String user = "root";21 String password = "123123";22 Connection conn = DriverManager.getConnection(url, user, password);23 //第3步,构造语句集对象,为了简要直观,这里使用Statement,不过实际开发建议用PreparedStatement24 String sql = "select * from person";25 Statement stmt = conn.createStatement();26 //第4步,提交SQL语句,这是是查询,所以调用executeQuery方法,会返回一个集合,我们可以遍历输出其中信息;27 //如果是增删改,不同于数据库中的3种SQL语句,这里都是调用executeUpdate方法,返回的是int值28 ResultSet rs = stmt.executeQuery(sql);29 //第5步(可选),处理结果,在这里我们输出Person表中所有人名30 while(rs.next()) {31 String name = rs.getString("name");32 System.out.println(name);33 }34 //第6步,关闭相关对象,这里为ResultSet,Statement,Connection35 //注意!关闭顺序和声明顺序相反!依次如下36 rs.close();37 stmt.close();38 conn.close();39 40 }41 42 }
프로그램 실행 결과는 다음과 같습니다.
java.sql.Connection:
데이터베이스에 연결합니다. 가져오기 패키지에 오류가 발생하지 않도록 주의하세요. MySQL 드라이버를 가져온 후 com에는 .mysql.jdbc에도 연결이 있습니다. 이것을 가져오면 오류가 발생합니다.
JDBC 관리 계층의 DriverManager 클래스의 getConnection 메서드를 호출하여 연결을 얻습니다. 메소드의 마지막 두 매개변수는 비교적 간단합니다. 첫 번째 매개변수는 URL 형식이 각 데이터베이스와 관련되어 있습니다
MySQL: jdbc:mysql://
ORACLE:jdbc:oracle:thin:@
java,sql.Statement 및 java.sql.PreparedStatement
Statement 객체는 SQL 문을 제출하는 데 사용됩니다.
Statement는 일반적으로 정적 SQL 문을 실행하는 데 사용됩니다. 다음 예제에서는 모두 ReadyStatement
java.sql을 사용합니다. ResultSet:
실제 개발에서 SQL 문(일반적으로 쿼리)을 실행하여 반환된 원본 결과 집합을 지정합니다. 우리는 일반적으로
엔티티 클래스 Person
1 package com.jdbc.entity; 2 //实体类Person,属性与数据库中字段对应 3 public class Person { 4 private Integer id; 5 private String name; 6 private String gender; 7 private Integer age; 8 public Integer getId() { 9 return id;10 }11 public void setId(Integer id) {12 this.id = id;13 }14 public String getName() {15 return name;16 }17 public void setName(String name) {18 this.name = name;19 }20 public String getGender() {21 return gender;22 }23 public void setGender(String gender) {24 this.gender = gender;25 }26 public Integer getAge() {27 return age;28 }29 public void setAge(Integer age) {30 this.age = age;31 }32 @Override33 public String toString() {34 return "Person [id=" + id + ", name=" + name + ", gender=" + gender35 + ", age=" + age + "]";36 }37 38 }
JdbcUtil 도구 클래스 호출을 용이하게 하기 위해 결과를 다시 캡슐화합니다. 드라이버 클래스를 로드하고 연결을 얻고 객체를 닫는 데 사용됩니다
package com.jdbc.demo;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JdbcUtil {private static String driver = "com.mysql.jdbc.Driver";private static String url = "jdbc:mysql://127.0.0.1/hb?characterEncoding=utf-8";private static String username = "root";private static String password = "hjh123";//静态代码块中注册加载驱动类static {try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } }//封装获取连接方法public static Connection getConnection() {try {return DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); }return null; }//封装关闭对象方法public static void close(ResultSet rs, Statement statement, Connection conn) {if (rs != null) {try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } }if (statement != null) {try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } }if (conn != null) {try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
Easy Person 테이블의 추가, 삭제, 수정 및 쿼리를 구현하기 위한 DAO 클래스 캡슐화
1 package com.jdbc.demo; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 import com.jdbc.entity.Person; 11 12 13 //封装Person表的增删改查方法 14 public class PersonDaoImpl { 15 //这里的问号?是占位符,用于给将要传递的参数占位置,实现了动态SQL语句的执行 16 //添加一条记录的SQL语句,第一个参数由于数据表中是主键自增,这里可以用null 17 private static final String SQL_ADD = "insert into person values(null,?,?,?)"; 18 //删除,指定id的记录 19 private static final String SQL_DEL = "delete from person where id = ?"; 20 //修改,指定id的记录 21 private static final String SQL_UPD = "update person set name = ?,gender = ?,age = ? where id = ?"; 22 //查询,指定id记录 23 private static final String SQL_ID = "select * from person where id = ?"; 24 //查询,所有记录 25 private static final String SQL_ALL = "select * from person"; 26 27 //添加一条记录 28 public boolean add(Person p) { 29 Connection conn = JdbcUtil.getConnection(); 30 PreparedStatement ps = null; 31 try { 32 ps = conn.prepareStatement(SQL_ADD); 33 //把我们传入的person对象的属性值分作为占位符的值传入,数组各值顺序对应占位符字段顺序 34 Object[] params = {p.getName(),p.getGender(),p.getAge()}; 35 int len = params.length; 36 for(int i = 0;i < len;i++) { 37 //!!!这里比较特殊,很多下标都是从0开始,例如数组, 38 //!!!但是这个setObject方法第一个索引参数是从1开始 39 ps.setObject(i+1, params[i]); 40 } 41 //这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数 42 //之前的Statement.excute方法要传入SQL语句字符串参数, 43 //但是用了PreparedStatement就不用传参数了,因为在前面我们已经预定义处理了 44 int line = ps.executeUpdate(); 45 if (line > 0) { 46 System.out.println("添加成功,受影响记录数为"+line); 47 return true;//结束,但是后面finally区代码会执行 48 } 49 } catch (SQLException e) { 50 e.printStackTrace(); 51 } finally { 52 //关闭相关对象 53 JdbcUtil.close(null, ps, conn); 54 } 55 System.out.println("添加失败"); 56 return false; 57 } 58 //删除一条记录 59 public boolean delete(int id) { 60 Connection conn = JdbcUtil.getConnection(); 61 PreparedStatement ps = null; 62 try { 63 ps = conn.prepareStatement(SQL_DEL); 64 ps.setInt(1, id); 65 //这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数 66 int line = ps.executeUpdate(); 67 if (line > 0) { 68 System.out.println("删除成功,受影响记录数为"+line); 69 return true;//结束,但是后面finally区代码会执行 70 } 71 } catch (SQLException e) { 72 e.printStackTrace(); 73 } finally { 74 //关闭相关对象 75 JdbcUtil.close(null, ps, conn); 76 } 77 System.out.println("删除失败"); 78 return false; 79 } 80 //修改一条记录 81 public boolean update(Person p) { 82 Connection conn = JdbcUtil.getConnection(); 83 PreparedStatement ps = null; 84 try { 85 ps = conn.prepareStatement(SQL_UPD); 86 //把我们传入的person对象的属性值分作为占位符的值传入 87 Object[] params = {p.getName(),p.getGender(),p.getAge(),p.getId()}; 88 int len = params.length; 89 for(int i = 0;i < len;i++) { 90 //!!!这里比较特殊,很多下标都是从0开始,例如数组, 91 //!!!但是这个setObject方法第一个索引参数是从1开始 92 ps.setObject(i+1, params[i]); 93 } 94 //这里的整型返回值line意指更新的记录数,或者说是数据库中受影响的记录行数 95 int line = ps.executeUpdate(); 96 if (line > 0) { 97 System.out.println("修改成功,受影响记录数为"+line); 98 return true;//结束,但是后面finally区代码会执行 99 }100 } catch (SQLException e) {101 e.printStackTrace();102 } finally {103 //关闭相关对象104 JdbcUtil.close(null, ps, conn);105 }106 System.out.println("修改失败");107 return false;108 }109 //获取一条记录,这里返回的不再是布尔值,而是一个对应数据表中一条记录的Person对象110 public Person findById(int id) {111 Connection conn = JdbcUtil.getConnection();112 PreparedStatement ps = null;113 ResultSet rs = null;114 try {115 ps = conn.prepareStatement(SQL_ID);116 ps.setInt(1, id);117 //返回结果集,这里是查询指定id,所以结果集中应该最多只有一条记录118 rs = ps.executeQuery();119 if(rs.next()) {120 Person p = new Person();121 p.setId(id);122 //这里的Result的getObject方法,参数为数据表中字段名,可以获取对应字段值123 p.setName(rs.getString("name"));124 p.setGender(rs.getString("gender"));125 p.setAge(rs.getInt("age"));126 return p;//返回p对象,结束127 }128 } catch (SQLException e) {129 e.printStackTrace();130 } finally {131 //关闭相关对象132 JdbcUtil.close(rs, ps, conn);133 }134 return null;135 }136 //获取所有记录,返回结果集不便操作,故封装到一个List中作为方法返回值137 public List<Person> findAll() {138 Connection conn = JdbcUtil.getConnection();139 PreparedStatement ps = null;140 ResultSet rs = null;141 List<Person> list = new ArrayList<>();142 try {143 ps = conn.prepareStatement(SQL_ALL);144 //返回结果集145 rs = ps.executeQuery();146 while(rs.next()) {147 //创建一个Person对象148 Person p = new Person();149 //这里的Result的getObject方法,参数为数据表中字段名,可以获取对应字段值150 p.setId(rs.getInt("id"));151 p.setName(rs.getString("name"));152 p.setGender(rs.getString("gender"));153 p.setAge(rs.getInt("age"));154 list.add(p);//添加至集合155 }156 return list;157 } catch (SQLException e) {158 e.printStackTrace();159 } finally {160 //关闭相关对象161 JdbcUtil.close(rs, ps, conn);162 }163 return null;164 }165 }
1 .로딩 드라이버 클래스 등록
2 . 연결 가져오기
3. SQL 문 실행(실행)
5(선택 사항) 관련 개체 닫기(순서: ResultSet) Statement/PreparedStatement, Connction)
Extension
위 프로세스는 기본적으로 데이터 테이블의 동작을 완벽하게 구현할 수 있지만, 제네릭, 리플렉션, 다오 레이어 코드 등의 기술을 사용하면 고정된 단일 데이터 테이블에만 사용할 수 있습니다. 추출 및 캡슐화하고 SQL 문을 추가하여 공동 테이블 쿼리를 구현함으로써 프로그램을 더욱 다양하고 유연하게 만들고 모든 데이터 테이블에 적용할 수 있습니다. 실제 개발 과정에서 hibernate, mybatis 등 일부 프레임워크는 JDBC를 캡슐화했으며, 기본 JDBC 작업을 통해 추가로 학습할 수 있습니다.
위 내용은 JDBC에 대한 간단한 예제 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!