技术标签: java mybatis mysql SpringBoot
前言:
网上关于这部分的资料有很多,但是都很零散,今天为了总结一下以前自己学习的,所以准备在这里写一篇完整的教程,希望对你们有用。
<?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.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.asong.demo</groupId>
<artifactId>demomybat</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demomybat</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
因为为了测试,我们的用户表只创建4个字段如下:
CREATE TABLE `user` (
`id` int(13) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(33) DEFAULT NULL COMMENT '姓名',
`age` int(3) DEFAULT NULL COMMENT '年龄',
`money` double DEFAULT NULL COMMENT '账户余额',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
如下:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
这里需要注意的是,我们使用的mysql-connector-java 8+ ,JDBC 连接到mysql-connector-java 6+以上的需要指定时区 serverTimezone=GMT%2B8。另外我们之前使用配置 Mysql数据连接是一般是这样指定driver-class-name=com.mysql.jdbc.Driver,但是现在不可以必须为 否则控制台下面的异常:
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
public class User {
private int id;
private String name;
private int age;
private double money;
public User(){
}
public User(int id, String name, int age, double money) {
this.id = id;
this.name = name;
this.age = age;
this.money = money;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public double getMoney() {
return money;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", money=" + money +
'}';
}
}
@Mapper
public interface UserDao {
/**
* 通过名字查询用户信息
*/
@Select("SELECT * FROM user WHERE name = #{name}")
User findUserByName(@Param("name") String name);
/**
* 查询所有用户信息
* @return
*/
@Select("SELECT * FROM user")
List<User> findAllUser();
/**
* 插入用户信息
* @param name
* @param age
* @param money
*/
@Insert("INSERT INTO user(name, age,money) VALUES(#{name}, #{age}, #{money})")
void insertUser(@Param("name") String name,@Param("age") Integer age,@Param("money") Double money);
/**
* 根据 id 更新用户信息
*/
@Update("UPDATE user SET name = #{name},age = #{age},money= #{money} WHERE id = #{id}")
void updateUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money,
@Param("id") int id);
/**
* 根据 id 删除用户信息
*/
@Delete("DELETE from user WHERE id = #{id}")
void deleteUser(@Param("id") int id);
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
/**
* 根据名字查找用户
* @param name
* @return
*/
public User selectUserByName(String name)
{
return userDao.findUserByName(name);
}
/**
* 插入两个用户
*/
public void insertService(){
userDao.insertUser("sunsong",22,4000.0);
userDao.insertUser("zhang",20,4000.0);
}
/**
* 查找所有用户
* @return
*/
public List<User> selectAllUser(){
return userDao.findAllUser();
}
/**
* 根据id删除用户
* @param id
*/
public void deleteService(int id)
{
userDao.deleteUser(id);
}
@Transactional
public void changemoney(){
userDao.updateUser("sunsong",21,2000.0,3);
//模拟转账过程中可能遇到的意外情况
int test = 1 / 0;
userDao.updateUser("zhang",19,3000.0,4);
}
}
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/query")
public User testQuery() {
return userService.selectUserByName("sunsong");
}
@RequestMapping("/insert")
public List<User> testInsert() {
userService.insertService();
return userService.selectAllUser();
}
@RequestMapping("/changemoney")
public List<User> testchangemoney() {
userService.changemoney();
return userService.selectAllUser();
}
@RequestMapping("/delete")
public String testDelete() {
userService.deleteService(3);
return "OK";
}
}
这个项目完全是通过全注解方式进行开发,还可以通过XML方式的进行开发,等我发下一次整理发出来吧,总体实现还是很简单。
文章浏览阅读2k次。原因分析,STM32G030F6P6与STM32F系列的启动特点有一些差异,主要是默认的nBOOT_SEL被设置为1,即由内部BOOT位配置启动,使用官方提供的STM32CubeProgrammer修改不了nBOOT_SEL配置,后来通过命令行执行下列代码后,修改nBOOT_SEL为0,芯片可正常启动。初次使用STM32G030F6P6开发了一款电路板,但是发现烧录程序后无法启动运行的问题。_stm32g030f6p6烧录
文章浏览阅读359次。O流的操作规律之所以要弄清楚这个规律,是因为流的对象太多,开发时不知道用哪个对象合适。想要知道开发时用到哪个对象,只要通过四个明确即可。1.明确源和目的(汇) 源:InputStream Reader 目的:OutputStream Writer2.明确数据是否是纯文本数据 源:是纯文本 Reader_io流操作的熟练应用
文章浏览阅读6k次,点赞3次,收藏2次。如何快速设置原点,如何移动游标的位置_blender移动游标
文章浏览阅读1.2k次。友盟社会化sdk,qq分享回调无论成功失败全部跳转onCancel解决方法:application中的qqid和manifests的qqid需要填写同一个,如果用默认的就全都用默认id。_友盟分享qq oncancel
文章浏览阅读474次。2)布尔运算符&& (逻辑与)的操作数必须是布尔类型的值,即真(true)或假(false)。一般来说,非零的值会被转换为真(true),零的值会被转换为假(false)。因此,在使用布尔运算符&& (逻辑与)时,最好确保操作数是布尔类型的值,或者使用比较运算符将其转换为布尔类型的值。3)布尔运算符&& (逻辑与)的结果也是布尔类型的值,即真(true)或假(false)。布尔运算符&& (逻辑与)的案例四:这个案例是使用Arduino和一个超声波传感器来测量距离,并根据距离的大小显示不同的颜色。_arduino &&
文章浏览阅读417次。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。此外,使用ADC(模拟-数字转换器)读取传感器数据是一种常见的做法,对于不同的传感器类型,可能需要使用不同的引脚和参数来初始化ADC。建议采取适当的安全措施,如设置访问权限、使用安全的网络连接和加密传输数据,以保护ESP32-S3的系统和数据安全。远程监控和控制:通过WebREPL,用户可以远程监控和控制连接到ESP32-S3的传感器和执行器。_micropython webrepl
文章浏览阅读3.2w次,点赞38次,收藏14次。错误异常信息:JSON parse error: Unexpected end-of-input: expected close marker for Object (start marker at [Source: (PushbackInputStream); line: 1, column: 1]); nested exception is com.fasterxml.jackson.cor..._json parse error: unexpected end-of-input: expected close marker for object
文章浏览阅读258次。计算机四级《网络工程师》练习题计算机四级是针对计算机的熟练以及掌握程度进行评估的一种国家型等级考试。考试为无纸化考试,不含操作题。下面就来和小编一起看看计算机四级《网络工程师》练习题吧。1文件系统中,文件访问控制信息存储的合理位置是A.文件控制块B.文件分配表C.用户口令表D.系统注册表参考答案:A2下列对文件的描述中,哪一项与文件的物理结构相关?A.文件长度B.用户对文件的存取方式C.文件中记录..._计算机四级 操作题
文章浏览阅读31次。BranchCache 是 Windows 7、Windows 8、Windows Server2008R2 和 Windows Server 2012 操作系统的一项功能,此功能可在本地分支机构的计算机上对来自文件和广域网 (WAN) 中 Web 服务器的内容进行缓存。在异地分布式 SharePoint Server 2013 环境中,BranchCache 可通过缓存用户从 SharePo...
文章浏览阅读58次。代理商管理:拥有底层源码系统,发展自己的代理商,列表清晰展示各代理商状态,详细设置对代理商账号信息、创建小程序的个数、系统到期时间等进行管理。消息通知:设置商品状态通知、成团通知、预约预定通知、系统表单通知、会员卡开卡通知等消息模板,配置商家收发消息邮箱实现邮件通知。积分签到、积分兑换商城、拼团、店内点餐、手机客服等插件可用,满足各种行业场景营销需求,助力客户小程序营销推广。无需代码编程,无需技术基础,简单的操作页面,清晰的模块分划,详尽的功能组件,让您短时间即可轻松玩转小程序。_thinkphp内核全行业小程序运营管理系统源码+自由diy布局+一键生成小程序.rar
文章浏览阅读271次。安装首先这货需要在linux下跑,非得用windows就别看了,也不是不能装,费劲且性能渣得有composer,嫌慢的也拉倒吧,别看了,本文不介绍没有composer怎么办安装composer也不是本文要点,在ubuntu(其实为了不折腾QQ我装的是deepin)中就是一行命令php...
文章浏览阅读622次。1.python中小数按科学技术法的形式输出:print("%e" % number)2.int.from_bytes(bytes, bytesorder='big'/'little', signed=False)参数解释:bytes是需要解析的字节;bytesorder是说明要解释的字节中左边是高位还是右边是高位,big左边是高位,little左边是低位;signed表示当前解析的是否是有符号数。int.to_bytes()是int.from_bytes的逆过程,把十进制整数,转换为byt_python 读取二进制转小数