IntelliJ IDEA Spring Boot(3) 数据库JDBC的使用
来源:互联网 发布:送男生什么礼物知乎 编辑:程序博客网 时间:2024/05/29 15:08
学习web技术,任何新的东西我总是想着要去与数据库打交道。这篇我来学习如何用springboot 集成数据库的使用。这里简单的集成mysql和jdbcTemplate。所有的框架集成都是由少到多的嘛。
首先我们在pom文件中加上依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <exclusion><!--排除默认的数据源 --> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </exclusion> </exclusions></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version></dependency><dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version></dependency>接下来,我们配置mysql的东西,最起码用户名密码什么的吧。在application.properties文件中配置如下代码
#mysqlspring.datasource.driver-class-name= com.mysql.jdbc.Driverspring.datasource.url=jdbc\:mysql\://localhost\:3306/dadmin?useUnicode\=true&characterEncoding\=UTF-8spring.datasource.username=rootspring.datasource.password=123456#druidspring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.filters=statspring.datasource.maxActive= 20spring.datasource.initialSize= 1spring.datasource.maxWait= 60000spring.datasource.minIdle =1spring.datasource.timeBetweenEvictionRunsMillis= 60000spring.datasource.minEvictableIdleTimeMillis=300000spring.datasource.validationQuery= select 'x'spring.datasource.testWhileIdle= truespring.datasource.testOnBorrow=falsespring.datasource.testOnReturn= falsespring.datasource.poolPreparedStatements=truespring.datasource.maxOpenPreparedStatements= 20
开启事务驱动
@SpringBootApplication@EnableTransactionManagementpublic class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); }}
接下来,跑起来。一切正常。
接下来。创建一个实体类和对应的表,进行简单的增删改查。
public class SystemUser implements Serializable { private String uuid; // 表主键 private String username; // 登录用户名 private String password; // 登录密码 private String isRoot; // 最高权限管理员; "1":root "0": notRoot @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date registerDate; private Integer status; // 账号状态: 0:正常;1:禁用
public interface SystemUserDao { SystemUser findUserByUsername(String username); List<SystemUser> findAllUser(); String saveUser(SystemUser user); void deleteUserByUUID(String uuid); void updateUser(SystemUser user);}
public interface SystemUserService { SystemUser findUserByUsername(String username); List<SystemUser> findAllUser(); String saveUser(SystemUser user); void deleteUserByUUID(String uuid); void updateUser(SystemUser user);}
@Repository("systemUserDao")public class SystemUserDaoImpl implements SystemUserDao{ @Autowired JdbcTemplate jdbcTemplate; static class UserRowMapper implements RowMapper<SystemUser>{ @Override public SystemUser mapRow(ResultSet rs, int rowNum) throws SQLException { SystemUser systemUser = new SystemUser(); systemUser.setUuid(rs.getString("uuid")); systemUser.setUsername(rs.getString("username")); systemUser.setPassword(rs.getString("password")); systemUser.setIsRoot(rs.getString("isRoot")); systemUser.setRegisterDate(new java.util.Date(rs.getDate("registerDate").getTime())); systemUser.setStatus(rs.getInt("status")); // if the value is SQL NULL, the value returned is 0 // 如果希望得到null,可以getObject()判断是否为null return systemUser; } } @Override public SystemUser findUserByUsername(String username) { List<SystemUser> list = jdbcTemplate.query( "select * from system_user where username=?", new Object[]{username}, new int[]{Types.VARCHAR}, new UserRowMapper() ); if(null!=list&&!list.isEmpty()){ return list.get(0); } return null; } @Override public List<SystemUser> findAllUser() { return jdbcTemplate.query("select * from system_user",new UserRowMapper()); } @Override public String saveUser(SystemUser user) { final String sql = "insert into system_user(uuid,username,password,isRoot,registerDate,status) values(?,?,?,?,?,?)"; user.setUuid(UUID.randomUUID().toString().replace("-","")); jdbcTemplate.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { PreparedStatement ps = connection.prepareStatement(sql); ps.setString(1, user.getUuid()); ps.setString(2, user.getUsername()); ps.setString(3,user.getPassword()); ps.setString(4,user.getIsRoot()); ps.setDate(5,new java.sql.Date(user.getRegisterDate().getTime())); ps.setInt(6,user.getStatus()); return ps; } }); return user.getUuid(); } @Override public void deleteUserByUUID(String uuid) { jdbcTemplate.update("delete from system_user where uuid=?", new Object[]{uuid}, new int[]{Types.VARCHAR}); } @Override public void updateUser(SystemUser user) { jdbcTemplate.update( "update system_user set password=?,status=? where uuid=?", new Object[]{user.getPassword(), user.getStatus(), user.getUuid()}); }}
@Service("systemUserService")public class SystemUserServiceImpl implements SystemUserService{ @Autowired SystemUserDao systemUserDao; @Transactional(readOnly = true) @Override public SystemUser findUserByUsername(String username) { return systemUserDao.findUserByUsername(username); } @Transactional(readOnly = true) @Override public List<SystemUser> findAllUser() { return systemUserDao.findAllUser(); } @Transactional @Override public String saveUser(SystemUser user) { return systemUserDao.saveUser(user); } @Transactional @Override public void deleteUserByUUID(String uuid) { systemUserDao.deleteUserByUUID(uuid); } @Transactional @Override public void updateUser(SystemUser user) { systemUserDao.updateUser(user); }}
解析来,我们来做单元测试,暂时不做业务逻辑处理。
日志级别调整成debug
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTestpublic class TestJDBC { Logger logger= LoggerFactory.getLogger(getClass()); @Autowired SystemUserService systemUserService; @Test public void saveUser(){ SystemUser user = new SystemUser(); user.setStatus(0); user.setRegisterDate(new Date()); user.setPassword("123456"); user.setIsRoot("0"); user.setUsername("testZhang1"); String uuid= systemUserService.saveUser(user); logger.info("增加成功:uuid:{}",uuid); } @Test public void findUser1(){ SystemUser user = systemUserService.findUserByUsername("testZhang"); logger.info("user:{}",user); } @Test public void findUser2(){ List<SystemUser> list = systemUserService.findAllUser(); logger.info("userlist:{}",list); } @Test public void updateUser(){ SystemUser user = systemUserService.findUserByUsername("testZhang"); user.setPassword("1234567"); user.setStatus(1); systemUserService.updateUser(user); } @Test public void deleteUser(){ systemUserService.deleteUserByUUID("cbb0759e58114171bb33437c7db2a276"); }我们举其中一个例子,来看看log 日志
看到log日志中关键信息,表示 我们这次写的完全正确。
由此,我来写一个简单的登录案例
<div class="form-bottom"> <form role="form" action="index.html" th:action="@{/admin/login.do}" method="post" class="login-form"> <div class="form-group"> <label class="sr-only" for="form-username">Username</label> <input type="text" name="username" placeholder="请输入用户名" class="form-username form-control" id="form-username" /> </div> <div class="form-group"> <label class="sr-only" for="form-password">Password</label> <input type="password" name="password" placeholder="请输入密码" class="form-password form-control" id="form-password" /> </div> <button type="submit" class="btn">登 陆</button> </form></div>看到 action和 th:action了吗? 静态的action,(写静态action,只是为了在使用本地html展示的时候,便于看到效果)th:action就是web应用发挥作用的url。
日志级别还是调回 info; debug级别运行application太慢了。Controller中补充登录逻辑代码。随后我们修改一下表单
@AutowiredSystemUserService systemUserService;@RequestMapping("/admin/login.do")public String adminLoginDo(String username, String password, Map<String,Object> map){ SystemUser systemUser= systemUserService.findUserByUsername(username); if(null==systemUser){ map.put("loginResult","用户名不存在"); return "admin/login"; }else if(!password.equals(systemUser.getPassword())){ map.put("loginResult","密码错误"); return "admin/login"; }else{ // 登录成功! return "admin/index"; }}
<form role="form" action="index.html" th:action="@{/admin/login.do}" method="post" class="login-form"> <div class="form-group"> <span th:text="${loginResult}" style="color: red"></span> </div> <div class="form-group"> <label class="sr-only" for="form-username">Username</label> <input type="text" name="username" placeholder="请输入用户名" class="form-username form-control" id="form-username" /> </div> <div class="form-group"> <label class="sr-only" for="form-password">Password</label> <input type="password" name="password" placeholder="请输入密码" class="form-password form-control" id="form-password" /> </div> <button type="submit" class="btn">登 陆</button></form>这样,一个简单的登录逻辑功能,就使用 spring boot 完成了。本篇博客到此结束。
阅读全文
1 0
- IntelliJ IDEA Spring Boot(3) 数据库JDBC的使用
- IntelliJ IDEA + Spring Boot + Mybatis的整合
- Intellij IDEA 使用Spring-boot-devTools无效解决办法
- Intellij IDEA 使用Spring-boot-devTools无效解决办法
- 使用 intellij idea IDE 搭建 Spring boot 项目
- Intellij IDEA 使用Spring-boot-devTools无效解决办法
- Intellij IDEA 使用Spring-boot-devTools无效解决办法
- Intellij IDEA 使用Spring-boot-devTools无效解决办法
- 1.1 使用IntelliJ IDEA搭建Spring-Boot的"Hello World"项目
- IntelliJ IDEA Spring Boot(8)使用JSP,打包jar文件运行带有jsp的项目
- IntelliJ IDEA搭建Spring Boot的小Demo
- IntelliJ IDEA 创建spring boot 的Hello World 项目
- Intellij Idea spring boot 报错记录
- Intellij idea + Spring boot + Thymeleaf + MySQL
- Spring Boot + Intellij IDEA 热部署
- Intellij IDEA 学习Spring Boot (1)
- 使用IntelliJ IDEA中的Spring Initializr来快速构建Spring Boot/Cloud工程
- Spring Boot JDBC 连接数据库
- svn设置提交忽略某些文件或文件夹
- Firewall常用
- 面试手写代码的题目
- 获取字符串中数字,并计算指定时间的后几个月是几月几号
- 数据库事务的四大特性以及事务的隔离级别
- IntelliJ IDEA Spring Boot(3) 数据库JDBC的使用
- rpm包制作实例
- 移除元素单击事件
- codeforces 443 B.Table Tennis
- Android Canvas的save(),saveLayer()和restore()浅谈
- java 线程 模型 状态
- 李刚疯狂java讲义光盘内容(ppt,source code,project,pdf)
- 习题4.1(2)
- AT91Sam9260的SPI