目录
前言
一、回顾JDBC操作数据库的过程
二、Mybatis操作数据库的过程
三、上代码
1.引入库
2.创建User.java
3.创建UserMapper.java
4.创建UserMapper.xml
5.创建Mybatis核心配置文件mybatis-config.xml
6.创建测试类UserServiceTest.java
7.运行测试
四、mybatisX插件的安装
springboot项目结构:
使用JDBC链接,操作数据库的过程:
1. 加载JDBC驱动
2. 建立并获取数据库链接
3. 创建JDBC Statements 对象
4. 设置SQL 语句的传入参数
5. 执行SQL 语句并获取查询结果
6. 对查询结果进行转换处理并将处理结果返回
7. 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)
JDBC的问题:
1. 频繁的链接、关闭数据库,浪费数据库资源、影响性能(可以用连接池优化)
2. SQL语句散落在代码中,不断地拼入参,重复代码较多。(Mybatis中有变量名参数、动态SQL及SQL语句统一存放)
3. 得到结果后大量需要结果属性映射及封装。(Mybatis中SQL处理器直接返回需要的类型对象,完成数据结构及结果的映射)
使用Mybatis直接链接数据库操作数据
1. 建立对应表的用户实体类(普通的java bean)User.java
2. 定义DAO接口(也就是Mapper映射接口),与数据库交互作用:UserMapper.java
3. 创建统一写sql语句的XML文件与DAO接口(也就是Mapper映射接口)对应,路径报名要一致,XML文件与数据层接口类的名称一致,UserMapper.xml
4. 建立Mybatis核心配置文件mybatis-config.xml,在resources文件包下。配置文件中定义了数据源、数据层映射接口与SQL语句的XML文件的映射关系等
maven的pom.xml引入库
4.0.0
com
mybatis_demo2
0.0.1-SNAPSHOT
mybatis_demo2
Demo project for Spring Boot
1.8
UTF-8
UTF-8
2.3.7.RELEASE
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.4
mysql
mysql-connector-java
runtime
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
junit
junit
test
com.github.pagehelper
pagehelper
5.2.0
log4j
log4j
1.2.17
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
1.8
UTF-8
org.springframework.boot
spring-boot-maven-plugin
2.3.7.RELEASE
com.mybatis_demo2.MybatisDemo2Application
repackage
repackage
package com.mybatis_demo2.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author lv
* @date 2022年11月12日22点00分
* 封装数据的实体bean,(lombok简化代码)
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
private String nickname;
private Date addtime;
}
package com.mybatis_demo2.mapper;
import com.github.pagehelper.Page;
import com.mybatis_demo2.pojo.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author lv
* @date 2022年11月12日17点24分
* dao层,主要负责和数据库交互
*/
public interface UserMapper {
/**
* 查询所有用户信息
* @return
*/
public List selectUserAll();
/**
* 查询单个用户
* @param id
* @return
*/
public User selectOneUser(int id);
/**
* 添加数据
* @param user
* @return
*/
public int adduser(User user);
/**
* 更新数据
* @param user
* @return
*/
public int update(User user);
/**
* 删除数据
* @param id
* @return
*/
public int del(Integer id);
/**
* 查询分页总条数(普通分页方式)
* @return
*/
Long countAllUser();
/**
* 查询每页的显示数据(普通分页方式)
* @param index LIMIT函数的起始索引值
* @param size LIMIT函数的每页大小
* @return
*/
List selectPageUser(@Param("index") int index, @Param("size") int size);
/**
* 使用分页插件实现分页查询
* @return
*/
Page pagePluginselectUser();
/**
* 查询单个用户(根据用户名查询,演示SQL注入)
* @param username
* @return
*/
User findUsernameUser(String username);
/**
* 据id查询用户(使用标签,在UserMapper.xml中使用where和if标签)
* @param id
* @return
*/
List findUserList(int id);
/**
* 根据username查询用户(使用标签,在UserMapper.xml中使用where,if和 foreach 标签)
* @Param("unamelist") 定义参数名,方便UserMapper.xml找到参数
* @param unamelist
* @return
*/
List findUserListByUsername(@Param("unamelist") List unamelist);
}
注意在resources资源文件夹下创建com\mybatis_demo2\mapper目录
insert into users(username,password,nickname,addtime) values(#{username},#{password},#{nickname},NOW())
update users set username=#{username} where id=#{id}
delete from users where id=#{id}
package com.mybatis_demo2;
import com.mybatis_demo2.pojo.User;
import com.mybatis_demo2.service.impl.UserService;
import org.apache.log4j.Logger;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
/**
* @author lv
* @date 2022年11月12日23点41分
* 测试用例类
*/
public class UserServiceTest {
private Logger logger = Logger.getLogger(this.getClass());
/**
* 使用JDBC链接,操作数据库的过程
* 1. 加载JDBC驱动
* 2. 建立并获取数据库链接
* 3. 创建JDBC Statements 对象
* 4. 设置SQL 语句的传入参数
* 5. 执行SQL 语句并获取查询结果
* 6. 对查询结果进行转换处理并将处理结果返回
* 7. 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)
*/
/**
* 使用Mybatis直接链接数据库操作数据
* 1. 建立对应表的用户实体类(普通的java bean)User.java
* 2. 定义DAO接口(也就是Mapper映射接口),与数据库交互作用:UserMapper.java
* 3. 创建统一写sql语句的XML文件与DAO接口(也就是Mapper映射接口)对应,路径报名要一致,XML文件与数据层接口类的名称一致,UserMapper.xml
* 4. 建立Mybatis核心配置文件mybatis-config.xml,在resources文件包下。配置文件中定义了数据源、数据层映射接口与SQL语句的XML文件的映射关系等
* 5. 测试
*/
@Test
public void testSelectAlluser(){
UserService userService=new UserService();
/**
* 查询所有字段时如果User用户封装实体中有字段与表中字段不一致,得到的字段显示结果为null
* 解决方法为:使用as关键字取别名进行关联映射,select id_card as idCard from users
*/
List list= userService.selectAlluser();
if(list.size()>0){
// //for迭代循环
// for(User user:list){
// System.out.println(user.getUsername()+"||"+user.getPassword()+"||"+user.getNickname());
// }
// //for循环,语法格式:for (①初始化部分; ②循环条件部分; ④迭代部分){ ③循环体部分; }
// for(int i=0;i list= userService.selectPageUser(3,4);
}
/**
* 分页插件简化分页
* 1. 向pom.xml中添加依赖包
*
*
* com.github.pagehelper
* pagehelper
* 5.2.0
*
* 2. 向 mybatis-config.xml 核心配置文件中加入插件拦截器
*
*
*
*
* 3. 使用分页插件传入分页参数,只有紧跟startPage()方法之后的查询语句才会被执行分页
* PageHelper.startPage(pageNum,size); --pageNum:第几页,size每页分页大小
* 4. 调用分页查询的方法,使用Page 或 PageInfo
* Page pageUser= mapper.pagePluginselectUser();
* 或
* userlist= mapper.selectUserAll();
* PageInfo pinfo=new PageInfo<>(userlist,1);
*/
@Test
public void pagePluginSelect(){
UserService userService=new UserService();
List list= userService.PagePluginUserSelect(3,3);
}
/**
* 查询单个用户(根据用户名查询,演示SQL注入)
*/
@Test
public void findUsernameUser(){
UserService userService=new UserService();
/**
* findUsernameUser(String username)调用此方法时正确的参数是传入一个username,但是实际我传入了一个字符串,模拟进行了SQL注入。
* 运行后打印的结果为:
* Preparing: select * from users where username='user001' and username='mm'
* Parameters:
* Total: 0
* UserMapper.xml文件中SQL语句为:select * from users where username=${username}
*
* -------改进避免SQL注入
* 将UserMapper.xml文件中SQL语句改为:select * from users where username=#{username} --Mybatis中使用#{}传参避免了SQL注入。
* 运行后打印的结果为:
* Preparing: select * from users where username=?
* Parameters: 'user001' and username='mm'(String)
* Total: 0
*/
userService.findUsernameUser("'user001' and username='mm'");
}
/**
* 根据id查询用户(使用标签,在UserMapper.xml中使用where和if标签)
*/
@Test
public void testGetListUser(){
UserService userService=new UserService();
userService.findListUser(3);
}
/**
* 根据username查询用户(使用标签,在UserMapper.xml中使用where,if和 foreach 标签)
*/
@Test
public void testfindUserListByUname(){
UserService userService=new UserService();
List unamelist=new ArrayList<>();
unamelist.add("'user02'");
unamelist.add("'user003'");
unamelist.add("'user005'");
userService.findUserListByUname(unamelist);
}
/**
* 附加
* 打印99乘法表
*/
@Test
public void multiplyTable(){
// for(int i=1;i<10;i++){
// for(int j=1;j<(i+1);j++){
// System.out.print(j+"*"+i+"="+(j*i)+" ");
// if((j*i==6||j*i==8)&&(i==3||i==4)){
// System.out.print(" ");
// }
// }
// //println()换行,print()不换行
// System.out.println();
// }
int a= 8%2;
System.out.println(a>0 ? 8/2+1 : 8/2);
}
}
测试运行selectUserOne()测试方法的运行接口如下:
使用mybatisX插件可以实现在UserMapper.xml和UserMapper.java文件之间的关联切换