Spring-boot-jdbc
-
SQL
DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `user_id` int(11) primary key NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `nickname` varchar(255) NOT NULL, `email` varchar(100) NOT NULL, `create_time` datetime NOT NULL, `update_time` datetime NOT NULL, `is_deleted` int(1) NOT NULL ) ENGINE = Innodb DEFAULT CHARSET = utf8;
-
POM.xml
springboot com.shawn 1.0-SNAPSHOT 4.0.0 spring-boot-jdbc-demo org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java org.projectlombok lombok -
实体类
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class User { private int userId; private String username; private String password; private String nickname; private String email; private Date createTime; private Date updateTime; private boolean isDeleted; }
-
Dao
@Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private SimpleJdbcInsert jdbcInsert; @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; private static final String INSERT_SQL = "insert into t_user (username, password, nickname, email, create_time, update_time, is_deleted) values (?,?,?,?,?,?,?)"; private static final String SELECT_SQL = "select * from t_user where is_deleted = false"; private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public void insertWithJbdcTemplate(User user) { jdbcTemplate.update( INSERT_SQL, user.getUsername(), user.getPassword(), user.getNickname(), user.getEmail(), user.getCreateTime(), user.getUpdateTime(), user.isDeleted()); } public void batchInsertWithBatchPreparedStatementSetter(List
users) { jdbcTemplate.batchUpdate( INSERT_SQL, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { User user = users.get(i); ps.setString(1, user.getUsername()); ps.setString(2, user.getPassword()); ps.setString(3, user.getNickname()); ps.setString(4, user.getEmail()); ps.setDate(5, new java.sql.Date(user.getCreateTime().getTime())); ps.setDate(6, new java.sql.Date(user.getUpdateTime().getTime())); ps.setBoolean(7, user.isDeleted()); } @Override public int getBatchSize() { return users.size(); } }); } public void batchInsertWithList(List users) { List -
Service
public interface UserService { void insert(User user); void batchInsertWithJbdcTemplate(List
users); void batchInsertWithNamedParams(List users); void batchInsertWithBatchPreparedStatementSetter(List users); int insertReturnKey(User user); List findAll(); User findById(int id); List findByCondition(User user); void modify(User user); void remove(int id); } @Service @Slf4j public class UserServiceImpl implements UserService { @Autowired private UserDao dao; @Override public void insert(User user) { dao.insertWithJbdcTemplate(user); } @Override public void batchInsertWithJbdcTemplate(List
users) { dao.batchInsertWithList(users); } @Override public void batchInsertWithNamedParams(List users) { dao.batchInsertWithNamedParams(users); } @Override public void batchInsertWithBatchPreparedStatementSetter(List users) { dao.batchInsertWithBatchPreparedStatementSetter(users); } @Override public int insertReturnKey(User user) { return dao.insertReturnKey(user); } @Override public List findAll() { return dao.selectAll(); } @Override public User findById(int id) { return dao.selectById(id); } @Override public List findByCondition(User user) { return dao.selectByExample(user); } @Override public void modify(User user) { dao.update(user); } @Override public void remove(int id) { dao.delete(id); } } -
启动类
@SpringBootApplication public class JdbcTemplateApplication { public static void main(String[] args) { SpringApplication.run(JdbcTemplateApplication.class, args); } @Bean @Autowired public SimpleJdbcInsert simpleJdbcInsert(JdbcTemplate jdbcTemplate) { return new SimpleJdbcInsert(jdbcTemplate).usingGeneratedKeyColumns("id"); } @Bean @Autowired public NamedParameterJdbcTemplate namedParameterJdbcTemplate(DataSource dataSource) { return new NamedParameterJdbcTemplate(dataSource); } }
-
配置文件
spring.datasource.url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 spring.datasource.username: root spring.datasource.password: 11111 spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
-
Test Case
@Component @Slf4j public class JdbcTemplateApplicationRunner implements ApplicationRunner { @Autowired private UserService service; @Override public void run(ApplicationArguments args) throws Exception { log.info("test insert"); testInsert(); log.info("test batch insert"); testBatchInsert(); log.info("test insert return key"); int i = testInsertReturnKey(); log.info("test find all"); testFindAll(); log.info("test find by id"); testFindById(i); log.info("test find by condition"); testFindByCondition(); log.info("before update"); testFindById(i); Thread.sleep(1000); log.info("action updating"); testUpdate(i); log.info("after update"); testFindById(i); log.info("test delete"); testDelete(i); log.info("after delete"); testFindById(i); } private void testInsert() { Date now = new Date(); User user = User.builder() .username("shawn") .password("shawn") .nickname("shawn") .email("[email protected]") .createTime(now) .updateTime(now) .isDeleted(false) .build(); service.insert(user); } private void testBatchInsert() throws InterruptedException { Date now = new Date(); User jack = User.builder() .username("jack") .password("jack") .nickname("jack") .email("[email protected]") .createTime(now) .updateTime(now) .isDeleted(false) .build(); service.batchInsertWithJbdcTemplate(Arrays.asList(jack)); Thread.sleep(1000); User bill = User.builder() .username("bill") .password("bill") .nickname("bill") .email("[email protected]") .createTime(new Date()) .updateTime(new Date()) .isDeleted(false) .build(); Thread.sleep(1000); User john = User.builder() .username("john") .password("john") .nickname("john") .email("[email protected]") .createTime(new Date()) .updateTime(new Date()) .isDeleted(false) .build(); service.batchInsertWithBatchPreparedStatementSetter(Arrays.asList(bill, john)); Thread.sleep(1000); User bob = User.builder() .username("bob") .password("bob") .nickname("bob") .email("[email protected]") .createTime(new Date()) .updateTime(new Date()) .build(); Thread.sleep(1000); User jackson = User.builder() .username("jackson") .password("jackson") .nickname("jackson") .email("[email protected]") .createTime(new Date()) .updateTime(new Date()) .build(); service.batchInsertWithNamedParams(Arrays.asList(bob, jackson)); } private int testInsertReturnKey() { User johnson = User.builder() .username("johnson") .password("johnson") .nickname("johnson") .email("[email protected]") .createTime(new Date()) .updateTime(new Date()) .isDeleted(false) .build(); int i = service.insertReturnKey(johnson); log.info("id {}", i); return i; } private void testFindAll() { service.findAll().forEach(user -> log.info(user.toString())); } private User testFindById(int id) { User user = service.findById(id); log.info(user == null ? null : user.toString()); return user; } private void testFindByCondition() { service .findByCondition(User.builder().username("john").password("john").nickname("john").build()) .forEach(user -> log.info(user.toString())); } private void testUpdate(int id) { User user = testFindById(id); user.setUpdateTime(new Date()); user.setPassword("newPass"); service.modify(user); } private void testDelete(int id) { service.remove(id); } }
优化:
后期可以使用注解的形式,对entity进行处理。比如指定表名,驼峰命名匹配,主键,校验等。