1.pom添加依赖
org.springframework.bootspring-boot-starter-data-jpamysqlmysql-connector-java5.1.42
2.添加数据源配置(DataSource啥的,一系列对象spring boot 都会给你注入的,配置配置即可!)
spring.datasource.url=jdbc:mysql:spring.datasource.username==123456--name=-wait=10000-active=300-on-borrow=-size=20
#=====================jpa config================================ #实体类维护数据库表结构的具体行为:update/create/create-drop/validate/none spring.jpa.hibernate.ddl-auto=none #打印sql语句 spring.jpa.show-sql=true #格式化输出的json字符串 spring.jackson.serialization.indent_output=true
3.新建实体
@Entity
@Table(name="user")public class User {
@Id
@Column(name="id")
@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;
@Column(name="number")private String number;
@Column(name="name")private String name;public Integer getId() {return id;
}public void setId(Integer id) {this.id = id;
}public String getNumber() {return number;
}public void setNumber(String number) {this.number = number;
}public String getName() {return name;
}public void setName(String name) {this.name = name;
}
}
4.dao层
public interface UserDao{
User getById(int id);
User getByNumber(String number);int addUser(User user);void deleteUserById(int id);
User updateUser(User user);
}
@Repositorypublic class UserDaoImpl implements UserDao {
@PersistenceContextprivate EntityManager entityManager;
@Overridepublic User getById(int id) {//find by primary keyreturn this.entityManager.find(User.class,id);
}
@Overridepublic User getByNumber(String number) {
Query query = this.entityManager.createQuery("from User u where u.number=:number",User.class);
query.setParameter("number",number);
User user = (User)query.getSingleResult();return user;
}
@Overridepublic int addUser(User user) {this.entityManager.persist(user);//print the id System.out.println(user.getId());return user.getId();
}
@Overridepublic void deleteUserById(int id) {
User user = this.entityManager.find(User.class,id); //关联到记录,方可删除this.entityManager.remove(user);
}
@Overridepublic User updateUser(User user) {
User userNew = this.entityManager.merge(user);return userNew;
}
}
5.service层
public interface UserService {
User getById(int id);
User getByNumber(String number);int addUser(User user,boolean throwEx);void deleteUserById(int id);
User updateUser(User user);
}
@Service
@Transactionalpublic class UserServiceImpl implements UserService {
@Autowiredprivate UserDao userDao;
@Override
@Transactional(readOnly = true)public User getById(int id) {return userDao.getById(id);
}
@Override
@Transactional(readOnly = true)public User getByNumber(String number) {return userDao.getByNumber(number);
}
@Overridepublic int addUser(User user,boolean throwEx) {int id= this.userDao.addUser(user);if(throwEx){throw new RuntimeException("throw a ex");
}return id;
}
@Overridepublic void deleteUserById(int id) {this.userDao.deleteUserById(id);
}
@Overridepublic User updateUser(User user) {return this.userDao.updateUser(user);
}
}
6.controller层
@Controller("user1")
@RequestMapping("/jpa/user")public class UserController {/** * 日志(slf4j->logback) */private static final Logger logger = LoggerFactory.getLogger(UserController.class);
@Autowiredprivate UserService userService;/** * 返回text格式数据
* @param id 主键id
* @return 用户json字符串 */@RequestMapping("/get/id/{id}")
@ResponseBodypublic String getUserById(@PathVariable("id")String id){
logger.info("request /user/get/id/{id}, parameter is "+id);
User user = userService.getById(Integer.parseInt(id));return JSONObject.toJSONString(user);
}/** * 返回json格式数据
* @param number 编号
* @return 用户 */@RequestMapping("/get/number/{number}")
@ResponseBodypublic User getUserByNumber(@PathVariable("number")String number){
User user = userService.getByNumber(number);return user;
}
@RequestMapping("/add/{number}/{name}")
@ResponseBodypublic String addUser(@PathVariable("number")String number,@PathVariable("name")String name,boolean throwEx){
User user = new User();
user.setNumber(number);
user.setName(name);int id = -1;try{
id = userService.addUser(user,throwEx);
}catch (RuntimeException ex){
System.out.println(ex.getMessage());
}return String.valueOf(id);
}
@RequestMapping("/delete/{id}")
@ResponseBodypublic void getUserById(@PathVariable("id")int id){this.userService.deleteUserById(id);
}
@RequestMapping("/update/{id}/{number}/{name}")
@ResponseBodypublic User addUser(@PathVariable("id")int id, @PathVariable("number")String number, @PathVariable("name")String name){
User user = new User();
user.setId(id);
user.setNumber(number);
user.setName(name);return userService.updateUser(user);
}
}
7. spring data jpa新使用方式,更高级
1.dao @Repositorypublic interface UserRepository extends JpaRepository{/** * spring data jpa 会自动注入实现(根据方法命名规范) * @return */User findByNumber(String number); @Modifying @Query("delete from User u where u.id = :id")void deleteUser(@Param("id")int id); }2.servicepublic interface UserService { User findById(int id); User findByNumber(String number); List findAllUserByPage(int page,int size); User updateUser(User user,boolean throwEx);void deleteUser(int id); } @Service @Transactionalpublic class UserServiceImpl implements UserService { @Autowiredprivate UserRepository userRepository; @Overridepublic User findById(int id) {return this.userRepository.findOne(id); } @Overridepublic User findByNumber(String number) {return this.userRepository.findByNumber(number); } @Overridepublic List findAllUserByPage(int page,int size) { Pageable pageable = new PageRequest(page, size); Page users = this.userRepository.findAll(pageable);return users.getContent(); } @Overridepublic User updateUser(User user,boolean throwEx) { User userNew = this.userRepository.save(user);if(throwEx){throw new RuntimeException("throw a ex"); }return userNew; } @Overridepublic void deleteUser(int id) {this.userRepository.deleteUser(id); } }3.controller @Controller("user2") @RequestMapping("/datajpa/user")public class UserController {/** * 日志(slf4j->logback) */private static final Logger logger = LoggerFactory.getLogger(UserController.class); @Autowiredprivate UserService userService;/** * 返回text格式数据 * @param id 主键id * @return 用户json字符串 */@RequestMapping("/get/id/{id}") @ResponseBodypublic String getUserById(@PathVariable("id")String id){ logger.info("request /user/get/id/{id}, parameter is "+id); User user = userService.findById(Integer.parseInt(id));return JSONObject.toJSONString(user); }/** * 返回json格式数据 * @param number 编号 * @return 用户 */@RequestMapping("/get/number/{number}") @ResponseBodypublic User getUserByNumber(@PathVariable("number")String number){ User user = userService.findByNumber(number);return user; } @RequestMapping("/get/all/{page}/{size}") @ResponseBodypublic List getAllUserByPage(@PathVariable("page")int page,@PathVariable("size")int size){return this.userService.findAllUserByPage(page,size); } @RequestMapping("/update/{id}/{number}/{name}") @ResponseBodypublic User addUser(@PathVariable("id")int id, @PathVariable("number")String number, @PathVariable("name")String name,boolean throwEx){ User user = new User(); user.setId(id); user.setNumber(number); user.setName(name); User userNew = null;try{ userService.updateUser(user,throwEx); }catch (RuntimeException ex){ System.out.println(ex.getMessage()); }return userNew; } @RequestMapping("/delete/{id}") @ResponseBodypublic void getUserById(@PathVariable("id")int id){this.userService.deleteUser(id); } }
8.注入jdbcTemplate和transactionTemplate,使用传统方式操作数据库,更加灵活,方法如下
@Autowiredprivate JdbcTemplate jdbcTemplate;
@Autowiredprivate TransactionTemplate transactionTemplate;/** * 手动控制事物测试
* @param throwEx */@Overridepublic void testTransactionManually(boolean throwEx) {try {
transactionTemplate.execute(new TransactionCallback() {/** * 事物代码
*
* @param transactionStatus 事物状态
* @return 是否成功 */@Overridepublic Boolean doInTransaction(TransactionStatus transactionStatus) {
User user = new User();
user.setId(1);int a = new Random().nextInt(10); //0-9user.setNumber("10000u" + a);
jdbcTemplate.update("UPDATE USER SET NUMBER=? WHERE ID=?", new Object[]{user.getNumber(), user.getId()}, new int[]{Types.VARCHAR, Types.INTEGER});if (throwEx) {throw new RuntimeException("try throw exception"); //看看会不会回滚 }return true;
}
});
}catch (RuntimeException ex){
System.out.println(ex.getMessage());
}
}/** * 手动执行jdbc测试 */@Overridepublic void testJdbcTemplate() {
User user = new User();int a = new Random().nextInt(10); //0-9user.setNumber("10000i"+ a );
user.setName("name"+a);this.jdbcTemplate.update("INSERT into USER(NUMBER,NAME )VALUES (?,?)",user.getNumber(),user.getName());
}
至此,我已经讲了三种方式(jpa两种+jdbcTemplate)如何操作数据库了,你爱怎么用就怎么用,上述代码均是实践证明可行的!










