반응형
spring boot 에서 jpa 와 jdbctemplate 을 제공해주며 , jpa 와 jdbctemplate 동시에 둘다 사용 가능 하다.
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
접속 정보는 properties 에 아래와 같이 한다.
spring.datasource.username=xxxx
spring.datasource.password=xxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://xxxx:xxxx/parcelab-test?characterEncoding=utf-8&autoReconnect=true&useSSL=false
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.ddl-auto=update
#spring.jpa.show-sql=true
위와 같이 설정하면 JPA , JdbcTemplate 에서 사용 가능하다.
@Entity
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "username", unique = true)
private String username;
private String name;
private int age;
}
@Component
public class UserDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
private final String INSERTSQL="INSERT INTO USER(username,name,age) values(?,?,?)";
User create(User user){
KeyHolder holder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement ps = con.prepareStatement(INSERTSQL, Statement.RETURN_GENERATED_KEYS);
ps.setString(1,user.getUsername());
ps.setString(2,user.getName());
ps.setString(3, user.getAge()+"");
return ps;
}
},holder);
int newUserId=holder.getKey().intValue();
user.setId(newUserId);
return user;
}
void createList(List<User> userList) {
List<Object[]> batch = new ArrayList<Object[]>();
for (User user:userList) {
Object[] values = new Object[]{
user.getUsername(),user.getName(),user.getAge()
};
batch.add(values);
}
int[] updateCounts = jdbcTemplate.batchUpdate(INSERTSQL,batch);
}
}
public interface UserRepository extends JpaRepository<User,String> {
}
@Autowired
UserRepository userRepository;
@Autowired
private UserDAO userDAO;
@PostConstruct
public void saveUser() throws Exception{
/** jdcbtemplate saveIterable **/
userRepository.deleteAll();
long startTime = System.currentTimeMillis();
System.out.println("### JdbcTemplate saveList 함수 시작시간: "+formatTime(startTime));
userDAO.createList(generateUserList());
long endTime = System.currentTimeMillis();
System.out.println("### JdbcTemplate saveList 저장 시간: "+(endTime-startTime)/1000.0);
System.out.println("### JdbcTemplate saveList 함수 종료 시간: "+formatTime(endTime));
/** jpa saveIterable **/
userRepository.deleteAll();
startTime = System.currentTimeMillis();
System.out.println("### JPA saveList 함수 시작시간: "+formatTime(startTime));
userRepository.save(generateUserList());
endTime = System.currentTimeMillis();
System.out.println("### JPA saveList 저장 시간: "+(endTime-startTime)/1000.0);
System.out.println("### JPA saveList 함수 종료 시간: "+formatTime(endTime));
}
public List<User> generateUserList(){
List<User> userList = new ArrayList<>();
for (int i = 0; i < 1000 ; i++) {
User user = new User("Testusername-"+i,"Testname-"+i,i);
userList.add(user);
}
return userList;
}
public User generateUser(){
User user = new User();
user.setUsername("test1");
user.setName("test1");
user.setAge(200);
return user;
}
public String formatTime(long time) throws Exception{
Calendar ca = Calendar.getInstance();
ca.setTimeInMillis(time);
return (ca.get(Calendar.HOUR_OF_DAY) + "시 " + ca.get(Calendar.MINUTE) + "분 " + ca.get(Calendar.SECOND) + "." + ca.get(Calendar.MILLISECOND) + "초");
}
실행 결과:
### JdbcTemplate saveList 함수 시작시간: 18시 12분 39.476초
### JdbcTemplate saveList 저장 시간: 7.676
### JdbcTemplate saveList 함수 종료 시간: 18시 12분 47.152초
### JPA saveList 함수 시작시간: 18시 12분 47.185초
### JPA saveList 저장 시간: 5.763
### JPA saveList 함수 종료 시간: 18시 12분 52.948초
JPA 저장 속도가 JdbcTemplate 보다 좀 더 빠른것을 알수 있다.
반응형
'SpringBoot' 카테고리의 다른 글
spring cloud config (0) | 2018.02.18 |
---|---|
spring boot admin server (0) | 2018.02.11 |
JPA saveIterable 과 save 저장 속도 (1) | 2017.09.28 |
JPA 사용시 Lombok 의 Data 어노테이션 사용 이슈 (0) | 2017.08.28 |
xml convert to object (0) | 2017.08.26 |