持久层框架MyBatis的增删改查、映射与表间关系

复习

一、使用mybatis的流程

  1. 创建springboot项目,添加mybatis,mysql,web
  2. 生成或者手写sql,sql是放在UserMapper.xml,是通过UserMapper.java接口,gernerator项目不是必须的。
  3. UserMapper.selectByExample()
  4. UserMaper.xml 有一个Select id=selectByExample
  5. mybatis框架会自动为UserMapper接口生成代理类$proxy50,代理类会数据库,找到UserMapper.xml中的sql执行,把resultSet转成list
  6. @autowired
  7. UserMapper userMapper userMapper是代理类的对象
  8. list userMapper.selectByExample()
  9. 配置application.yml,配置数据库信息,mapperLocation,Log
  10. 配置入口类
@MapperScan("mapper")必须加在入口类上
Application
  1. 错误:
    11.1 404
    11.2 console 显示tomcat started on port 8080
    11.3 Controller类的位置不对 com.tedu.DbDemo.controller
    11.4 地址写错了,拷贝requestMapping("/")



二、打开昨天项目mybatis02

三大框架:持久层框架MyBatis基础入门

找到UserMapper.java和UserMapper.xml,然后对比接口的包名
在这里插入图片描述

查询 example

1.在com.tedu.project_jt包中添加一个TestController.java类

在这里插入图片描述

2.对TestController 控制层进行执行调用数据库
2.1 升序排序查询user表所有内容
package com.tedu.project_jt;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.tedu.project_jt.mapper.UserMapper;
import com.tedu.project_jt.pojo.User;
import com.tedu.project_jt.pojo.UserExample;

@RestController
public class TestController {
   //控制层直接调用数据库
	//从spring的ioc容器中取UserMapper接口的代理类的对象
	@Autowired
	UserMapper userMapper;
	
	@RequestMapping("/asc")
	public List<User> asc(){
		//让框架生成 order by userId asc升序
		UserExample userExample=new UserExample();//打上断点测试
		userExample.setOrderByClause("user_id asc");//打上断点测试
		//然后得到这个集合,调用userMapper
		List<User> list=userMapper.
				selectByExample(userExample);
		return list;
	}
}

然后找到main主类,DeBUG AS执行测试:
在这里插入图片描述

2.3 改为降序排序
@RestController
public class TestController {
   //控制层直接调用数据库
	//从spring的ioc容器中取UserMapper接口的代理类的对象
	@Autowired
	UserMapper userMapper;
	
	@RequestMapping("/desc")
	public List<User> desc(){
		//让框架生成 order by userId desc降序
		UserExample userExample=new UserExample();//打上断点测试
		userExample.setOrderByClause("user_id desc");//打上断点测试
		//然后得到这个集合,调用userMapper
		List<User> list=userMapper.
				selectByExample(userExample);
		return list;
	}
}

然后找到main主类,DeBUG AS执行测试:
在这里插入图片描述



2.4 生成wehe查询条件
package com.tedu.project_jt;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.tedu.project_jt.mapper.UserMapper;
import com.tedu.project_jt.pojo.User;
import com.tedu.project_jt.pojo.UserExample;

@RestController
public class TestController {
   //控制层直接调用数据库
	//从spring的ioc容器中取UserMapper接口的代理类的对象
	@Autowired
	UserMapper userMapper;
	
	@RequestMapping("/login")
	//localhost:8080/login?username=admin&password=admin
	public User login(String username,String password) {
		//生成where username=admin and password=admin
		//需要criteria,criteria是exmaple中的内部类
		UserExample userExample=new UserExample();//打上断点
		//内部内写法: 类名.内部类的类名
		//or():这个方法返回的是criteria内部类对象
		UserExample.Criteria criteria=userExample.or();
		//生成 username=admin
		criteria.andUsernameEqualTo(username);
		//生成 password=password
		criteria.andPasswordEqualTo(password);
		//使用List存储接收查询的结果
		List<User> list=userMapper.selectByExample(userExample);
		//返回查询的结果:
		return list.get(0);
	}
}

