55import ru .javawebinar .basejava .model .Resume ;
66import ru .javawebinar .basejava .sql .SqlHelper ;
77
8- import java .sql .DriverManager ;
9- import java .sql .ResultSet ;
8+ import java .sql .*;
109import java .util .ArrayList ;
10+ import java .util .LinkedHashMap ;
1111import java .util .List ;
1212import java .util .Map ;
1313
@@ -38,9 +38,7 @@ public Resume get(String uuid) {
3838 }
3939 Resume r = new Resume (uuid , rs .getString ("full_name" ));
4040 do {
41- String value = rs .getString ("value" );
42- ContactType type = ContactType .valueOf (rs .getString ("type" ));
43- r .addContact (type , value );
41+ addContact (rs , r );
4442 } while (rs .next ());
4543
4644 return r ;
@@ -49,33 +47,32 @@ public Resume get(String uuid) {
4947
5048 @ Override
5149 public void update (Resume r ) {
52- sqlHelper .execute ("UPDATE resume SET full_name = ? WHERE uuid = ?" , ps -> {
50+ sqlHelper .transactionalExecute (conn -> {
51+ try (PreparedStatement ps = conn .prepareStatement ("UPDATE resume SET full_name = ? WHERE uuid = ?" )) {
5352 ps .setString (1 , r .getFullName ());
5453 ps .setString (2 , r .getUuid ());
55- if (ps .executeUpdate () == 0 ) {
54+ if (ps .executeUpdate () != 1 ) {
5655 throw new NotExistStorageException (r .getUuid ());
5756 }
57+ }
58+ deleteContacts (conn , r );
59+ insertContact (conn , r );
5860 return null ;
5961 });
6062 }
6163
6264 @ Override
6365 public void save (Resume r ) {
64- sqlHelper .<Void >execute ("INSERT INTO resume (uuid, full_name) VALUES (?,?)" , ps -> {
66+ sqlHelper .transactionalExecute (conn -> {
67+ try (PreparedStatement ps = conn .prepareStatement ("INSERT INTO resume (uuid, full_name) VALUES (?,?)" )) {
6568 ps .setString (1 , r .getUuid ());
6669 ps .setString (2 , r .getFullName ());
6770 ps .execute ();
68- return null ;
69- });
70- for (Map .Entry <ContactType , String > e : r .getContacts ().entrySet ()) {
71- sqlHelper .<Void >execute ("INSERT INTO contact (resume_uuid, type, value) VALUES (?,?,?)" , ps -> {
72- ps .setString (1 , r .getUuid ());
73- ps .setString (2 , e .getKey ().name ());
74- ps .setString (3 , e .getValue ());
71+ }
72+ insertContact (conn , r );
7573 return null ;
7674 });
7775 }
78- }
7976
8077 @ Override
8178 public void delete (String uuid ) {
@@ -90,13 +87,22 @@ public void delete(String uuid) {
9087
9188 @ Override
9289 public List <Resume > getAllSorted () {
93- return sqlHelper .execute ("SELECT * FROM resume r ORDER BY full_name,uuid" , ps -> {
90+ return sqlHelper .execute ("" +
91+ " SELECT * FROM resume r\n " +
92+ "LEFT JOIN contact c ON r.uuid = c.resume_uuid\n " +
93+ "ORDER BY full_name, uuid" , ps -> {
9494 ResultSet rs = ps .executeQuery ();
95- List < Resume > resumes = new ArrayList <>();
95+ Map < String , Resume > map = new LinkedHashMap <>();
9696 while (rs .next ()) {
97- resumes .add (new Resume (rs .getString ("uuid" ), rs .getString ("full_name" )));
97+ String uuid = rs .getString ("uuid" );
98+ Resume resume = map .get (uuid );
99+ if (resume == null ) {
100+ resume = new Resume (uuid , rs .getString ("full_name" ));
101+ map .put (uuid , resume );
98102 }
99- return resumes ;
103+ addContact (rs , resume );
104+ }
105+ return new ArrayList <>(map .values ());
100106 });
101107 }
102108
@@ -107,4 +113,31 @@ public int size() {
107113 return rs .next () ? rs .getInt (1 ) : 0 ;
108114 });
109115 }
116+
117+ private void insertContact (Connection conn , Resume r ) throws SQLException {
118+ try (PreparedStatement ps = conn .prepareStatement ("INSERT INTO contact (resume_uuid, type, value) VALUES (?,?,?)" )) {
119+ for (Map .Entry <ContactType , String > e : r .getContacts ().entrySet ()) {
120+ ps .setString (1 , r .getUuid ());
121+ ps .setString (2 , e .getKey ().name ());
122+ ps .setString (3 , e .getValue ());
123+ ps .addBatch ();
124+ }
125+ ps .executeBatch ();
126+ }
127+ }
128+
129+ private void deleteContacts (Connection conn , Resume r ) {
130+ sqlHelper .execute ("DELETE FROM contact WHERE resume_uuid=?" , ps -> {
131+ ps .setString (1 , r .getUuid ());
132+ ps .execute ();
133+ return null ;
134+ });
135+ }
136+
137+ private void addContact (ResultSet rs , Resume r ) throws SQLException {
138+ String value = rs .getString ("value" );
139+ if (value != null ) {
140+ r .addContact (ContactType .valueOf (rs .getString ("type" )), value );
141+ }
142+ }
110143}
0 commit comments