首页 > 数据库 > 【spring-boot-route(七)整合jdbcTemplate操作数据库+(八)整合mybatis操作数据库】

【spring-boot-route(七)整合jdbcTemplate操作数据库+(八)整合mybatis操作数据库】

时间:2023-02-10 13:32:30浏览次数:48  
标签:studentId 整合 int spring 数据库 student sql Integer name

在一部分内容中,我们学习了Restful接口的编写,及接口文档的生成。我们需要将接口数据进行持久化存储,这一部分我们主要学习几种持久化框架将数据进行存储。本部分内容中,我们都将使用mysql为例来做为演示数据库。

在刚开始接触数据库操作的时候我们都会使用JDBC来进行数据库操作,但是每次都要创建连接,关闭连接非常麻烦,Spring将JDBC进行了简易的封装成了一个新的框架——JdbcTemplate。

项目搭建

1 添加mysql依赖

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>

2. 添加jdbcTemplate依赖


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

3. 配置mysql


spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/simple_fast?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useAffectedRows=true&allowPublicKeyRetrieval=true
username: root
password: root

简单操作数据库

新建一张表​​student​​用来测试JdbcTemplate的常用功能。建表语句如下:


CREATE TABLE `student` (
`student_id` int(30) NOT NULL,
`age` int(1) DEFAULT NULL COMMENT '年龄',
`name` varchar(45) DEFAULT NULL COMMENT '姓名',
`sex` int(1) DEFAULT NULL COMMENT '性别:1:男,2:女,0:未知',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`status` int(1) DEFAULT NULL COMMENT '状态:1:正常,-1:删除',
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='学生表'

对应的实体类如下:


@Data
@NoArgsConstructor
@AllArgsConstructor
public class StudentBean implements Serializable {

private static final long serialVersionUID = 4618004018169112427L;

private Integer studentId;
private Integer age;
private String name;
private Integer sex;
private Date createTime;
private Integer status;
}

JdbcTemplate提供了比较完善的数据库操作API,日常开发中比较常用的API主要为两类,分别是

  • query与queryXXX
  • update与batchUpdate

JdbcTemplate的使用也非常简单,哪儿需要使用注入即可


@Autowired
private JdbcTemplate jdbcTemplate;

1 查询单个实体


public StudentBean getStudent(int status){
String sql = "select * from student where status = ? limit 1";
return jdbcTemplate.queryForObject(sql,new Object[]{status},new BeanPropertyRowMapper<>(StudentBean.class));
}

2 查询List集合


public List<StudentBean> studentBeanList(int status){
String sql = "select * from student where status = ?";
return jdbcTemplate.query(sql,new Object[]{status},new BeanPropertyRowMapper<>(StudentBean.class));
}

3. 删除操作


public int deleteStudent(int status){
String sql = "delete from student where status = 0";
return jdbcTemplate.update(sql);
}

4. 更新操作


public int updateStudent(int studentId,String name){
String sql = "update student set name = ? where student_id = ?";
return jdbcTemplate.update(sql,new Object[]{name,studentId});
}

5. 插入操作


public int addStudent(){
String sql = "insert into student(student_id,age,name,status) values(?,?,?,?)";
return jdbcTemplate.update(sql,new Object[]{30,18,"Java旅途",0});
}

6. 批量插入

JdbcTemplate提供了批量插入的API,为了减少与数据库的操作,提高插入效率,将待插入的数据批量放在缓冲区,一次批量插入多条数据。


public int batchAddStudent(){

// 构造list集合
List<StudentBean> studentBeanList = new ArrayList<>();
StudentBean studentBean = new StudentBean(31, 31, "Java旅途", 1, new Date(), 1);
StudentBean studentBean1 = new StudentBean(32, 32, "javatrip", 1, new Date(), 1);
studentBeanList.add(studentBean);
studentBeanList.add(studentBean1);
String sql = "insert into student values(?,?,?,?,?,?)";

int[] ints = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
StudentBean student = studentBeanList.get(i);
ps.setInt(1, student.getStudentId());
ps.setInt(2, student.getAge());
ps.setString(3, student.getName());
ps.setInt(4, student.getSex());
ps.setDate(5,new java.sql.Date(System.currentTimeMillis()));
ps.setInt(6, student.getStatus());
}

@Override
public int getBatchSize() {
return studentBeanList.size();
}
});
return ints.length;
}

上面只是演示了几个简单的例子,如果需要更详细的用法可以参考官方提供的JdbcTemplate API。JdbcTemplate对于初学者来说是比较容易上手的一个框架,使用起来也非常方便。但是也存在一些缺点,它是将sql硬编码到java代码中,如果需要修改sql,就需要重新编译java代码,不利于维护。

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

接下来讲解:

【spring-boot-route(八)整合mybatis操作数据库】

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

通过注解完成数据操作

第一步:引入mysql依赖和mybatis依赖


<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>LATEST</version>
</dependency>

第二步:新建学生表及对应的实体类


