คำถามติดแท็ก jdbc

JDBC (การเชื่อมต่อ Java DataBase) เป็น API ฐานซึ่งเปิดใช้งานการโต้ตอบกับเซิร์ฟเวอร์ฐานข้อมูล SQL โดยดำเนินการคำสั่ง SQL โดยใช้ภาษาการเขียนโปรแกรม Java

15
ความแตกต่างระหว่าง Statement และ PreparedStatement
แถลงการณ์ที่เตรียมไว้เป็นแถลงการณ์ที่มีประสิทธิภาพมากกว่าเล็กน้อยและควรมีอย่างน้อยเร็วและง่ายต่อการจัดการเหมือนแถลงการณ์ คำแถลงที่เตรียมไว้อาจถูกตีความได้ ฐานข้อมูลเชิงสัมพันธ์ส่วนใหญ่จัดการแบบสอบถาม JDBC / SQL ในสี่ขั้นตอน: แยกแบบสอบถาม SQL ขาเข้า รวบรวมแบบสอบถาม SQL วางแผน / ปรับเส้นทางการเก็บข้อมูลให้เหมาะสม ดำเนินการค้นหา / รับและส่งคืนข้อมูลที่ดีที่สุด คำชี้แจงจะดำเนินการผ่านสี่ขั้นตอนด้านบนสำหรับแบบสอบถาม SQL แต่ละรายการที่ส่งไปยังฐานข้อมูลเสมอ คำชี้แจงที่เตรียมไว้ล่วงหน้าจะดำเนินการตามขั้นตอน (1) - (3) ในกระบวนการดำเนินการข้างต้น ดังนั้นเมื่อสร้างคำสั่งที่เตรียมไว้จะมีการดำเนินการเพิ่มประสิทธิภาพล่วงหน้าทันที ผลที่ได้คือการลดภาระให้กับเอ็นจินฐานข้อมูล ณ เวลาดำเนินการ ตอนนี้คำถามของฉันคือ - "ประโยชน์อื่น ๆ ของการใช้งบเตรียม?"
222 java  jdbc 

5
วิธีการดำเนินการแบบสอบถาม IN () SQL ที่มี JDBCTemplate ของ Spring มีผลบังคับใช้อย่างไร
ฉันสงสัยว่ามีวิธีที่สง่างามกว่าในการทำคำสั่ง IN () กับ JDBCTemplate ของ Spring หรือไม่ ขณะนี้ฉันทำอะไรแบบนั้น: StringBuilder jobTypeInClauseBuilder = new StringBuilder(); for(int i = 0; i < jobTypes.length; i++) { Type jobType = jobTypes[i]; if(i != 0) { jobTypeInClauseBuilder.append(','); } jobTypeInClauseBuilder.append(jobType.convert()); } ซึ่งค่อนข้างเจ็บปวดเพราะถ้าฉันมีเก้าบรรทัดเพียงเพื่อสร้างประโยคสำหรับแบบสอบถาม IN () ฉันต้องการได้อะไรเช่นการแทนที่พารามิเตอร์ของข้อความที่เตรียมไว้
177 java  sql  spring  jdbc  jdbctemplate 

6
ใช้สัญลักษณ์ตัวแทน“ like” ในคำสั่งที่เตรียมไว้
ฉันใช้คำสั่งที่เตรียมไว้เพื่อดำเนินการค้นหาฐานข้อมูล mysql และฉันต้องการที่จะใช้ฟังก์ชั่นการค้นหาตามคำหลักแปลก ๆ เพื่อที่ฉันจะต้องใช้LIKEคำหลักที่ฉันรู้ และฉันยังเคยใช้งบเตรียมมาก่อน แต่ฉันไม่รู้ว่าจะใช้มันอย่างไรLIKEเพราะจากรหัสต่อไปนี้ฉันจะเพิ่มได้'keyword%'ที่ไหน? ฉันสามารถใช้มันโดยตรงในpstmt.setString(1, notes)ฐานะที่เป็น(1, notes+"%")หรืออะไรทำนองนั้น ฉันเห็นโพสต์มากมายบนเว็บนี้ แต่ไม่มีคำตอบที่ดีเลย PreparedStatement pstmt = con.prepareStatement( "SELECT * FROM analysis WHERE notes like ?"); pstmt.setString(1, notes); ResultSet rs = pstmt.executeQuery();

