本文将从整合JDBC讲起,然后整合mybatis,其中会穿插一些druid的知识。
首先需要引入以下依赖。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.1.1version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
配置yml文件:
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
由于数据库驱动为8点几,所以需要引入时区!
在test类中进行测试:
@Autowired
private DataSource dataSource;
@Test
void contextLoads() throws SQLException {
// System.out.println(dataSource.getConnection());
Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
String sql = "select * from mybatis.user";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
System.out.println(resultSet.getInt("id"));
System.out.println(resultSet.getString("name"));
}
在此处,数据库如下(作为测试,数据库可以随意建立):
上面使用的是原生的数据源进行数据的查询,下面通过使用jdbc的模板类进行测试
@RestController
public class JDBCController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("/selectUser")
public List<Map<String,Object>> Listselect(){
//查询
String sql="select * from mybatis.user";
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
return maps;
}
//增
@GetMapping("/addUser")
public String addUser(){
String sql="insert into mybatis.user(name,id,age)values ('haha2',6,'12')";
int update = jdbcTemplate.update(sql);
return "增加成功";
}
//改
@GetMapping("/updateUser")
public String updateUser(){
String sql="update mybatis.user set name=? where id=?";
Object[] objects = new Object[2];
objects[0]="xiaoming";
objects[1]=1;
int update = jdbcTemplate.update(sql,objects);
return "修改成功";
}
}
通过测试,以上方法可以很好的进行数据的增删改查!
首先需要引入druid的启动器
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.1.21version>
dependency>
配置文件可以写以下内容
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# driver-class-name: com.mysql.jdbc.Driver
druid:
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
max-active: 20
# 配置获取连接等待超时的时间
max-wait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
max-pool-prepared-statement-per-connection-size: 20
filters: stat,wall
use-global-data-source-stat: true
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 配置监控服务器
stat-view-servlet:
login-username: admin
login-password: 123456
reset-enable: false
url-pattern: /druid/*
# 添加IP白名单
#allow:
# 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高
#deny:
web-stat-filter:
# 添加过滤规则
url-pattern: /*
# 忽略过滤格式
# exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
建立如下的配置类==spring.xml
@Configuration
public class DruidConfig {
//绑定数据源
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDatasource(){
return new DruidDataSource();
}
//后台监控
@Bean
public ServletRegistrationBean a(){
ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");//访问路径
//后台监控
HashMap<String, String> init = new HashMap<>();
init.put("loginUsername","admin");//key是固定的
init.put("loginPassword","123");//key是固定的
//允许访问
init.put("allow","");
bean.setInitParameters(init);
return bean;
}
}
访问结果如下:
补充知识:datasource和datamanager
datasource是与连接池获取连接,而datamanager是获取与数据库的连接!datamanager类的主要作用是管理注册到datamanager中的JDBC驱动程序,并根据需要使用JDBC驱动程序建立与数据服务器的网络连接。但是建立与数据库的连接是一项较耗资源的工作,频繁的进行数据库连接建立操作会产生较大的系统开销,为了解决上述问题,可以采用数据库连接池技术。datasource内部封装了 DriverManager的使用。c3p0 是一个连接池 同样常用还有DBCP 。底层实现都是一样的,就是使用了池化概念,如对象池,线程池。就是先把材料都准备好再开工,所有连接在服务启动之初就初始化好了,用完之后不销毁,等待下一次使用有点像缓存技术。
第一步需要引入如下的依赖,可以在创建项目的时候自动创建
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.1.1version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
第二步构建与数据库对应的实体类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Girl {
private String name;
private int id;
private int age;
}
第三步编写mapper层的接口,对数据进行增删改查操作
//Dao层 mybatis中的mapper类
@Repository
@Mapper
public interface GirlMapper {
//实现增删改查
List<Girl> getAllgirl();//查询所有用户
Girl getGirl(int id);//根据id查询
int addGirl(Girl girl);//增加用户
int delete(int id);
}
第四步:在resource目录下写与接口对应的xml文件
<mapper namespace="com.zhou.mapper.GirlMapper">
<select id="getAllgirl" resultType="girl">
select * from mybatis.user
select>
<insert id="addGirl" parameterType="girl">
insert into mybatis.user(id,name)values(7,"dandan")
insert>
<delete id="delete" parameterType="int">
delete from mybatis.user where id=#{id}
delete>
mapper>
此处可以直接子接口类的方法上直接使用注解!!代替xml文件
第五步,需要在配置文件中配置mapper位置和别名
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
mybatis.type-aliases-package=com.zhou.pojo
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
第六步,编写controller层,可以直接调用dao层(mapper)
@RestController
public class MyController {
//将dao层注入
@Autowired
private GirlMapper girlMapper;
@GetMapping ("/allgirl")
public List<Girl> test(){
List<Girl> allgirl = girlMapper.getAllgirl();
for (Girl girl : allgirl) {
System.out.println(girl);
}
return allgirl;
}
@GetMapping ("/delete/{id}")
public String test2(@PathVariable(name="id") int id){
girlMapper.delete(id);
return "删除成功";
}
}
测试发现,可以成功!删除采用的是restful风格,简洁明了