CREATE TABLE `student` (
`student_id` int(30) NOT NULL AUTO_INCREMENT,
`age` int(1) DEFAULT NULL COMMENT '年龄',
`name` varchar(45) DEFAULT NULL COMMENT '姓名',
`sex` int(1) DEFAULT NULL COMMENT '性别:1:男,2:女,0:未知',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`status` int(1) DEFAULT NULL COMMENT '状态:1:正常,-1:删除',
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=617354 DEFAULT CHARSET=utf8mb4 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='学生表'


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable {

private static final long serialVersionUID = 6712540741269055064L;

private Integer studentId;
private Integer age;
private String name;
private Integer sex;
private Date createTime;
private Integer status;
}

第三步:配置数据库连接信息


spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/simple_fast
username: root
password: root

增删改查


@Mapper
public interface StudentMapper {

@Select("select * from student where student_id = #{studentId}")
Student findById(@Param("studentId") Integer studentId);

@Insert("insert into student(age,name) values(#{age},#{name})")
int addStudent(@Param("name") String name,@Param("age") Integer age);

@Update("update student set name = #{name} where student_id = #{studentId}")
int updateStudent(@Param("studentId") Integer studentId,@Param("name") String name);

@Delete("delete from student where student_id = #{studentId}")
int deleteStudent(@Param("studentId") Integer studentId);
}

上面演示的传参方式是通过单个参数传递的,如果想通过Map或实体类传参数,就不需要使用@Param来绑定参数了,将map中的key或者实体类中的属性与sql中的参数值对应上就可以了

通过XML配置完成数据操作

@Mapper和@MapperScan

@Mapper加在数据层接口上,将其注册到ioc容器上,@MapperScan加在启动类上,需要指定扫描的数据层接口包。如下:


@Mapper
public interface StudentMapper {}


@SpringBootApplication
@MapperScan("com.javatrip.mybatis.mapper")
public class MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
}
}

两个注解的作用一样,在开发中为了方便,通常我们会使用@MapperScan。

指定mapper.xml的位置


mybatis:
mapper-locations: classpath:mybatis/*.xml

开启数据实体映射驼峰命名


mybatis:
configuration:
map-underscore-to-camel-case: true

编写xml和与之对应的mapper接口


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.javatrip.mybatis.mapper.StudentXMapper">
<select id="findById" resultType="com.javatrip.mybatis.entity.Student">
select * from student where student_id = #{studentId}
</select>
<insert id="addStudent" parameterType="com.javatrip.mybatis.entity.Student">
insert into student(name,age) values(#{name},#{age})
</insert>

<update id="updateStudent" parameterType="com.javatrip.mybatis.entity.Student">
update student set name = #{name} where student_id = #{studentId}
</update>

<delete id="deleteStudent" parameterType="Integer">
delete from student where student_id = #{studentId}
</delete>
</mapper>


@Mapper
public interface StudentXMapper {

Student findById(@Param("studentId") Integer studentId);

int addStudent(Student student);

int updateStudent(@Param("studentId") Integer studentId,@Param("name") String name);

int deleteStudent(@Param("studentId") Integer studentId);
}

编写测试类

 【spring-boot-route(七)整合jdbcTemplate操作数据库+(八)整合mybatis操作数据库】_bc

这里有几个需要注意的点:mapper标签中namespace属性对应的是mapper接口;select标签的id对应mapper接口中的方法名字;select标签的resultType对应查询的实体类,使用全路径。



标签:studentId,整合,int,spring,数据库,student,sql,Integer,name
From: https://blog.51cto.com/u_15874356/6048230

相关文章

  • 【Spring-boot-route(九)整合JPA操作数据库+(十)多数据源切换】
    spring-boot-route(九)整合JPA操作数据库单调的增删改查让越来越多的程序员感到乏味,这时候就出现了很多优秀的框架,完成了对增删改查操作的封装,只需要简单配置,无需书写任何sql,......
  • 数据库(3)--嵌套查询和连接查询
    上一篇:数据库(2)--加深对统计查询的理解,熟练使用聚合函数:​​https://blog.51cto.com/hwuu/6040381​​一、内容要求从下面10个题目中选一个,第一题查询用连接查询和嵌套查询......
  • 数据库必知必会:TiDB(5)TiKV Raft
    (数据库必知必会:TiDB(5)TiKVRaft)Raft角色介绍TiKV中的Region保存了3份数据,其中一份数据是主数据,称为leader,另外两份是follower。Region中的数据是按照key进行排序的。......
  • MySQL数据库报错:Too many connection
    一般遇到这种情况就是由于mysql最大连接数满了,如果这个时候再有新的链接进去的话,会进不去,所以需要修改MYSQL的max_connections参数的设置,扩大数据库的最大连接数。 1、查......
  • SpringBoot解决跨域问题
    遇到前端跨域访问问题,类似于这样的:在Springboot项目里加上这个配置文件CorsConfig.java,重启之后即可实现跨域访问,前端无需再配置跨域。importorg.springframework.......
  • SpringBoot Response统一返回封装,全局异常处理
    背景经常写代码,很多公司的Restful都是code,msg,data这种封装{"code":0,"msg":null,"data":null}后端代码:@GetMapping("hello")publicResultlist......
  • Hive元数据库在MySQL中的字符编码修改为UTF8解决中文乱码问题
    一、问题浮现二、问题定位在初始化Hive元数据时,已经指定了连接mysql的字符集为UTF8,但还是出现了乱码问题。jdbc:mysql://127.0.0.1:3306/hive_metastore?createDa......
  • 向数据库中添加种子数据
    在Models目录下添加SeedData类1usingMicrosoft.EntityFrameworkCore;2usingMvcMovie.Data;34namespaceMvcMovie.Models5{6publicstaticclass......
  • springboot将http改造成https
    生成命令:keytool-genkey-aliastestalias-storetypePKCS12-keyalgRSA-keysize2048-keystorekeystore.p12-validity365关键字解释:alias  密钥别名store......
  • 消息重试框架 Spring-Retry 和 Guava-Retry
    消息重试框架Spring-Retry和Guava-Retry一重试框架之Spring-RetrySpringRetry为Spring应用程序提供了声明性重试支持。它主要是针对可能抛出异常的一些调用操作,......