13
ฉันจะรับ SQL ของ PreparedStatement ได้อย่างไร
ฉันมีวิธี Java ทั่วไปที่มีลายเซ็นวิธีการดังต่อไปนี้: private static ResultSet runSQLResultSet(String sql, Object... queryParams) มันเปิดการเชื่อมต่อสร้างการPreparedStatementใช้คำสั่ง sql และพารามิเตอร์ในqueryParamsอาร์เรย์ความยาวตัวแปรเรียกใช้แคชResultSet(ในCachedRowSetImpl), ปิดการเชื่อมต่อและส่งกลับชุดผลแคช ฉันมีข้อยกเว้นการจัดการในวิธีการที่บันทึกข้อผิดพลาด ฉันบันทึกคำสั่ง sql เป็นส่วนหนึ่งของบันทึกเนื่องจากมีประโยชน์มากสำหรับการแก้ไขข้อบกพร่อง ปัญหาของฉันคือการบันทึกตัวแปร String จะsqlบันทึกคำสั่งเทมเพลตด้วยหรือไม่แทนค่าจริง ฉันต้องการบันทึกคำสั่งจริงที่ดำเนินการ (หรือพยายามดำเนินการ) ดังนั้น ... มีวิธีที่จะได้รับคำสั่ง SQL ที่เกิดขึ้นจริงที่จะดำเนินการโดยใดPreparedStatement? ( โดยไม่ต้องสร้างมันด้วยตัวเองถ้าฉันไม่สามารถหาวิธีเข้าถึงPreparedStatement'sSQL ได้ฉันอาจจะสร้างมันด้วยตัวเองในcatches)

16
การโทร jdbc แบบอะซิงโครนัสเป็นไปได้หรือไม่?
ฉันสงสัยว่ามีวิธีการโทรแบบอะซิงโครนัสกับฐานข้อมูลหรือไม่? ตัวอย่างเช่นลองนึกภาพว่าฉันมีคำขอใหญ่ ๆ ที่ต้องใช้เวลานานในการประมวลผลฉันต้องการส่งคำขอและรับการแจ้งเตือนเมื่อคำขอนั้นส่งคืนค่า (โดยส่งผู้ฟัง / ติดต่อกลับหรือบางอย่าง) ฉันไม่ต้องการบล็อครอให้ฐานข้อมูลตอบ ฉันไม่คิดว่าการใช้กลุ่มของเธรดเป็นวิธีแก้ปัญหาเพราะมันไม่ได้ปรับขนาดในกรณีที่มีการร้องขอที่เกิดขึ้นพร้อมกันจำนวนมากสิ่งนี้จะทำให้เกิดเธรดจำนวนมาก เรากำลังประสบปัญหานี้กับเซิร์ฟเวอร์เครือข่ายและเราพบวิธีแก้ปัญหาโดยใช้การเรียกระบบเลือก / แบบสำรวจ / epoll เพื่อหลีกเลี่ยงการมีหนึ่งเธรดต่อการเชื่อมต่อ ฉันแค่สงสัยว่าจะมีคุณสมบัติที่คล้ายกับคำขอฐานข้อมูลได้อย่างไร หมายเหตุ: ฉันทราบว่าการใช้ FixedThreadPool อาจเป็นการแก้ไขที่ดี แต่ฉันประหลาดใจที่ไม่มีใครพัฒนาระบบแบบอะซิงโครนัสจริงๆ (โดยไม่ต้องใช้เธรดพิเศษ) ** ปรับปรุง ** เพราะการขาดของการแก้ปัญหาในทางปฏิบัติจริงที่ฉันตัดสินใจที่จะสร้างห้องสมุด (ส่วนหนึ่งของ finagle) ตัวเอง: finagle-MySQL โดยทั่วไปจะทำการถอดรหัส / ถอดรหัสการร้องขอ / ตอบกลับ mysql และใช้ Finagle / Netty ภายใต้ประทุน มันปรับขนาดได้อย่างดีเยี่ยมแม้จะมีการเชื่อมต่อจำนวนมาก

28
ORA-12505, TNS: ผู้ฟังไม่ทราบ SID ที่ระบุในตัวอธิบายการเชื่อมต่อ
ฉันได้ติดตั้ง Oracle 11g Express Edition Release 2 ในระบบปฏิบัติการ windows 7 64 บิตของฉันแล้วและพยายามรันโปรแกรม JDBC จากนั้นฉันก็พบข้อผิดพลาดดังต่อไปนี้: java.sql.SQLException: Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:412) at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531) at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown …
154 oracle  jdbc 


