MySQL
1. 数据源配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/godme?useSSL=true
username: root
password: godme
driver-class-name: com.mysql.jdbc.Driver
type: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
username
:用户名
password
:密码
url
:连接地址
driver-class-name
:驱动类型
type: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
:可以配置数据源类型
useSSL=true
:有要求SSL
连接的需要配上type
:有默认值,不过不一定是想要的,设置上,更有把握
2. 建表语句执行
- 建表文件
语句文件存放文件,
SQL
语句都写在其中
schema-*.sql
:建表语句
data-*.sql
:数据操作
文件名称严格区分,才能让SpringBoot进行识别
- 执行配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/godme?useSSL=true
username: root
password: godme
type: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
driver-class-name: com.mysql.jdbc.Driver
schema:
- classpath:schema-godme.sql
initialization-mode: always
schema
:指定了建表文件位置,传入的是list
,yml
语法能看出来
initialization-mode
:2.0以上版本增加选择,不再自动执行语句,需要配置执行策略
3. 数据模板
@Controller
public class MyController {
@Autowired
JdbcTemplate template;
@ResponseBody
@RequestMapping("/data")
public List getData(){
List<Map<String, Object>> list = template.queryForList("SELECT * FROM person");
return list;
}
}
如你所见,只要数据源成功获取,自动注入JdbcTemplate
,当然了,你必须是JDBC
.
如果数据源成功获取了,确定是
JDBC
,还是报错的话,去掉配置中的type
。确定好
driver-class-name
,无误的话,可能错的就是type
了。
Druid
1. 配置
#durid
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.druid.url = jdbc:mysql://localhost:3306/godme?useSSL=true
spring.datasource.druid.username=root
spring.datasource.druid.password=godme
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.druid.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
spring.datasource.druid.useGlobalDataSourceStat=true
注意修改连接,用户名和密码
2. 注入
@Configuration
public class MyConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSource dataSource(){
return new DruidDataSource();
}
}
@ConfigurationProperties
没忘记吧
- 错误
运气好的就不说了,运气不好的话就要做日志适配
了,关键在于
spring.datasource.druid.filters=stat,wall,log4j
解决办法有二:
-
#spring.datasource.druid.filters=stat,wall,log4j # 注释掉,一了百了 # 也不一定需要全部杀掉,注释掉关键的log4j也可
-
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- 都是ClassNotFound的异常,这下面有 --> <!-- 还有错误的话根据它的提示和链接进行排除即可-->
3. 页面
- servlet
@Configuration
public class MyConfig {
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean();
bean.setServlet(new StatViewServlet());
bean.addUrlMappings("/druid/*");
// bean.addUrlMappings("/view");
Map<String, String> map = new HashMap<String, String>();
map.put("loginUsername", "godme");
map.put("loginPassword", "godme");
map.put("allow", "");
// map.put("deny","192.168.31.248");
bean.setInitParameters(map);
return bean;
}
}
来自傻瓜的
忠告
:
addUrlMappings
:/druid/*
,切记啊,别瞎搞什么自定义\view
了,不行的,要排好久
的
deny
:allow
配""
就行了,大家都能访问,别单机还把localhost
配上去,访问不了啊
- filter
@Configuration
public class MyConfig {
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String, String> map = new HashMap<>();
map.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(map);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
来自傻瓜的
忠告
:
exclusions
:这个配置过滤的,/druid/*
放不放都一样,没有啥骚操作
setUrlPatterns
:就/*
算了,骚操作我也不想了,别瞎折腾了都是老东西,不用瞎搞,没新的。
- 页面
http://localhost:8080/druid/index.html
直接访问就成
这就
OK
了,不过druid
了解不多,不是看页面比较骚,死活没出来,还真不管了。有兴趣的直接看druid官网,这样了解的更多。
Mybatis
1. pom引入
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
2. 配置
#durid
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.druid.url = jdbc:mysql://localhost:3306/godme?useSSL=true
spring.datasource.druid.username=root
spring.datasource.druid.password=godme
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.druid.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
spring.datasource.druid.useGlobalDataSourceStat=true
#spring.datasource.druid.connectionInitSqls=drop table judas;
druid
:datasource
的一种类型,从底层来说顺序有
数据库
连接器
驱动
数据源
框架
(orm
)
抛开数据库
不说,连接过程中直接发起连接的connector
我们也不关心。
一般的都是关心数据源datasource
,从中分段,一般连接获取数据,一半orm
框架整合。
所以,只要是javax.sql.DataSource
,实现就都可以。
connectionInitSqls
:druid
的运行时执行SQL
3.注解使用
- 注解接口
@Mapper
public interface PersonMapper {
@Select("select * from person where name=#{name}")
public Person getPerson(String name);
@Insert("insert into person(name, age) values(#{name}, #{age})")
public int insertPerson(Person person);
@Delete("delete from person where name=#{name}")
public int deletePerson(Person person);
@Update("update person set age=#{age} where name=#{name}")
public int updatePerson(Person person);
}
@Mapper
:标注为映射类,自动扫描,如果不标记的话,请在入口类配置@MapperScan
,指定扫描的路径
@Select:
查询
@Delete
:删除
@Insert
:插入
@update
:更新
Mapper
都是interface
- 在语句注解中需要实现指定的
SQL
,如果多参的话传入对象
,直接使用属性填充#{}
语句即可
实验表中无主键,如果需要主键自增的话
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into Person(name, age) value(#{name}, #{age})")
@Options
:设置选项
useGeneratedKeys
:表示采用自增
keyProperty
:指定自增属性
- 外部查询
@RestController
public class MyController {
@Autowired
PersonMapper mapper;
@GetMapping("/query")
public Person query(@RequestParam("name") String name){
return mapper.getPerson(name);
}
@GetMapping("/insert")
public Person insert(Person person){
mapper.insertPerson(person);
return person;
}
@GetMapping("/delete")
public Person delete(@RequestParam("name") String name){
Person person = mapper.getPerson(name);
mapper.deletePerson(person);
return person;
}
}
直接通过定义的
PersonMapper
即可进行查询,中间的配置过程Spring-Boot已经自动完成
4. 文件配置
关于
mybatis
配置文件不说了,直接说引入配置操作
# 全局配置文件
mybatis.config-location=classpath:/mybatis/mybatis-config.xml
# 多文件
mybatis.config-locations=classpath:/mybatis/*.xml
# mapper配置文件
mybatis.mapper-location=classpath:/mybatis/mapper/person_mapper.xml
# 多文件
mybatis.mapper-locations=classpath:/mybatis/mapper/*.xml
# 驼峰转换什么的,新版本在这里面进行配置
mybatis.configuration=
# 更细节就点一下,具体可以查看自动配置类
mybatis.configuration.*=
JPA
1. pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
2. 配置
# 无表自动创建,有表不动
spring.jpa.hibernate.ddl-auto=update
# 打印SQL
spring.jpa.show-sql=true
3. 实体
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name= "name")
private String name;
@Column(name = "age")
private Integer age;
}
@Entity
:标记为映射实体
@Table
:指定映射表名,不写则为类名小写,配置时无表自动创建
@Id
:指定主键
@GeneratedValue
:strategy
配置自增,GenerationType.IDENTITY
自增类型,更多自己查看
@Column
:绑定行属性,默认属性小写
4. 接口
public interface StudentRepository extends JpaRepository<Student, Integer>{
}
JpaRepository
:继承类,默认实现CRUD
和分页功能
Student
:针对实体类
Integer
:Student
中Id
类型,要求可序列化Serializable
5. 调用
@RestController
public class MyController {
@Autowired
StudentRepository studentRepository;
@GetMapping("/query/{id}")
public Student query(@PathVariable("id") Integer id){
return studentRepository.getOne(id);
}
@GetMapping("/insert")
public Student insert(Student student){
studentRepository.save(student);
return student;
}
@GetMapping("/delete/{id}")
public Student delete(@PathVariable("id") Integer id){
Student student = studentRepository.getOne(id);
studentRepository.delete(student);
return student;
}
@GetMapping("/update/{id}")
public Student update(@PathVariable("id") Integer id, @RequestParam("name") String name, @RequestParam("age") Integer age){
Student student = studentRepository.getOne(id);
student.setAge(age);
student.setName(name);
studentRepository.save(student);
return student;
}
}
studentRepository
:接口注入即可直接使用
getOne
:查询,传入id
save
:传入对象自动保存
delete
:传入对象删除
- 更新操作需要手动实现
- 更多方法查看接口定义