然后找到main主类,DeBUG AS执行测试:
http://localhost:8080/login?username=drqf&password=999999
注意:传入的username和password的内容是你user表的内容,查询不到会报错。
在这里插入图片描述

2.5 添加
package com.tedu.project_jt.controller;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.tedu.project_jt.mapper.UserMapper;
import com.tedu.project_jt.pojo.User;
import com.tedu.project_jt.pojo.UserExample;

@RestController
public class TestController {
   //控制层直接调用数据库
	//从spring的ioc容器中取UserMapper接口的代理类的对象
	@Autowired
	UserMapper userMapper;
	
	//添加
	@RequestMapping("/insert")
	//  /insert?username=CSND&password=666666
	public Integer insert(String username,String password) {
		//创建对象
		User user=new User();
		user.setUsername(username);
		user.setPassword(password);
		//不用设置userI,会自动设置
		//把对象传给mybatis框架,框架生成insert语句
		int count=userMapper.insert(user);
		return count;//添加的行数 >=1 添加成功
	}
}

然后找到main主类,DeBUG AS执行测试:
添加一条记录CSND,666666
http://localhost:8080/insert?username=CSND&password=666666
在这里插入图片描述

2.6 修改
package com.tedu.project_jt.controller;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.tedu.project_jt.mapper.UserMapper;
import com.tedu.project_jt.pojo.User;
import com.tedu.project_jt.pojo.UserExample;

@RestController
public class TestController {
   //控制层直接调用数据库
	//从spring的ioc容器中取UserMapper接口的代理类的对象
	@Autowired
	UserMapper userMapper;
	
	//2.6 修改
	@RequestMapping("/undate")
	public Integer update(Integer userId,  //打上断点
			              String username,
		                  String password) { 
		//创建对象
		User user=new User();
		user.setUserId(userId);
		user.setUsername(username);
		user.setPassword(password);
		//调用userMapper接口的updateByPrimaryKey()
		//updateByPrimaryKey 主键
		int count=userMapper.updateByPrimaryKey(user);
		return count;
	}
}

然后找到main主类,DeBUG AS执行测试:
修改id为3的记录
http://localhost:8080/update?userId=3&username=qf&password=666
在这里插入图片描述

2.7 删除
package com.tedu.project_jt.controller;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.tedu.project_jt.mapper.UserMapper;
import com.tedu.project_jt.pojo.User;
import com.tedu.project_jt.pojo.UserExample;

@RestController
public class TestController {
   //控制层直接调用数据库
	//从spring的ioc容器中取UserMapper接口的代理类的对象
	@Autowired
	UserMapper userMapper;
	
	
	//2.7 删除
	@RequestMapping("/delete")
		//localhost:8080/delete?userId=4
		//console 生成的sql,sqlyog看user_id=4
		public Integer delete(Integer userId) {  //打上断点
			Integer count=userMapper.deleteByPrimaryKey(userId);
			return count;
		}
}

然后找到main主类,DeBUG AS执行测试:
删除id为4的记录
localhost:8080/delete?userId=4
在这里插入图片描述

2.8 修改密码
package com.tedu.project_jt.controller;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.tedu.project_jt.mapper.UserMapper;
import com.tedu.project_jt.pojo.User;
import com.tedu.project_jt.pojo.UserExample;

@RestController
public class TestController {
   //控制层直接调用数据库
	//从spring的ioc容器中取UserMapper接口的代理类的对象
	@Autowired
	UserMapper userMapper;
		