5
ฉันควรใช้ลองกับทรัพยากรกับ JDBC อย่างไร
ฉันมีวิธีรับผู้ใช้จากฐานข้อมูลด้วย JDBC: public List<User> getUser(int userId) { String sql = "SELECT id, name FROM users WHERE id = ?"; List<User> users = new ArrayList<User>(); try { Connection con = DriverManager.getConnection(myConnectionURL); PreparedStatement ps = con.prepareStatement(sql); ps.setInt(1, userId); ResultSet rs = ps.executeQuery(); while(rs.next()) { users.add(new User(rs.getInt("id"), rs.getString("name"))); } rs.close(); ps.close(); con.close(); } …

10
ฉันจะค้นหา MySQL URL โฮสต์พอร์ตและชื่อผู้ใช้ได้อย่างไร
ฉันต้องการค้นหาชื่อผู้ใช้ MySQL ของฉัน เมื่อฉันเปิดไคลเอนต์บรรทัดคำสั่ง MySQL จะถามรหัสผ่านของฉันเท่านั้น ฉันจำชื่อผู้ใช้ไม่ได้ และสำหรับการเชื่อมต่อกับ JDBC ฉันต้องการ URL โฮสต์และหมายเลขพอร์ต ฉันจะหาสิ่งเหล่านี้ได้จากที่ไหน?

12
'0000-00-00 00:00:00' ไม่สามารถแสดงเป็นข้อผิดพลาด java.sql.Timestamp
ฉันมีตารางฐานข้อมูลที่มีวันที่ (`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'). ฉันใช้ MySQL จากโปรแกรมบางครั้งข้อมูลถูกส่งโดยไม่มีวันที่ไปยังฐานข้อมูล ดังนั้นค่าวันที่จะถูกกำหนดโดยอัตโนมัติ0000-00-00 00:00:00 เมื่อข้อมูลตารางถูกเรียกพร้อมกับคอลัมน์วันที่ซึ่งทำให้เกิดข้อผิดพลาด ...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp....... ฉันพยายามส่งผ่านค่า Null ไปยังวันที่เมื่อแทรกข้อมูล แต่ได้รับมอบหมายให้เป็นเวลาปัจจุบัน มีวิธีใดบ้างที่ฉันจะได้รับResultSetโดยไม่ต้องเปลี่ยนโครงสร้างตาราง?
141 java  mysql  jdbc  timestamp 

10
PreparedStatement จะหลีกเลี่ยงหรือป้องกันการแทรก SQL ได้อย่างไร
ฉันรู้ว่า PreparedStatements หลีกเลี่ยง / ป้องกัน SQL Injection มันทำได้อย่างไร? แบบสอบถามฟอร์มสุดท้ายที่สร้างโดยใช้ PreparedStatements จะเป็นสตริงหรืออย่างอื่น?

4
JPA หรือ JDBC ต่างกันอย่างไร?
ฉันกำลังเรียนรู้ Java EE และฉันดาวน์โหลด eclipse ด้วย glassfish สำหรับสิ่งเดียวกัน ฉันเห็นตัวอย่างบางส่วนและอ่านเอกสาร Oracle เพื่อทราบข้อมูลทั้งหมดเกี่ยวกับ Java EE 5 การเชื่อมต่อกับฐานข้อมูลนั้นง่ายมาก ฉันเปิดโปรเจ็กต์เว็บแบบไดนามิกสร้างเซสชัน EJB ฉันใช้ EntityManager และด้วยเมธอด get สามารถเข้าถึงตารางข้อมูลที่เก็บไว้ได้ สำหรับโปรเจ็กต์ถัดไปของฉันฉันได้สร้างคลาสง่ายๆจากนั้นเข้าถึงตาราง DB ปัญหาแรกที่ฉันพบคือแอตทริบิวต์ PersistenceUnit จะได้รับการยอมรับโดย EJB, Servlet และอื่น ๆ เท่านั้นไม่ใช่คลาส java ธรรมดา ดังนั้นฉันจึงไม่สามารถใช้วิธี EntityManager ได้ (หรือฉันสามารถ?) ฉันถูกขอให้ไปทาง "JDBC" ปัญหาแรกที่ฉันพบคือการเชื่อมต่อกับ DB ดูเหมือนว่าทั้งหมดนี้จะต้องเป็นฮาร์ดโค้ด ฉันมี persistence.xml ซึ่งฉันสามารถกำหนดค่าการเชื่อมต่อฐานข้อมูลได้อย่างง่ายดาย แม้แต่การตั้งค่าไดรเวอร์สำหรับ DB ก็ทำได้ง่าย นอกจากนี้ยังไม่มีเมธอด …
119 java  jpa  jdbc 

10
สตริงการเชื่อมต่อไดรเวอร์ MySQL JDBC คืออะไร
ฉันเพิ่งเริ่มใช้ JDBC และฉันกำลังพยายามเชื่อมต่อกับฐานข้อมูล MySQL ฉันใช้ไดรเวอร์ Connector / J แต่ฉันไม่พบสตริงการเชื่อมต่อ JDBC สำหรับClass.forName()วิธีการของฉัน

3
java: comp / env / do คืออะไร?
ฉันใช้เวลาในแต่ละวันมากเกินไปในการพยายามหาข้อผิดพลาดบางอย่างเมื่อเชื่อมต่อถั่วโรงงาน JNDI ปัญหากลับกลายเป็นว่าแทนที่จะเป็นแบบนี้ ... <bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/jdbc/loc"/> </bean> ฉันได้เขียนสิ่งนี้จริงๆ ... <bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="jdbc/loc"/> </bean> ฉันสรุปได้ว่าjava:comp/env/บางทีอาจอ้างถึงตัวแปรสภาพแวดล้อมบางอย่างและทำให้เป็นเช่นนั้นในที่สุดไฟล์บริบทของฉันจะถูกดู java:comp/env/ความแตกต่างเพียงอย่างเดียวคือ จากปากผู้เชี่ยวชาญนั่นทำอะไร? โดยไม่ต้องjava:comp/env/คำนำหน้าในมูลค่าที่ฉันจะได้รับข้อผิดพลาดที่กล่าวว่า"ชื่อ JDBC ไม่ผูกพันในบริบทนี้"
116 spring  jdbc  jndi  factory 

13
java.sql.SQLException: - ORA-01000: เกินเคอร์เซอร์เปิดสูงสุด
ฉันได้รับข้อยกเว้น ORA-01000 SQL ดังนั้นฉันจึงมีคำถามที่เกี่ยวข้องกับมัน เคอร์เซอร์แบบเปิดสูงสุดเกี่ยวข้องกับจำนวนการเชื่อมต่อ JDBC หรือไม่หรือเกี่ยวข้องกับคำสั่งและวัตถุผลลัพธ์ที่เราสร้างขึ้นสำหรับการเชื่อมต่อเดียวหรือไม่ (เรากำลังใช้กลุ่มการเชื่อมต่อ) มีวิธีกำหนดค่าจำนวนวัตถุคำสั่ง / ผลลัพธ์ในฐานข้อมูลหรือไม่ (เช่นการเชื่อมต่อ) แนะนำให้ใช้คำสั่งตัวแปรอินสแตนซ์ / ออบเจ็กต์ผลลัพธ์แทนวิธีโลคัลคำสั่ง / อ็อบเจ็กต์ผลลัพธ์ในสภาพแวดล้อมเธรดเดียวหรือไม่ การดำเนินการคำสั่งที่เตรียมไว้ในลูปทำให้เกิดปัญหานี้หรือไม่ (แน่นอนฉันสามารถใช้ sqlBatch ได้) หมายเหตุ: pStmt ถูกปิดเมื่อลูปสิ้นสุดลง { //method try starts String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)"; pStmt = obj.getConnection().prepareStatement(sql); pStmt.setLong(1, subscriberID); for (String language : additionalLangs) { pStmt.setInt(2, …
115 java  oracle  jdbc 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.