±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁË
Spring Data JDBC µÄÓÉÀ´¡¢»ù±¾Ê¹Óá¢ÓëÏÖÓм¼ÊõµÄÒìͬ£¬ÒÔ¼°Êµ¼ùÖеľÑéµÈÏà¹ØÄÚÈÝ£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×Ô΢ÐŹ«Öںűà×ß±àÏ룬ÓÉ»ðÁú¹ûÈí¼þLuca±à¼¡¢ÍƼö¡£ |
|
Spring Data ¼Ò×å×î½ü¶àÁËÒ»¸öгÉÔ±£ºSpring Data
JDBC£¨Ä¿Ç°×îÐÂÕýʽ°æÊÇ 1.0.9£¬ÏîÄ¿Ö÷Ò³ÊÇ https://spring.io/projects/spring-data-jdbc
£©¡£ÒòΪ×î½üʹÓÃÁ˴˼¼Êõ£¬ËùÒÔ±ãÏëдÎÄ¶ÔÆä½éÉÜÒ»¶þ¡£
±¾ÎĵÄÄÚÈÝÖ÷񻃾¼° Spring Data JDBC µÄÓÉÀ´¡¢»ù±¾Ê¹Óá¢ÓëÏÖÓм¼ÊõµÄÒìͬ£¬ÒÔ¼°Êµ¼ùÖеľÑé¡£
Spring Data JDBC£¬¹ËÃû˼Ò壬ÊÇÒ»¸ö»ùÓÚ JDBC µÄÊý¾Ý¿â³Ö¾Ã»¯¿ò¼Ü¡£ÕâÒ»ÁìÓò¼¼Êõ²»ÉÙ£¬³£ÓõÄÓÐ
Hibernate¡¢MyBatis£¬»¹ÓлùÓÚ Hibernate/JPA µÄ Spring Data
JPA£¬²»Ì«³£ÓõÄÓÐ JOOQ¡¢QueryDSL µÈ¡£ÄÇΪºÎ Spring ÒªÁíÆð¯ÔÔì¸öÐÂÂÖ×ÓÄØ£¿ÔڻشðÕâ¸öÎÊÌâ֮ǰ£¬ÏÈÀ´¼òµ¥½éÉÜÒ»ÏÂ
Spring Data JDBC µÄÓ÷¨¡£
Ò»¡¢»ù±¾Ê¹ÓÃ
ºÍ Spring Data JPA ¼°ÆäËü Spring Data ¼¼ÊõÀàËÆ£¬Spring Data
JDBC µÄ»ù±¾Ê¹ÓÃÖ»ÐèÈý²½£º1. Ôö¼Ó Maven/Gradle ÒÀÀµ£»2. ¶¨ÒåʵÌåÀࣻ3. ¶¨Òå
Repository ½Ó¿Ú¡£ÒÀÀµÅäÖÃÌø¹ý²»½éÉÜÁË£¬ÎÒÃÇÖ±½ÓÀ´¿´´úÂ벿·Ö¡£
@Table("t_user")
class User {
@Id
private Long id;
private String username;
private String email;
private UserStatus status;
/** Getter/Setter **/
}
interface UserDao extends CrudRepository<User,
Long>, UserRepositoryExtension {
@Query("select * from t_user where username
= :username")
Optional<User> findByUsername(String username);
} |
´óÌåÉÏ¿´£¬Spring Data JDBC µÄÓ÷¨ºÍ Spring Data JPA ÀàËÆ£¬Í¬ÑùÒ²¿ÉÒÔÁãʵÏÖ»ñµÃ»ù±¾µÄÔöɾ¸Ä²é¹¦ÄÜ¡£²¢ÇÒ£¬Í¬
Spring Data JPA Ò»Ñù£¬insert ºÍ update ÕâÁ½¸ö²Ù×÷¶¼ÄÜͨ¹ýͬ CrudRepository#save
·½·¨ÊµÏÖ¡£Ñ¡Ôñ·½·¨ÊÇ¿´ÊµÌåÖÐÖ÷¼üÊÇ·ñÓÐÖµ¡£Èç¹ûûÓÐÖµ£¬ÄǾÍÊÇ insert£¬ÓУ¬ÔòÊÇ update¡£
ºÍ Spring Data JPA ²»Í¬µØ·½ÔÚÓÚ£º
²»ÐèÒª @Entity ×¢½â£¬ @Table¡¢ @Id Ò²ÊÇ Spring Data ÌṩµÄ£¬¶ø²»ÊÇ
JPA µÄ£»
Spring Data JDBC ²»Ö§³ÖÖ±½Óͨ¹ý·½·¨Ãû»ñµÃ»ù±¾µÄ²éѯ¹¦ÄÜ£¬¶øÊDZØÐëͨ¹ýÔÚ @Query
Öж¨Òå SQL ʵÏÖ£»
Spring Data JDBC Ö§³Ö×Ô¶¨ÒåÀ©Õ¹£¬Õâ¸öÔÚºóÃæ»áÏêϸ½éÉÜ£»
ÎÒ¸öÈ˾õµÃ£¬²»Ïñ Spring Data JPA ºÍ Mongo ÄÇÑù£¬²»Ö§³Öͨ¹ý·½·¨Ãû»ñµÃ»ù±¾²éѯ¹¦ÄÜÊÇ
Spring Data JDBC µÄÒ»Ïîȱµã£¬µ«²»ÑÏÖØ¡£±Ï¾¹£¬¶ÔÓÚ¼òµ¥µÄ²éѯ£¬ÔÉú SQL дÆðÀ´²»Âé·³¡£´ÓÏîÄ¿³¤ÆÚ·¢Õ¹½Ç¶È¿´£¬Õâµã¹¤×÷Á¿Ëã²»ÁËʲô¡£
ÄdzýÈ¥±íÃæÉϵIJîÒ죬Spring Data JDBC ºÍ Spring Data JPA µÄ²»Í¬Ö®´¦ÓÖÓÐÄÄЩ£¿
¶þ¡¢Óë Spring Data JPA µÄ²»Í¬µã
¼òµ¥
Spring Data JPA »ùÓÚ Hibernate£¬¶ø Hibernate ÊÇÒ»¸öÈÃÈËÓÖ°®Óֺ޵ļ¼Êõ¡£Í¬ÔÉú
JDBC Ïà±È£¬Hibernate ¼«´óµØ¼ò»¯ÁË¿ª·¢¹¤×÷Á¿£»µ«ÁíÒ»·½Ã棬ÒòΪ Dirty Check¡¢ÑÓ³Ù¼ÓÔØ¡¢¸÷ÖÖÈç
ManyToOne µÈÓ³É乿Ôò£¬ÓÖÈà Hibernate ³ÉΪÁËÒ»¸ö¸´ÔÓ¼¼Êõ¡£¶øÕâЩ¸´ÔÓÐÔ£¬Æ½Ê±ºÜÉÙÖ±½ÓÓõ½£¬µ«ÊÇÈ´Ôö¼ÓÁË
Hibernate µÄ¿ª·¢ºÍµ÷ÊÔÄѶȡ£
Spring Data JDBC µÄÒ»¸öÒâÒå¾ÍÔÚÓÚ£¬Èÿª·¢ÈËÔ±ÏíÊÜÀàËÆÓÚ Hibernate Ëù´øÀ´µÄ±ã½ÝµÄͬʱ£¬±ÜÃâ±»
Hibernate ¸ß¼¶ÌØÐԵĹý¶È¸´ÔÓËùÀ§ÈÅ¡£
Óë MyBatis ¼¯³É
Hibernate Óë MyBatis ÕýÏñÊÇÓ²±ÒµÄÁ½Ãæ.Óë Hibernate Ïà±È£¬MyBatis
¼òµ¥¡¢Ò×Óᢿɿ¿£¬µ«ÊÇÄÑÃâÏÔµÃÂÞàÂÁËһЩ¡£ÕâÖÖÂÞàÂÔÚ»ù±¾¹¦ÄܲãÃæÏԵøü¼ÓÃ÷ÏÔ¡£ËäÈ»£¬ÔÚ´óÐÍÏîÄ¿ÖУ¬»ù±¾¹¦ÄÜʵÏÖ²ãÃæµÄÂÞಢ²»ÊÇ´óÎÊÌ⣨ÕâÒ²ÊÇ»¥ÁªÍø¹«Ë¾Ï²»¶ÓÃ
MyBatis µÄÔÒò£©£¬µ«¸ü¼Ó¼òµ¥×ÔÈ»ÊǺÎÀÖ¶ø²»ÎªÄØ¡£
Spring Data JDBC Óë MyBatis ½áºÏ£¬×ÔÈ»ÊÇÄܹ»½áºÏÁ½ÕßÓе㣬»ù±¾¹¦Äܵõ½Á˼ò»¯£¬¸´ÔÓ¹¦ÄÜÒ²ÄÜÐÅÊÖÄéÀ´¡£
Spring Data JDBC Óë MyBatis ÕûºÏÓÐÁ½ÖÖ·½Ê½£º
¹Ù·½µÄÕûºÏ·½·¨ https://docs.spring.io/spring-data/jdbc/docs/1.1.0.RC1/reference/html/#jdbc.mybatis
»ùÓÚ×Ô¶¨Òå Repository ʵÏÖ
Ïà½Ï¶øÑÔ£¬ÎÒ¸üϲ»¶µÚ¶þÖÖ·½·¨£¬ÒòΪ¹Ù·½ÕûºÏ·½·¨Ö»ÊÇÓà MyBatis ʵÏÖÁË»ù±¾¹¦ÄÜ£¬Õâ·´¶øÊÇ MyBatis
Ëù²»Éó¤µÄ£¬¶ø»ùÓÚ×Ô¶¨Òå Repository ʵÏֵķ½Ê½¸üÄÜ·¢»ÓÁ½ÕßµÄÓÅÊÆ¡£ÏÂÃæ¿´Ò»Ï¼òµ¥Ê¾Àý£º
Ê×Ïȶ¨ÒåÀ©Õ¹½Ó¿Ú
interface UserRepositoryExtension
{
void update(User user);
} |
ʵÏÖÉÏÃæµÄ½Ó¿Ú£¬Óà MyBatis ʵÏÖ¾ßÌ幦ÄÜ¡£ÀàÃüÃû±ØÐëΪ½Ó¿ÚÃû
+ Impl¡£
@Component
class UserRepositoryExtensionImpl implements UserRepositoryExtension
{
private final SqlSession sqlSession;
public void update(User user) {
return sqlSession.update("update",
user);
}
} |
ÔÓнӿÚÀ©Õ¹ÉÏÃæµÄ½Ó¿Ú
interface UserDao
extends CrudRepository<User, Long>, UserRepositoryExtension
{
} |
ÕâÑù¾Í¿ÉÒÔÁË£¬ÊDz»ÊǺܼòµ¥¡£
ÁìÓòÇý¶¯Éè¼Æ
ÔÚ Spring Data JDBC ÎĵµÖУ¬ÓÐÒ»½ÚÌáµ½ÁËÁìÓòÇý¶¯Éè¼Æ https://docs.spring.io/spring-data/jdbc/docs/1.1.0.RC1/reference/html/#jdbc.domain-driven-design
¡£ÎĵµÖÐ˵µ½ Spring Data µÄºÜ¶àÉè¼Æ¶¼ÊÇÊÜÁË DDD µÄÆô·¢£º
In the current implementation, entities referenced
from an aggregate root are deleted and recreated by
Spring Data JDBC.
¾ßÌå Spring Data JDBC ÊÇÈçºÎʵÏÖ DDD µÄ£¿ÔÚ½éÉÜ֮ǰ£¬ÏÈÎÊ´ó¼ÒÒ»¸öÎÊÌ⣬´ó¼Ò¾õµÃÊý¾Ý¿âÿ¸ö±í¶¼ÐèÒªÓÐÒ»¸ö
Repository »ò DAO ÀàÓëÖ®¶ÔÓ¦Âð£¿
´ð°¸ÊÇ·ñ¡£°´ÕÕ DDD µÄ˼Ï룬ֻÓÐ Aggregate Root£¨¾ÛºÏ¸ù£©²ÅÊdz־û¯²Ù×÷µÄΨһÈë¿Ú¡£¾Ù¸öÀý×Ó£¬Order£¨¶©µ¥£©ºÍ
OrderItem£¨¶©µ¥ÌõÄ¿£©¶¼ÊǶ©µ¥ÓòÖеÄʵÌå¡£µ«ÊÇ£¬ÒòΪ¶©µ¥ÊǾۺϸù£¬ËùÒÔÖ»Óж©µ¥ÓжÔÓ¦µÄ Repository
À࣬¶ø¶©µ¥ÌõÄ¿ÔòûÓС£
interface OrderRepository
extends CrudRepository<PurchaseOrder, Long>
{
@Query("select count(*) from order_item")
int countItems();
} |
ÈçÉÏÀýËùʾ£¬¶©µ¥ÀࣨÓÐ PurchaseOrder ±íʾ£©¶ÔÓ¦µÄ Repository
°üº¬ÁË¶Ô order_item ±íµÄ²Ù×÷£¬ÒòΪ¶©µ¥ÌõÄ¿²»ÊǾۺϸù£¬Ã»ÓÐ×Ô¼ºµÄ Repository¡£ËùÒÔ£¬¶Ô¶©µ¥ÌõÄ¿µÄ²Ù×÷ÐèÒª¶¨ÒåÔÚ¶©µ¥µÄ
Repository ÖС£¿ÖÅÂÒ²ÊÇÕâ¸ö˼ÏëÉϵIJ»Í¬£¬µ¼Ö Spring Data JDBC ºÜ¿ÉÄܲ»»á¾ß±¸Ïñ
Spring Data JPA ºÍ Mongo ÄÇÑù´¿ÉùÃ÷ʽµÄ³Ö¾Ã»¯¹¦ÄÜÁË¡£
@Autowired OrderRepository
repository;
@Test
public void createUpdateDeleteOrder() {
PurchaseOrder order = new PurchaseOrder();
order.addItem(4, "Captain Future Comet
Lego set");
order.addItem(2, "Cute blue angler fish
plush toy");
PurchaseOrder saved = repository.save(order);
assertThat(repository.count()).isEqualTo(1);
assertThat(repository.countItems()).isEqualTo(2);
repository.delete(saved);
assertThat(repository.count()).isEqualTo(0);
assertThat(repository.countItems()).isEqualTo(0);
} |
¶ø¶ÔÓÚ¶©µ¥µÄ save ºÍ delete ²Ù×÷£¬Ò²»á¶Ô¶©µ¥ÌõÄ¿½øÐвÙ×÷¡£
¶ÔÓÚÆäËü¸ü¶àµÄ¹ØÓÚ Spring Data JDBC ºÍ DDD µÄÄÚÈÝ£¬»¶Ó´ó¼Ò×Ô¼º¿´ÎÄÕ£¬Ò²»¶ÓºÍÎÒÌÖÂÛ¡£
Èý¡¢×î¼Ñʵ¼ù
½ÓÏÂÀ´ÌÖÂÛÒ»ÏÂÎÒÔÚʹÓà Spring Data JDBC ¹ý³ÌÖÐ×ܽáµÄһЩ×î¼Ñʵ¼ù¡£
DAO or Repository
ÎÒ¸üÇãÏòÓÚ½²Ê¹ÓÃÁË Spring Data ¼¼ÊõµÄ½Ó¿ÚÃüÃûΪ DAO£¬¶ø²»ÊÇ Repository¡£°´ÕÕ
DDD µÄ˼Ï룬Repository Êǰüº¬ÁËÁìÓò֪ʶµÄ£¬ÐèÒª±£Ö¤¾ÛºÏµÄÊý¾ÝÒ»ÖÂÐÔ¡£¶øÒªÔÚ¸´ÔÓÒµÎñÖÐÂú×ãÕâÒ»µã£¬½ö¿¿À©Õ¹Ò»¸ö½Ó¿ÚÊDz»¿ÉÄÜ×öµ½µÄ¡£Òò´Ë£¬ÔÚ
Spring Data ½Ó¿ÚÖ®ÉÏ£¬»¹ÐèÒª×Ô¼ºÊµÏÖÕæÕýµÄ Repository¡£Òò´Ë£¬Repository
Õâ¸öÃû×ÖÒª±£ÁôÏÂÀ´¡£
ÈçºÎʹÓà save ·½·¨
CrudRepository ÌṩÁË save ·½·¨£¬ÄÜͬʱʵÏÖ insert ºÍ update Á½ÖÖ¹¦ÄÜ¡£ÎҵĽ¨ÒéÖ»°Ñ
save µ±×÷ÊÇ´´½¨Êý¾ÝµÄ¹¤¾ß£¬¾¡Á¿²»ÒªÔÚ¸üÐÂʱʹÓÃËü¡£ÔÒòÔÚÓÚÔÚ¸´ÔÓµÄÏîÄ¿ÖУ¬Ê¹Óà save ½øÐÐÊý¾Ý¸üУ¬¼«ÈÝÒ×Ôì³ÉÊý¾Ý±»´íÎ󸲸ǡ£ÒòΪ
Spring Data JDBC ͬ JPA ¼¼ÊõÒ»Ñù£¬¶¼»á¸ù¾ÝʵÌåÀàÉú³É¶ÔÈ«²¿×ֶθüÐ嵀 update
Óï¾ä£¬²¢ÇÒ Spring Data JDBC ĿǰûÓÐÄÚ½¨µÄÀÖ¹ÛËø»úÖÆ¡£
ºÎʱʹÓà MyBatis
Ç°ÃæÌáµ½ Spring Data JDBC ¿ÉÒÔºÍ MyBatis ½áºÏʹÓá£ÄÇʲôʱºòÒ»¸ö¹¦ÄÜÓ¦¸ÃÓÃ
Spring Data JDBC ʵÏÖ£¬Ê²Ã´Ê±ºòÓ¦¸ÃÓà MyBatis ʵÏÖ¡£ÎÒ¸öÈËÒâ¼ûÊǵ±³Ö¾Ã»¯·½·¨µÄ»ù±¾ÀàÐÍÈë²Î´óÓÚ3¸öʱ£¬Ê¹ÓÃ
MyBatis ʵÏÖ£¨²¢½«²ÎÊý³éȡΪ²ÎÊý¶ÔÏ󣩡£ ÒòΪ£¬µ±Èë²Î´óÓÚ3ʱ£¬Òâζ×ŲÎÊýÁбíºÍ SQL Óï¾ä¶¼»á±È½Ï¸´ÔÓ¡£Ê¹ÓÃ
Spring Data JDBC£¬Ò»ÊÇĿǰ²»Ö§³Ö²ÎÊý¶ÔÏ󣬶øÊǹý³¤µÄ SQL ÔÚ×¢½âÖж¨Òå²»Ò×ÔĶÁ¡£
ÈçºÎʹÓÃö¾Ù×Ö¶Î
ÎÒ·¢Ïִ󲿷ÖÏîÄ¿µÄÊý¾Ý¿âÉè¼ÆÏ²»¶Ê¹Óà Int ÀàÐͱíʾעÈë״̬¡¢ÀàÐÍÕâÑùµÄö¾Ù×ֶΡ£ËäÈ»ÕâÑù×ö¶ÔÊý¾Ý¿âÐÔÄÜÓкô¦£¬µ«ÊǶԿª·¢ÈËԱд´úÂëµÄÐÔÄÜ¿ÉÊÇ´óÓлµ´¦¡£ÒòΪѡÏîÒ»¶à£¬Ã»Óм¸¸öÈËÄܼǵÃס
1¡¢2¡¢3¡¢4 ¸÷×Ô´ú±íʲôҵÎñº¬Òå¡£¶øÇÒ¸üÓÐÉõÕߣ¬²»Í¬ÏîÄ¿ÖУ¬ÉõÖÁͬһ¸öÏîÄ¿£¬ÒâÒåÀàËÆµÄ×ֶεÄȡֵ¸÷Óв»Í¬¡£Õâ¼òÖ±ÊÇÏîĿά»¤µÄºÚ¶´£¬Bug
µÄԴȪ¡£
ËùÒÔ£¬ÔÚ´úÂë²ãÃæ£¬Ò»¶¨ÒªÊ¹ÓÃö¾ÙÀàÐͱíʾÊý¾Ý¿âÖÐµÄ Int Ëù´ú±íµÄö¾ÙÀàÐÍ¡£ËùÒÔ£¬ÔÚ±¾ÎĵĵÚÒ»¸ö´úÂëʾÀýÖУ¬Óû§×´Ì¬ÊÇÓÃÒ»¸öö¾ÙÀà±íʾµÄ
...
UserStatus status;
... |
ÔÚ Spring Data JDBC ºÍ MyBatis ÖУ¬¶¼ÓÐÏàÓ¦µÄ»úÖÆ½â¾öö¾ÙºÍ Int ת»»µÄÎÊÌ⣬µ«²¢²»ÊÇ¿ªÏä¼´Ó㬶øÊÇÐèҪдһЩ´úÂë¡£ÒòΪƪ·ùÎÊÌ⣬±¾ÎľͲ»×ö¾ßÌå½éÉÜ£¬ËãÊÇÍÚ¸öС¿Ó£¬Áôµ½ÏÂһƪÎÄÕ½²½â¡£
ËÄ¡¢×ܽá
¸öÈ˹۵㣬Spring ¾ÍÏñÊÇ Java ¿ªÔ´½çµÄ±©Ñ©¡£¡°Spring ³öÆ·£¬±ØÊô¾«Æ·¡£¡± Õâô˵Æäʵ²»ËãºÜ¹ý·Ö¡£
¸öÈ˾õµÃ£¬Ò»·½Ã棬Spring ³öÆ·µÄÏîÄ¿£¬¶¼ÊÇÒ×ÓÃÇÒ¹¦ÄÜÇ¿´óµÄ¡£¸üÖØÒªµÄÊÇ£¬Spring ÏîÄ¿µÄÓ°Ïì¸ü¶àÌåÏÖµÄÉè¼ÆºÍ˼Ïë²ãÃæ£¬×ÜÄÜÒýÁìijÖÖ·ç³±£¬Õâ¿ÖÅÂÊÇ
Spring ÏîÄ¿Õâô³¤Ê±¼äÒÔÀ´£¬Ò»Ö±ÉîÊÜ»¶ÓµÄÔÒò¡£
Òò´Ë£¬¶ÔÓë Spring Data JDBC Õâ¸öÏîÄ¿£¬´ó¼ÒÓ¦¸ü¶à¹Ø×¢¡£ |