    //2.8 修改密码
	@RequestMapping("/changePassword")
	public Integer changePassword(
			       String oldUsername,
			       String oldPassword,
			       String newPassword
			       ) {
		//创建where,创建userExample,criteria
		UserExample userExample=new UserExample();//打上断点测试
		UserExample.Criteria criteria=userExample.or();
		criteria.andUsernameEqualTo(oldUsername);
		criteria.andPasswordEqualTo(oldPassword);
		//创建对象
		User user=new User();
		user.setPassword(newPassword);
		int count=userMapper.updateByExample(user, userExample);
		//console看一下生成的sql,sqlyog username的值是什么?
		return count;
	}	
}

然后找到main主类,DeBUG AS执行测试:
http://localhost:8080/changePassword?oldUsername=admin&oldPassword=456789&newPassword=888
我们可以发现报错了?为什么?

在这里插入图片描述

对代码进行修改:

  //2.8 修改密码
	@RequestMapping("/changePassword")
	//localhost:8080/changePassword?oldUsername=admin&oldPassword=456789&newPassword=888
	public Integer changePassword(
			       String oldUsername,  //用户名
			       String oldPassword,  //旧密码
			       String newPassword  //设置新密码
			       ) {
		//创建where,创建userExample,criteria
		UserExample userExample=new UserExample();//打上断点测试
		UserExample.Criteria criteria=userExample.or();
		criteria.andUsernameEqualTo(oldUsername);
		criteria.andPasswordEqualTo(oldPassword);
		//创建对象
		User user=new User();
		user.setPassword(newPassword);
		
		//update set user_id= ,username=
		//user中只有password
		//int count=userMapper.updateByExample(user, userExample);
		
		//如果user对象中属性的值不为null,才会出现在set
		//set password = where
		int count=userMapper.updateByExampleSelective(user, userExample);
		//console看一下生成的sql,sqlyog username的值是什么?
		return count;
	}	
}

然后找到main主类,DeBUG AS执行测试:
http://localhost:8080/changePassword?oldUsername=admin&oldPassword=456789&newPassword=888
在这里插入图片描述



小结

Mybatis是一个数据库框架
封装了连接,sql的执行,结果集转换
generator项目为每张表生成了
Mapper.java,
Mapper.xml,
User,
UserExample
1)
insert
​ .insert(user) insert into (所有列)
​ .insertSelective insert into (值不为空的列)

2)
select
​.selectByPrimaryKey where user_id=1
.selectByExample where 多个列

3)
update
​.updateByPrimaryKey
.updateByPrimaryKeySelective
​.updateByExample
.updateByExampleSelective

4)
delete
​.deleteByPrimaryKey
​.deleteByExamle

商城select查询:商品/删除订单/修改/增加

使用步骤
1,使用generater项目生成.xml,接口,pojo,example
2,创建springboot项目,依赖web,mybatis,mysql driver
3,配置application.yml,配置数据库信息,xml的位置,log
4,Applicatoin 添置@mapperScan(“mapper包名”),mybatis框加会为包下的每个接口创建代理对象。
5,Controller通过autowired从spring容器中取对象
6,对象有insert(),delete(),update(),查询用example,criteria

三、列映射

关联关系

Mybatis表现关联关系只有两种association(一对一)、collection(一对多),表现很简洁。
注意:关联出的结果集不能有同名字段,否则mybatis无法正确映射。
如果同名,Mybatis会自动第一次出现的值再次放到对象的属性中,这样业务逻辑就将错误。

3 手写xml.接口,实体类

步骤:
下载DbDemp
链接:https://pan.baidu.com/s/1Ot80TBYaoSVVJItPzq1vHg
提取码:npla

3.1 找到dbDemo.拷贝到工作区,直接解压,修改文件夹名为mybatis03.修改pom.xml中的artifactld和name, eclispe --> import --> maven
3.2.修改文件样式

在这里插入图片描述

3.3 在主包下创建.mapper .pojo .controller

com.tedu.dbdemo
.mapper
.pojo
.controller
DbDemoApplication
在这里插入图片描述

