Technology sharing

JavaWeb (3: JDBC et MVC)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

JavaWeb (1: Basic scientia et ambitus constructionis)icon-default.png?t=N7T8https://blog.csdn.net/xpy2428507302/article/details/140365130?spm=1001.2014.3001.5501JavaWeb (2: Servlet et Jsp, auditor et filter)icon-default.png?t=N7T8https://blog.csdn.net/xpy2428507302/article/details/140365159?spm=1001.2014.3001.5501

Tabula contentorum

10. JDBC

1 Overview

2.Write JDBC progressio

3. Detailed analysis

(1) Database url

(2) Connection genus

(III) Editio classis

(4) ResultSet class

(5) Release resources

4.SQL problema iniectio

5.JDBC transactions

6.JDBC instrumentum classis

7. Database nexu piscinam

(1 Overview

(2) Usus

8.DBUtils

11. MVC ORDO architecturae

1. Introductio

2. mvc tres ORDO architecturae


10. JDBC

1 Overview

JDBC (Java DataBase Connectivity): Java technologia database nexu

JDBC systema administrandi independenter a datorum specificorum et instrumentorum publicorum accessu et operationibus datorum SQL universalium.

Signorum statuto definit ut una via ad accessum diversis databases praebeatur.

JDBC applicatio API est ad accessum datorum, constans ex copia generum et instrumentorum in lingua Java scripta.

Duos gradus includit:

① Application-orientatur API programmatoribus ad nomen.

② Database API orientatur pro fabrica ut rectoribus datorum excolantur.

Varios databases cum JDBC coniungere, tantum opus est ut diversas sarcinas coegi database oneres, et de differentiis in linguis operandis datorum solliciti non debes.

2.Write JDBC progressio

crea database mensam

  1. CREATE TABLE users(
  2. id INT PRIMARY KEY,
  3. `name` VARCHAR(40),
  4. `password` VARCHAR(40),
  5. email VARCHAR(60),
  6. birthday DATE
  7. );
  8. INSERT INTO users(id,`name`,`password`,email,birthday)
  9. VALUES(1,'张三','123456','[email protected]','2000-01-01');
  10. INSERT INTO users(id,`name`,`password`,email,birthday)
  11. VALUES(2,'李四','123456','[email protected]','2000-01-01');
  12. INSERT INTO users(id,`name`,`password`,email,birthday)
  13. VALUES(3,'王五','123456','[email protected]','2000-01-01');
  14. SELECT * FROM users;

Import database clientelae

  1. <!--mysql的驱动-->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. <version>8.0.31</version>
  6. </dependency>

③ Usus JDBC:

Ⅰ. Onerare coegi database (pons inter programmata Java et datorum

Ⅱ. Vitam nexum, a nexu inter Java progressio et database

.

.

Ⅵ. Claudere nexum

  1. public class JDBCTest {
  2. public static void main(String[] args) throws Exception {
  3. //配置信息
  4. //要连接的数据库URL(解决中文乱码问题:useUnicode=true&characterEncoding=utf8&useSSL=true)
  5. String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8&useSSL=true";
  6. //连接的数据库时使用的用户名
  7. String username = "root";
  8. //连接的数据库时使用的密码
  9. String password = "123456";
  10. Connection conn = null;
  11. Statement st = null;
  12. ResultSet rs = null;
  13. try {
  14. //1.加载驱动
  15. Class.forName("com.mysql.cj.jdbc.Driver");
  16. //2.获取与数据库的链接
  17. conn = DriverManager.getConnection(url, username, password);
  18. //3.获取用于向数据库发送sql语句的statement对象
  19. st = conn.createStatement();
  20. String sql = "select id,name,password,email,birthday from users";
  21. //4.向数据库发sql,并获取代表结果集的resultset对象
  22. //查:executeQuery 增删改:executeUpdate
  23. rs = st.executeQuery(sql);
  24. //5.取出结果集的数据
  25. while (rs.next()) {
  26. System.out.println("id=" + rs.getInt("id"));
  27. System.out.println("name=" + rs.getString("name"));
  28. System.out.println("password=" + rs.getString("password"));
  29. System.out.println("email=" + rs.getString("email"));
  30. System.out.println("birthday=" + rs.getDate("birthday"));
  31. }
  32. } catch (ClassNotFoundException e) {
  33. e.printStackTrace();
  34. } catch (SQLException e) {
  35. e.printStackTrace();
  36. } finally {
  37. try {
  38. //6.关闭链接,释放资源(先开后关)
  39. rs.close();
  40. st.close();
  41. conn.close();
  42. } catch (SQLException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }
  47. }

3. Detailed analysis

(1) Database url

jdbc:mysql://localhost:3306/xxx

jdbcprotocol
mysqlsub-protocol
localhost: 3306exercitum: portum
xxxdatabase

Quomodo scribere consuevit database inscriptiones URL:

  • Oraculum scripturae: jdbc: oraculum: tenue;@localhost:1521: xxx
  • SqlServer写法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=xxx
  • MySql scribendi methodus: jdbc:mysql://localhost:3306/xxx

(2) Connection genus

Connexio adhibetur ad nexus datorum repraesentandos, et collectio maximi momenti est in programmatibus datorum.

Omnes interactiones inter clientem et database per nexum obiectum complentur.communes rationes hujus rei;

createStatement ()Facere id quod mittit sql ad datorum
prepareStatement (sql)Facere PrepareSatement quod mittit precompiled sql datorum
setAutoCommit (Boolean autoCommit)Set sive transactions statim commiserunt
committere()Submit transaction in link
reverti ()Reversum transactionis in hac pagina

(III) Editio classis

Obiectum enuntiationis SQL propositiones mittebat ad rationes rei publicae datorum communes.

executQuery (String sql)Solebant mittere propositiones interrogationes ad notitias et proventus ex statuto redde
executUpdate (String sql)Solebant mittere inserta, renovatio vel delere propositiones datorum et numerum ordinum in datorum renovatorum reddere
faciam (String sql)Mittebat arbitraria sql dicta datorum
addBatch (String sql)Multa sql dicta in massam
executeBatch ()Mitte massam sql constitutionibus datorum ad supplicium

Animadverte:

Ad efficientiam operandi emendandam, exsecutio methodi plerumque directe non adhibetur.

Pro his utere: execu- tiones pro queries;

(4) ResultSet class

ResultSet repraesentare proventuum Sql declarationum exsecutionis.

Resultset Cum encapsulans effectus exsecutionis statuto, uteresimilis mensamvia

ResultSet obiectum tenet cursorem monstrans ad mensam data ordines.Primo, cursor ante primum ordinem

Vocans ResultSet.next () methodus cursorem punctum ad certas notitias ordine facere potest, et modum getxxx vocare ut notitia ordinis obtineat.

Get aliqua species data

getObject (int index)

Adepto objectum secundum numerum columnarum

getObject (linea columnName)Adepto res secundum praefinitum proprium nomen

Get notitia de consimili, ut questus Missa genus

getString (int index)

A Missa secundum certum numerum columnarum

getString (String columnName)Missa ut secundum speciem attributi nominis objectum

③ Quomodo librum eventum pone: 

deinde()movere ad proximam lineam
Previous ()movere ad priorem aciem
absoluta (int row)Movere certa linea
beforefirst ()Movere frontem resultSet
afterLast ()Movere ad finem resultSet

(5) Release resources

Postquam programmatis Jdbc cursus finitur, memento dimittere res quae a programmatis creatae sunt penitus cum database in processu currens.

Haec res plerumque ResultSet, Statement et Connection obiecta.

Praesertim obiecto Connection, rarissimum est auxilium et statim post usum dimitti debet.

Si Connexio prompte et recte claudi non potest, facile ad systema downtime ducere potest.

Ut subsidia emissio codicis detegere possit, subsidia emissio codicis etiam in novissima constitutione collocanda est.

4.SQL problema iniectio

Duae quaestiones sunt, cum enuntiatio utens ad progressionem:

Fila chordae saepe scindendae sunt, et error rate altus est

  1. String username = "zhangsan";
  2. String password = "123";
  3. String sql = "select * from users where name='"+username+"' and password='"+password+"'";
  4. ResultSet rs = st.executeQuery(sql);

Est potential periculum SQL iniectio

SQL iniectio: Iniectio illicita SQL enuntiata in usorem inita, adhibitis technicis callidis ad chordas splices efficiens SQL ambitum brevem, data datorum furandi.

  1. public class SQLTest {
  2. public static void main(String[] args) throws Exception {
  3. // 正常登陆sql:select * from users where name='张三' and password ='123456'
  4. //login("张三","123456");
  5. // SQL 注入:select * from users where name='' and password ='123456' or '1'='1'
  6. login("", "123456' or '1'='1");
  7. }
  8. public static void login(String username, String password) throws Exception {
  9. String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8&useSSL=true";
  10. String dbUsername = "root";
  11. String dbPassword = "123456";
  12. //1.加载驱动
  13. Class.forName("com.mysql.cj.jdbc.Driver");
  14. //2.获取与数据库的链接
  15. Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
  16. //3.获取用于向数据库发送sql语句的statement
  17. Statement st = conn.createStatement();
  18. String sql = "select * from users where name='" + username + "' and password='" + password + "'";
  19. System.out.println(sql);
  20. //4.向数据库发sql,并获取代表结果集的rs
  21. ResultSet rs = st.executeQuery(sql);
  22. if (rs.next()) {
  23. System.out.println("登录成功");
  24. } else {
  25. System.out.println("登录失败");
  26. }
  27. //6.关闭链接,释放资源
  28. rs.close();
  29. st.close();
  30. conn.close();
  31. }
  32. }

operatio effectus;

Animadverte:

Primatus et in SQL enuntiatio maior est quam vel, sic exsecutum SQL aequivalet ut eligere * ab utentibus ubi '1' = '1';


Solutio:Usus Praeparationis, genus constitutionis, quae munus SQL placeholder praebet.

Non opus est chordis splices, et notitia ab usore inita plene detegatur, quo tutius fiat.

  1. public class PSTest {
  2. public static void main(String[] args) throws Exception {
  3. // 正常登陆sql:select * from users where name='张三' and password ='123456'
  4. //login("张三","123456");
  5. // SQL 注入:select * from users where name='' and password ='123456' or '1'='1'
  6. login("", "123456' or '1'='1");
  7. }
  8. public static void login(String username, String password) throws Exception {
  9. String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8&useSSL=true";
  10. String dbUsername = "root";
  11. String dbPassword = "123456";
  12. Class.forName("com.mysql.cj.jdbc.Driver");
  13. Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
  14. //获取用于向数据库发送预编译sql语句的prepareStatement
  15. String sql = "select * from users where name = ? and password = ?";
  16. System.out.println(sql);
  17. PreparedStatement ps = conn.prepareStatement(sql);
  18. //给占位符 ? 填充数据
  19. ps.setString(1, username);
  20. ps.setString(2, password);
  21. ResultSet rs = ps.executeQuery();
  22. if (rs.next()) {
  23. System.out.println("登录成功");
  24. } else {
  25. System.out.println("登录失败");
  26. }
  27. rs.close();
  28. ps.close();
  29. conn.close();
  30. }
  31. }

operatio effectus;

5.JDBC transactions

Transactio refertur ad rationem operationum, vel omnia prospera vel omnia adversa (principium ACID).

Cum programma Jdbc obtinet Connexionem objectum e datorum, obiecto Connection defalta sponte negotium datorum subiciet.

Si modum hunc default submissionem averte vis et plures SQLs in una re perfici permitte, sequenti JDBC transactionis constitutione uti potes.

Connection.setAutoCommit(falsus);

satus transaction
Connection.rollback();Reversum transaction
Connection.commit();committere transaction

crea rationem mensam

  1. /*创建账户表*/
  2. CREATE TABLE account(
  3. id INT PRIMARY KEY AUTO_INCREMENT,
  4. NAME VARCHAR(40),
  5. money DECIMAL(9,2)
  6. );
  7. /*插入测试数据*/
  8. insert into account(name,money) values('A',1000);
  9. insert into account(name,money) values('B',1000);
  10. insert into account(name,money) values('C',1000);

Simulate negotium sem cum translatio prospere

  1. //失败后让数据库自动回滚事务
  2. public class Demo {
  3. public static void main(String[] args) {
  4. String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8&useSSL=true";
  5. String username = "root";
  6. String password = "123456";
  7. Connection conn = null;
  8. try {
  9. Class.forName("com.mysql.cj.jdbc.Driver");
  10. conn = DriverManager.getConnection(url, username, password);
  11. //通知数据库开启事务,false表示开启
  12. conn.setAutoCommit(false);
  13. String sql1 = "update account set money=money-100 where name = 'A' ";
  14. conn.prepareStatement(sql1).executeUpdate();
  15. //模拟执行完SQL1之后程序出现了异常而导致后面的SQL无法正常执行,事务也无法正常提交
  16. int x = 1/0;
  17. String sql2 = "update account set money=money+100 where name = 'B' ";
  18. conn.prepareStatement(sql2)executeUpdate();
  19. //sql1 和 sql2都顺利执行,就提交事务
  20. conn.commit();
  21. System.out.println("成功!!!");
  22. } catch (Exception e) {
  23. //出现异常,通知数据库回滚事务
  24. conn.rollback();
  25. e.printStackTrace();
  26. } finally {
  27. conn.close();
  28. }
  29. }
  30. }

6.JDBC instrumentum classis

In diversis petitionibus, necesse est ut singulis temporibus facultates emissionis datorum coniungere, et multum repetitum codicem scribetur.

Encapsulate nexum datorum praeparationem et operationes emissio in genus instrumentum et eam directe vocant cum ea utens ad vitandum codicem repetitum scribens.

  1. public class JdbcUtil {
  2. private static Connection connection;
  3. private static String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8&useSSL=true";
  4. private static String username = "root";
  5. private static String password = "123456";
  6. //驱动(类)只需要加载一次,放静态代码块即可
  7. static {
  8. try {
  9. //加载数据库驱动
  10. Class.forName("com.mysql.cj.jdbc.Driver");
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. // 获取数据库连接对象
  16. public static Connection getConnection() throws SQLException {
  17. return DriverManager.getConnection(url, username, password);
  18. }
  19. // 释放资源(利用多态:Statement 和 PreparedStatement 都可以传进来)
  20. public static void release(Connection conn, Statement st, ResultSet rs) {
  21. try {
  22. if (rs != null) {
  23. rs.close();
  24. }
  25. if (st != null) {
  26. st.close();
  27. }
  28. if (conn != null) {
  29. conn.close();
  30. }
  31. } catch (SQLException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }

Causam voca, ut: user addendi

  1. public void add(String name, String password) {
  2. Connection conn = null;
  3. PreparedStatement ps = null;
  4. try {
  5. conn = JdbcUtil.getConnection();
  6. String sql = "insert into users(name,password) values(?,?)";
  7. ps = conn.prepareStatement(sql);
  8. ps.setString(1, name);
  9. ps.setString(2, password);
  10. ps.executeUpdate();
  11. } catch (SQLException e) {
  12. e.printStackTrace();
  13. } finally {
  14. JdbcUtil.release(conn, ps, null);
  15. }
  16. }

7. Database nexu piscinam

(1 Overview

JDBC processum progressionis:

Ⅰ .

.

Ⅳ. Scripto SQL dicta

.

.


Connexio database per DriverManager obtinetur. Quoties obtinetur, debes adhibere ad datorum connexionem et cognoscere nomen et tesseram usoris.

Users nexum a datorum pro unaquaque petitione obtinere necesse est, et nexum cum datorum creandis plerumque magnas facultates inter se consumit et longum tempus ad creandum sumit.

Quoties enuntiatio SQL exsecuta est, nexus disiungitur, quae vastitatem opum ac nexus datorum non bene reddi possunt.

Posito quod pagina 100,000 visitationes in die recipiat, ministrator datorum 100,000 nexus creare debet, quae ingens perditio opibus datorum datorum facile memoriam augere et dilatationem machinae causare potest.

Solutio: Database nexu piscinae

Fundamentalis idea nexus cum database piscinis:

Piscinam quiddam pro datorum constitue et certum numerum obiectorum nexuum in quiddam piscinae praemisso pone.

Cum vis nexum database obtinere, solum opus est ut obiectum e quiddam piscinae accipias.

Post usum, in piscinam quiddam reposuit ad usum proximae petitionis, consequendi reuse opum sine necessitate repetitae creationis.

Cum obiecti nexus otiosi non sint in nexu piscinae datorum, novae petitiones exspectationem intrabunt et alia fila nexum emittentem exspectabunt.

(2) Usus

Connexio datorum JDBC piscina perficitur usura interfaciei javax.sql.DataSource. DataSource est interfacies officialiter a Java.

Cum ea utendo, tincidunt non opus est ad interfaciendum se efficiendum et instrumenta tertia factionis uti possunt.

C3P0 est communis exsecutio partium tertiarum.

Vestigia usus:

importare clientelas in pom.xml

  1. <dependency>
  2. <groupId>com.mchange</groupId>
  3. <artifactId>c3p0</artifactId>
  4. <version>0.9.5.2</version>
  5. </dependency>

Scribe code

  1. public class DataSourceTest {
  2. public static void main(String[] args) {
  3. try {
  4. //创建C3P0数据库连接池
  5. ComboPooledDataSource dataSource=new ComboPooledDataSource();
  6. dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
  7. dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8");
  8. dataSource.setUser("root");
  9. dataSource.setPassword("123456");
  10. //设置初始化连接个数
  11. dataSource.setInitialPoolSize(5);
  12. //设置最大连接个数(连接池中不够,可以继续申请,申请后最终的上限)
  13. dataSource.setMaxPoolSize(20);
  14. //当连接对象不够时,再次申请的连接对象个数
  15. dataSource.setAcquireIncrement(5);
  16. //设置最小连接数(当连接池中剩余2个连接对象时,就去申请 --> 提前做准备)
  17. dataSource.setMinPoolSize(2);
  18. Connection conn=dataSource.getConnection();
  19. //SQL操作...
  20. //将连接还回到数据库连接池中
  21. conn.close();
  22. } catch (PropertyVetoException e) {
  23. e.printStackTrace();
  24. } catch (SQLException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }

Animadverte:

Connexio per methodum tradita: com.mysql.cj.jdbc.ConnectionImpl@3c153a1

Connexio consecuta C3P0: com.mchange.v2.c3p0.impl.NewProxyConnection@6156496

sic,Etsi omnes arctam methodum vocant, exsecutionem classes diversae sunt, ratio rescribendi etiam alia est.

Arcta methodus in C3P0 directe non destruit nexum resource, sed nexum redit ad nexum datorum piscinæ.


Superior methodus parametros occidendi ad piscinam nexum datorum directe in programmate Javae scripsit.

Hoc adoptaturhardcodevia,Omni tempore mutare configurationemOpus recompile, novum genus lima generare, efficacia nimis humilis

In ipsa evolutione, informatio configurationis de C3P0 in tabella xml definitur, et programmatis Javae tantum opus est ut limam configurationem oneret ad perficiendam initializationem operationis nexus datorum piscinae.

Postea solum debes conformationem mutare et figuram in xml sine recompensatione mutare.

Vestigia usus:

① In directorio facultatum, novum fasciculum crea nomine c3p0-config.xml

② imple in configuratione informationem in c3p0-config.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <c3p0-config>
  3. <!--配置连接池mysql-->
  4. <named-config name="C3P0Test">
  5. <!-- 指定连接数据源的基本属性 -->
  6. <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
  7. <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc?useUnicode=true&amp;characterEncoding=utf8</property>
  8. <property name="user">root</property>
  9. <property name="password">123456</property>
  10. <!-- 设置初始化连接个数 -->
  11. <property name="initialPoolSize">5</property>
  12. <!-- 设置最大连接个数(连接池中不够,可以继续申请,申请后最终的上限) -->
  13. <property name="maxPoolSize">20</property>
  14. <!-- 当连接对象不够时,再次申请的连接对象个数 -->
  15. <property name="acquireIncrement">5</property>
  16. <!-- 设置最小连接数(当连接池中剩余2个连接对象时,就去申请 -> 提前做准备) -->
  17. <property name="minPoolSize">2</property>
  18. </named-config>
  19. </c3p0-config>

Write Java progressio

  1. public class DataSourceTest {
  2. public static void main(String[] args) {
  3. try {
  4. //创建C3P0数据库连接池
  5. ComboPooledDataSource dataSource=new ComboPooledDataSource("C3P0Test");
  6. Connection conn=dataSource.getConnection();
  7. System.out.println(conn);
  8. //将连接还回到数据库连接池中
  9. conn.close();
  10. }catch (SQLException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. }

Animadverte:

① Parameter in methodo constructionis ComboPooledDataSource est nomen attributi valoris nominis config tag figuratus in c3p0-config.xml.

② Hoc tempore, instrumentum classis JDBC mutari potest sicut:

  1. public class JdbcUtil {
  2. private static DataSource dataSource;
  3. static {
  4. dataSource = new ComboPooledDataSource("C3P0Test");
  5. }
  6. // 获取数据库连接对象
  7. public static Connection getConnection() throws SQLException {
  8. Connection conn = null;
  9. try {
  10. conn = dataSource.getConnection();
  11. } catch (SQLException e) {
  12. e.printStackTrace();
  13. }
  14. return conn;
  15. }
  16. // 释放资源(利用多态:Statement 和 PreparedStatement 都可以传进来)
  17. public static void release(Connection conn, Statement st, ResultSet rs) {
  18. try {
  19. if (rs != null) {
  20. rs.close();
  21. }
  22. if (st != null) {
  23. st.close();
  24. }
  25. if (conn != null) {
  26. conn.close();
  27. }
  28. } catch (SQLException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }

8.DBUtils

  1. public static Student findById(Integer idx) {
  2. Connection conn = null;
  3. PreparedStatement st = null;
  4. ResultSet rs = null;
  5. Student stu = null;
  6. try {
  7. conn = JdbcUtil.getConnection();
  8. String sql = "select * from student where id = ?";
  9. PreparedStatement ps = conn.prepareStatement(sql);
  10. //给占位符 ? 填充数据
  11. ps.setInt(1, idx);
  12. rs = ps.executeQuery();
  13. //取出结果集的数据
  14. while (rs.next()) {
  15. Integer id = rs.getInt(1);
  16. String name = rs.getString(2);
  17. Double score = rs.getDouble(3);
  18. Date birthday = rs.getDate(4);
  19. stu = new Student(id, name, score, birthday);
  20. }
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. } finally {
  24. try {
  25. //关闭链接,释放资源
  26. rs.close();
  27. st.close();
  28. conn.close();
  29. } catch (SQLException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. return stu;
  34. }

In codice supradicto, operationes implendi locatores cum notitia et notitias e statuto extrahendi nimis gravia sunt.

Si 100 attributa sunt in Mensa Studentium, tunc 100 ordines scribendos debebimus in fascia notitias recuperandi, et etiam multos ordines ad implendum locatores habebimus.


Solutio:DBUtils tincidunt integram datam encapsulationis adiuvare possunt (mapping of result sets to Java objects).

Vestigia usus:

importare clientelas in pom.xml

  1. <dependency>
  2. <groupId>commons-dbutils</groupId>
  3. <artifactId>commons-dbutils</artifactId>
  4. <version>1.6</version>
  5. </dependency>

Scribe code

  1. public static Student findById(Integer idx) {
  2. Connection conn = null;
  3. Student stu = null;
  4. try {
  5. conn = JdbcUtil.getConnection();
  6. String sql = "select * from student where id = ?";
  7. //使用DBUtils
  8. QueryRunner qr = new QueryRunner();
  9. stu = qr.query(conn, sql, new BeanHandler<>(Student.class), idx);
  10. } catch (SQLException e) {
  11. e.printStackTrace();
  12. } finally {
  13. try {
  14. //关闭链接,释放资源
  15. conn.close();
  16. } catch (SQLException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. return stu;
  21. }

Hic, completis placeholders et eximendis effectibus statutis duabus lineis codicis effici potest.

singillatim:

① Quaesitio methodus transire debet in 4 parametris:

Connection object

SQL dicitur

Classis exsecutionem objecti interface ResultSetHandler (species conversio debet esse: Student.class)

Morbi ut populatio placeholders

② ResultSetHandler interfacies adhibetur ad processum proventuum causarum. Potest eventus quaesiti converti causas in Java objecta.

BeanHandlerMap exitum in Java objectum (ut objectum Student)
BeanListHandler Proventus describendi in collectionem electronicarum constitutus (ut: List<Student > )
MapHandler

Proventus Map pone in objecto collectionis Map

(ie: Map<String,Object> clavis: nomen attributum;

MapListHandler Proventus tabula geographica pone in collectione MapList (id est: List" <Map<<String,Object> &gt;)

③ Parameter ut implendi locumtenentis modulus variabilis est, ut quilibet numerus parametri praeteriri possit ut diversis utentium necessitatibus occurrat.

④ Objectum ordinis conversi (Discipulus class) modulatorem habere debet, secus propositum errorem nuntiabit.

rationem;Fundum iacuit hoc genus per Student.class, et deinde percogitationis mechanismInveni parametrum fabricatorem huius ordinis et suum obiectum crea.

Nomen attributi in genere prorsus idem esse debet ac nomen agri in tabula datorum.

Quia postquam res creata est, cum valores obiecti attribuentes proprietates ex statuto fundatae, inquisitio et assignatio fiunt ex nomine.

11. MVC ORDO architecturae

Quid est MVC?

  • Exemplar: exemplar (ministerium, dao, entis)
  • View: View (jsp, html, app client)
  • Controller: Controller (Servlet, Hander, Actio)

Post petitionem in applicatione JavaWeb intrat, Moderator petitionem accipit, processus negotium logices agit, et tandem exitum ad utentis redit (View + Model).

1. Introductio

Primis annis, cum applicationes interretiales operandi, utentes directe accesserunt ad imperium lavacrum, et iacuit moderatio recta datorum operare potuit:

servlet - CRUD (adde, delere, mutare)-&gt;database

In codice servletti: petitiones processus, responsiones, sententia salit, processus JDBC, processus negotii codicis, et processus codicis ratio.

Incommoda:Propositum est valde tumidus et ad sustentationem non conducit

solutio; Nihil est quod alterum tabulatum addens solvere non potest, si sit, alium tabulatum addat!

2. mvc tres ORDO architecturae

Model

  • Negotium processus: negotiatio logica (Service)
  • Data perseverantia iacuit: CRUD (DAO data pertinacia objecti)

view

  • ostentationem data
  • Praebere nexum petitionem Servlet incipiendi (a, forma, img...)

Controller (Servlet)

  • Accipere petitionem usoris: (req, petitionem parametri, notitia sessionis)
  • Tradere negotium accumsan ut computetur in codice correspondente
  • Imperium visum jump

Usorem et administratorem sume in exemplum:

Stratum moderatoris:

  1. @WebServlet("/login")
  2. public class LoginServlet extends HttpServlet {
  3. private LoginService loginService = new LoginServiceImpl();
  4. /* 处理登录的业务逻辑*/
  5. @Override
  6. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  7. String username = req.getParameter("username");
  8. String password = req.getParameter("password");
  9. String type = req.getParameter("type");
  10. Object object = loginService.login(username,password,type);
  11. if(object != null){
  12. HttpSession session = req.getSession();
  13. switch (type){
  14. case "reader":
  15. Reader reader = (Reader) object;
  16. session.setAttribute("reader",reader);
  17. //跳转到用户的首页
  18. resp.sendRedirect("/book?page=1");
  19. break;
  20. case "admin":
  21. Admin admin = (Admin) object;
  22. session.setAttribute("admin",admin);
  23. //跳转到管理员的首页
  24. resp.sendRedirect("/admin?method=findAllBorrow&page=1");
  25. break;
  26. }
  27. }else{
  28. resp.sendRedirect("login.jsp");
  29. }
  30. }
  31. }

Service accumsan:

  1. public interface LoginService {
  2. //利用多态,动态返回不同类型的对象
  3. public Object login(String username,String password,String type);
  4. }
  1. public class LoginServiceImpl implements LoginService {
  2. private ReaderRepository readerRepository = new ReaderRepositoryImpl();
  3. private AdminRepository adminRepository = new AdminRepositoryImpl();
  4. @Override
  5. public Object login(String username, String password,String type) {
  6. Object object = null;
  7. //业务逻辑处理:根据type的值,来选择调用不同的登录方法,去查找不同的表
  8. switch (type){
  9. case "reader":
  10. object = readerRepository.login(username,password);
  11. break;
  12. case "admin":
  13. object = adminRepository.login(username, password);
  14. break;
  15. }
  16. return object;
  17. }
  18. }

Dao / repositorium iacuit:

  1. public interface AdminRepository {
  2. public Admin login(String username,String password);
  3. }
  1. public interface ReaderRepository {
  2. public Reader login(String username,String password);
  3. }
  1. public class AdminRepositoryImpl implements AdminRepository {
  2. //管理员的登录方法(和数据库交互)
  3. @Override
  4. public Admin login(String username, String password) {
  5. Connection connection = JDBCTools.getConnection();
  6. String sql = "select * from bookadmin where username = ? and password = ?";
  7. PreparedStatement statement = null;
  8. ResultSet resultSet = null;
  9. Admin admin = null;
  10. try {
  11. statement = connection.prepareStatement(sql);
  12. statement.setString(1,username);
  13. statement.setString(2,password);
  14. resultSet = statement.executeQuery();
  15. if(resultSet.next()){
  16. admin = new Admin(resultSet.getInt(1),resultSet.getString(2),resultSet.getString(3));
  17. }
  18. } catch (SQLException e) {
  19. e.printStackTrace();
  20. } finally {
  21. JDBCTools.release(connection,statement,resultSet);
  22. }
  23. return admin;
  24. }
  25. }
  1. public class ReaderRepositoryImpl implements ReaderRepository {
  2. //用户的登录方法(和数据库交互)
  3. @Override
  4. public Reader login(String username, String password) {
  5. Connection connection = JDBCTools.getConnection();
  6. String sql = "select * from reader where username = ? and password = ?";
  7. PreparedStatement statement = null;
  8. ResultSet resultSet = null;
  9. Reader reader = null;
  10. try {
  11. statement = connection.prepareStatement(sql);
  12. statement.setString(1,username);
  13. statement.setString(2,password);
  14. resultSet = statement.executeQuery();
  15. if(resultSet.next()){
  16. reader = new Reader(resultSet.getInt(1),resultSet.getString(2),resultSet.getString(3),resultSet.getString(4),resultSet.getString(5),resultSet.getString(6),resultSet.getString(7));
  17. }
  18. } catch (SQLException e) {
  19. e.printStackTrace();
  20. } finally {
  21. JDBCTools.release(connection,statement,resultSet);
  22. }
  23. return reader;
  24. }
  25. }