springboot连接数据库
Posted Dr.psycho
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot连接数据库相关的知识,希望对你有一定的参考价值。
SpringBoot 连接数据库
关于SpringBoot的映射关系:
CommonDao & CommonDaoImpl & Test
CommonDao定义接口 , Impl则去实现接口 ,Test则是调用接口的方法,但在springBoot中还需要再定义一个成员变量并加上@Autowired注解才能够成功调用CommonDao的方法构造.
实体类;数据库字段;实体类的映射文件
实体类定义的属性名对应映射文件的 Property ,此映射配置会被要求命名为固定的id,此id被用于定义sql语句的resultMap中
然而在测试的时候我们要求取的是构造类的属性名而非数据库的字段名,它的目的是通过映射文件构造映射关系.此时实体类的Id属性名等同于数据库的id字段名.
#{Name}用于提取我们添加的值,通过看测试类中的我们手动赋予的"zhangsan"通过map的方法传入到#{name}当中,同理如果我们传入的lisi同样能够得到相同的结果
ps:但是值得注意的是:他们不单单是通过单一的语句建立起的联系,在同一个类中也有类似的依赖关系,不如说是先导条件
次重要的测试类就能够展现这一阶段所有的努力过的流程,通过推导测试类可以看出我们主要集成了哪几个类和联系!
:
通过这个联动的特性,我们通过修改 namespace来测试namespace和CommonDao.finByObject的联系
关于连接数据库的代码架构:
1.依赖 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/>
</parent>
<groupId>cn.yunhe.java</groupId>
<artifactId>myspringboot01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- 引入Mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- springboot项目打包插件 jar包-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.接口 dao–>CommonDao.java
package cn.yunhe.java.dao;
import java.util.Map;
public interface CommonDao {
/**
* 自己封装的通用查询方法
* @param sql
* @param param
* @return
*/
Object findByObject(String sql, Map<String,String> param) throws Exception;
/**
* 删除方法
* @param sql
* @param param
* @return
*/
int delete (String sql, Map param) throws Exception;
}
3.接口的实现类dao–>CommonDaoImpl.java
package cn.yunhe.java.dao;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.Map;
@Repository
public class CommonDaoImpl implements CommonDao{
@Autowired
private SqlSessionTemplate template;
@Override
public Object findByObject(String sql, Map param) throws Exception {
return template.selectOne(sql,param);
}
@Override
public int delete (String sql, Map param) throws Exception {
return template.delete(sql,param);
}
}
4.实体类 pojo–>Student.java
package cn.yunhe.java.pojo;
import java.io.Serializable;
public class Student implements Serializable {
private Integer Id;
private String Name;
private Integer Age;
public Student(Integer id, String name, Integer age) {
Id = id;
Name = name;
Age = age;
}
public Integer getId() {
return Id;
}
public void setId(Integer id) {
Id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public Integer getAge() {
return Age;
}
public void setAge(Integer age) {
Age = age;
}
@Override
public String toString() {
return "student{" +
"Id=" + Id +
", Name='" + Name + '\\'' +
", Age=" + Age +
'}';
}
}
5.映射文件 resources–>mapper–>user–>userMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="CommonDao">
<resultMap id="baseResultMap" type="cn.yunhe.java.pojo.Student">
<id property="Id" column="id"/>
<result property="Name" column="name"/>
<result property="Age" column="age"/>
</resultMap>
<select id="queryUserByName" resultMap="baseResultMap" parameterType="java.util.Map">
select * from student where name=#{Name}
</select>
<select id="queryUserById" resultMap="baseResultMap" parameterType="java.util.Map">
select * from student where id=#{Id}
</select>
</mapper>
6.数据库配置文件 resources–>application.yml
server:
port: 8080
spring:
application:
name: springbootMybatis
##数据源配置,springboot默认使用的数据源是HikariCP, 不是Druid
datasource:
url: jdbc:mysql://localhost:3306/testofspringboot?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
password: root
username: root
#自定义属性
person:
name: xcong
age: 21
address: zhengzhou
mybatis:
# config-location: classpath:mapper/sqlMapper.xml #此处有坑
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: cn.yunhe.java.pojoot01.pojo
7.测试文件test–>%–>Myspringboot01ApplicationTests.java
package cn.yunhe.java;
import cn.yunhe.java.dao.CommonDao;
import cn.yunhe.java.pojo.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.Map;
@SpringBootTest
class Myspringboot01ApplicationTests {
@Autowired
private CommonDao commonDao;
@Test
void contextLoads() throws Exception {
Map<String,String> param = new HashMap<>();
param.put("Name","zhangsan");
Student su = (Student) commonDao.findByObject("CommonDao.queryUserByName",param);
System.out.println(su);
}
@Test
void selectByID() throws Exception {
Map<String,String> param = new HashMap<>();
param.put("Id","1");
Student su = (Student) commonDao.findByObject("CommonDao.queryUserById",param);
System.out.println(su);
}
}
1.有限定义的延伸:查询所有
首先我们需要在接口中定义
其中:selectAll是我自定义的名字;参数为何只有String sql这一个呢?
错误的尝试:1.本来我是跟着查询单个的语句进行map集合的添加
2.在测试中我用student作为容器
正确的方案:为什么不需要map集合及参数? 因为查询所有只需要提供一个表名就可以不需要提供其他的参数
为什么不能用student作为容器存储?因为查询所有需要List集合进行存储,Student不能提供良好的存储空间.
接口:
实现类:
映射文件:
测试类:
commonDao是命名空间,所有的方法都由它进行调用
参数的CommonDao是接口,通过它来执行查询所有的方法
2.有效定义的延伸:通过Id删除某一列
接口:
实现类:
映射文件:
测试类:
3.有效定义的延伸:添加数据(id自动递增)
接口:
实现类:
映射文件:
测试类:
4.有效定义的延伸:通过id更新某一列
接口:
实现类:
映射文件:
测试类:
总结
- 在此中,map集合的put用法是,指定字段为key ,指定 字段值为 value,那么就可以根据映射文件的sql语句的顺位进行写入值
- 带参和无参的用法主要依赖于sql语句
- 定义Object类型(也可以是泛型)的原因是我们的字段不属于同一个类型
- 命名空间可以调用此映射文件中的所有方法
- Student的本质就是容器
-
容器&调用的规则
以上是关于springboot连接数据库的主要内容,如果未能解决你的问题,请参考以下文章
全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段
SpringBoot中表单提交报错“Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“(代码片段