3.4 在pojo包中创建Usen.java 在mapper创建 接口UserMapper.java

1)创建Usen表
在这里插入图片描述

package com.tedu.DbDemo.pojo;
//实体类对应user表,类名和表名一样
public class User {
	//对应的是表中的userId列
	Integer userId;
	//对应的是表中的username列
	String username;
	//对应的是表中的userpassword列
	String userpassword;
	//必须添加get() set()
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getUserpassword() {
		return userpassword;
	}
	public void setUserpassword(String userpassword) {
		this.userpassword = userpassword;
	}
}
2)创建UserMapper接口类

在这里插入图片描述

package com.tedu.DbDemo.mapper;

import java.util.List;

import com.tedu.DbDemo.pojo.User;

//接口是用来操作user表
//map映射hashMap中通过key找value
//把表中一行映射成一个对象
public interface UserMapper {
   //查询
	public List<User> select1();
	 //查询user_id
	public List<User> select2();
}

3.5 在mapper包中创建UserMapper.xml拷贝

在这里插入图片描述


打开UserMapper 选中类名右键Cop…

在这里插入图片描述

然后把包名+类名粘贴进去

在这里插入图片描述

打开User类 把包名和类名粘贴进去

在这里插入图片描述

<?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">
<!-- namespace=接口的包名.接口名 -->
<mapper 
namespace="com.tedu.DbDemo.mapper.UserMapper">

<resultMap type="com.tedu.DbDemo.pojo.User" 
id="map1">
	<result column="user_id" property="userId"/>
	<result column="username" property="username"/>
	<result column="password" property="userpassword"/>
</resultMap>
<!-- 
select resultType要求列名和类中的属性名一样
select resultMap 结果集映射由map1负责,功能强大些,
列名与属性名不一样也能转换
 -->
<select id="select2" resultMap="map1">
	select user_id,username,password from user
</select>
<!-- 
@autowired 取UserMapper接口的代理类的代理对象userMapper
执行userMapper.select1(),mybatis框架得到的包名.接口名
得到方法名。从xml中找到sql
执行得到结果集,遍历结果集,取出每一行
把一行转成resultTyle指定的类型User
把user对象放在list中
List<User> select1()
 -->
<select id="select1" 
resultType="com.tedu.DbDemo.pojo.User">
	select username,password from user
</select>
</mapper>


3.6 拷贝application.yml
server:
  port: 8080

spring:     
    datasource:        
        driver-class-name: com.mysql.cj.jdbc.Driver        
        url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
        username: root        
        password: root
    
mybatis:
  mapperLocations: classpath:com.tedu.DbDemo.mapper/*.xml

logging:
  path: ./logs
  level: 
    com.tedu.DbDemo.mapper: debug

在这里插入图片描述


3.7 在入口DbDemoApplication类中添加@mapperScan()
package com.tedu.DbDemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
//mybatis框架会自动为mapper包下的接口创建代理对象//controlelr autowired才能取到对象
@MapperScan("com.tedu.DbDemo.mapper")
public class DbDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DbDemoApplication.class, args);
	}
}

单表查询

结果集列名与属性名一致,不用写resultmap

需求

SELECT user_id,username,PASSWORD FROM user
在这里插入图片描述

3.8 在controller包中new一个TestController.java类
package com.tedu.DbDemo.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.tedu.DbDemo.mapper.UserMapper;
import com.tedu.DbDemo.pojo.User;

@RestController
public class TestController {
   //从spring框架的ioc容器中得到UserMapper接口的代理对象
	@Autowired
	UserMapper userMapper;
	
	@RequestMapping("/select1")
	public List<User> select1(){
		List<User> list=userMapper.select1();
		return list;
	}
	
	@RequestMapping("/select2")
	public List<User> select2(){
		List<User> list=userMapper.select2();
		return list;
	}
}

打开之主类 Run As运行测试:
http://localhost:8080/select2
在这里插入图片描述



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值