简介: 使用 mybatis 连接 mysql 数据库, 一套简单的增删改查流程, 前台用 bootstrap, bootstrap-table 框架, 最后用 druid 监控数据库连接情况
项目源码: -> DruidMybatisMysql
私聊QQ: 1486866853
1.demo的完整结构
2. pom.xml 依赖 和 application.yml 配置
1) pom.xml 主要 依赖 mysql-connector-java , mybatis-spring-boot-starter ,druid-spring-boot-starter
4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.3.RELEASE com.demo DruidMybatisMysql 0.0.1-SNAPSHOT DruidMybatisMysql 使用druid管理数据库,mybatis连接mysql数据库 1.8 org.mybatis.spring.boot mybatis-spring-boot-starter 2.0.0 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf mysql mysql-connector-java runtime org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2 com.alibaba druid-spring-boot-starter 1.1.14 org.springframework.boot spring-boot-maven-plugin
2) application配置
# springBoot内置容器的配置server: # 端口号 port: 8086 servlet: # 项目前缀 context-path: /dataSourcespring: # 数据源配置 datasource: # mysql数据库配置 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC username: root password: ok # druid配置 druid: # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: config,wall,stat # 初始化数量 initialSize: 5 # 最小连接池数量 minIdle: 2 # 最大连接池数量 maxActive: 20 # 连接超时时间 maxWait: 60000 # 打开psCache, 对支持游标的数据库性能提升巨大 poolPreparedStatements: true # 指定每个连接PsCache的大小 maxPoolPreparedStatementPerConnectionSize: 20 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 6000 # 指定一个空闲连接最少空闲多久后可被清除,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 验证数据库连接的查询语句 validationQuery: select 'x' # 当连接空闲时,是否执行连接测试 testWhileIdle: true # 当从连接池借用连接时,是否测试该连接 testOnBorrow: false # 在连接归还到连接池时是否测试该连接 testOnReturn: false # 打开mergeSql,慢sql记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # thymeleaf 模板引擎配置 thymeleaf: cache: false # thymeleaf模板对html5没有结束符的标签解决 mode: LEGACYHTML5 # thymeleaf修饰的动态页面 自定义根目录(默认就是templates) prefix: classpath:/templates/ # mybatis配置mybatis: # 映射xml的文件位置 mapper-locations: classpath:mybatis/*.xml # 实体类所在包,简化xml中resultMap中实体类的全类名写法 type-aliases-package: demo.domain
3.代码 : 建表sql , 后台代码 , mapper.xml 和 前台html
create table `test`( `test_id` varchar(36) not null comment '唯一id' primary key, `test_password` varchar(32) not null comment '密码', `test_name` varchar(32) not null comment '名称') comment '测试'
package demo.domain;/** * @author GrassPrince * @Da2019年4月3日 2019年4月3日 - 下午8:09:33 * @Description Test */public class Test { /** 唯一id */ private String testId; /** 密码 */ private String testPassword; /** 名称 */ private String testName; public Test(String testId, String testPassword, String testName) { this.testId = testId; this.testPassword = testPassword; this.testName = testName; } public Test() { } public String getTestId() { return testId; } public void setTestId(String testId) { this.testId = testId; } public String getTestPassword() { return testPassword; } public void setTestPassword(String testPassword) { this.testPassword = testPassword; } public String getTestName() { return testName; } public void setTestName(String testName) { this.testName = testName; } @Override public String toString() { return "Test [testId=" + testId + ", testPassword=" + testPassword + ", testName=" + testName + "]"; } }
package demo.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.DeleteMapping;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.PutMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.servlet.ModelAndView;import demo.domain.Test;import demo.service.TestService;/** * @author GrassPrince * @Da2019年4月3日 2019年4月3日 - 下午7:42:54 * @Description 测试 controller : 增删改查 */@Controller@RequestMapping("/test")public class TestController { @Autowired private TestService testService; // 跳转到测试页面 @GetMapping("/testHtml") public ModelAndView testHtml() { return new ModelAndView("test"); } // 根据testId查询test @PostMapping("/queryById") @ResponseBody public ListqueryById(@RequestParam ("testId") String testId) { return testService.queryById(testId); } // 根据testId删除test @DeleteMapping("/deleteById") @ResponseBody public String deleteById(@RequestParam("testId") String testId) { Integer deleteNum = testService.deleteById(testId); if(deleteNum == 0) { return "删除失败"; } return "删除成功"; } //批量删除 @DeleteMapping("/deleteIds") @ResponseBody public String deleteIds(@RequestParam("testIds") String testIds) { Integer deleteNum = testService.deleteIds(testIds); if(deleteNum == 0) { return "删除失败"; } return "删除成功"; } // 修改test @PutMapping("/updateTest") @ResponseBody public String updateTest(Test test) { Integer updateNum = testService.updateTest(test); if(updateNum == 0) { return "更新失败"; } return "更新成功"; } // 新建一个test @PostMapping("/add") @ResponseBody public String add(Test test) { Integer addNum = testService.add(test); if(addNum == 0) { return "新增失败"; } return "新增成功"; }}
package demo.service;import java.util.List;import demo.domain.Test;/** * @author GrassPrince * @Da2019年4月3日 2019年4月3日 - 下午7:50:50 * @Description 测试的service接口 */public interface TestService { /** 根据testId查询test */ ListqueryById(String testId); /** 根据testId删除test */ Integer deleteById(String testId); /** 批量删除 */ Integer deleteIds(String testIds); /** 修改test */ Integer updateTest(Test test); /** 新增test */ Integer add(Test test);}
package demo.service.impl;import java.util.List;import java.util.UUID;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import demo.domain.Test;import demo.mapper.TestMapper;import demo.service.TestService;/** * @author GrassPrince * @Da2019年4月3日 2019年4月3日 - 下午7:51:26 * @Description 测试的 service实现类 */@Servicepublic class TestServiceImpl implements TestService{ @Autowired private TestMapper testMapper; /** 根据testId查询test */ @Override public ListqueryById(String testId) { return testMapper.queryById(testId); } /** 根据testId删除test */ @Override public Integer deleteById(String testId) { return testMapper.deleteById(testId); } /** 批量删除 */ @Override public Integer deleteIds(String testIds) { String[] deleteIds = testIds.split(","); return testMapper.deleteIds(deleteIds); } /** 修改test */ @Override public Integer updateTest(Test test) { return testMapper.updateTest(test); } /** 新增test */ @Override public Integer add(Test test) { // 用uuid设置随机的主键id test.setTestId(UUID.randomUUID().toString().replace("-", "")); return testMapper.add(test); } }
package demo.mapper;import java.util.List;import org.apache.ibatis.annotations.Param;import demo.domain.Test;/** * @author GrassPrince * @Da2019年4月3日 2019年4月3日 - 下午7:53:50 * @Description 测试的mapper */public interface TestMapper { /** 根据testId查询test */ ListqueryById(@Param("testId") String testId); /** 根据testId删除test */ Integer deleteById(@Param("testId") String testId); /** 批量删除 */ Integer deleteIds(@Param("testIds") String[] deleteIds); /** 修改test */ Integer updateTest(Test test); /** 新增test */ Integer add(Test test);}
delete from test where test_id = #{testId} delete from test test_id in #{testId} update test set test_password = #{testPassword}, test_name = #{testName} where test_id = #{testId} insert into test values(#{testId}, #{testPassword}, #{testName})
package demo;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@MapperScan("demo.mapper")public class DruidMybatisMysqlApplication { public static void main(String[] args) { SpringApplication.run(DruidMybatisMysqlApplication.class, args); }}
查询 测试查询
4.页面效果( 服务启动后地址 : http://localhost:8086/dataSource/test/testHtml )
5.集成 druid 管理数据库: 主要是一个配置类和 application.yml的配置文件
/** * */package demo.config;import java.util.Arrays;import java.util.HashMap;import java.util.Map;import javax.sql.DataSource;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.boot.web.servlet.ServletRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.alibaba.druid.pool.DruidDataSource;import com.alibaba.druid.support.http.StatViewServlet;import com.alibaba.druid.support.http.WebStatFilter;/** * @author GrassPrince * @Da2019年4月3日 2019年4月3日 - 下午8:00:17 * @Description druid数据库监测配置类 -> 项目启动后的访问地址 http://localhost:8086/dataSource/druid/index.html */@Configurationpublic class DruidConfig { /** * 注入DruidDataSource在yml配置文件中的配置 * prefix: 获取以spring.datasource为前缀的配置内容, 减少一个个@Value获取 */ @ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource getDataSource() { return new DruidDataSource(); } /** * 配置Druid的监控 : 一个管理后台的Servlet */ @Bean public ServletRegistrationBeanstatViewServlet() { ServletRegistrationBean bean = new ServletRegistrationBean (new StatViewServlet(), "/druid/*"); Map initParams = new HashMap (); initParams.put("loginUsername","admin"); //用户名 initParams.put("loginPassword","123456"); //密码 initParams.put("allow",""); //IP白名单(没有配置或者为空,则允许所有访问) initParams.put("deny",""); //IP黑名单 (存在共同时,deny优先于allow) bean.setInitParameters(initParams); return bean; } /** * 配置一个web监控的filter */ @Bean public FilterRegistrationBean webStatFilter(){ FilterRegistrationBean bean = new FilterRegistrationBean (); bean.setFilter(new WebStatFilter()); Map initParams = new HashMap<>(); initParams.put("exclusions", "*.js,*.css,/druid/*"); 忽略资源 bean.setInitParameters(initParams); bean.setUrlPatterns(Arrays.asList("/*")); return bean; }}
6.配置后页面效果
7.个人心得
1) mybatis的配置文件很少,全在 yml 文件中, 需注意 启动类添加的 注解 @MapperScan("demo.mapper"), 扫描mapper层的接口
2) mysql数据库url的配置 url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC ,
springBoot 2.0 以上的版本 用 mysql 8.0.12客户端 时会出现时区错误, 用 serverTimezone=UTC 解决 , driver-class-name: com.mysql.cj.jdbc.Driver 也改变
3) xml中的参数在mapper接口中通过 @Param 注解注入较实用(list集合和数组都可以直接传)