复习
一、使用mybatis的流程
- 创建springboot项目,添加mybatis,mysql,web
- 生成或者手写sql,sql是放在UserMapper.xml,是通过UserMapper.java接口,gernerator项目不是必须的。
- UserMapper.selectByExample()
- UserMaper.xml 有一个Select id=selectByExample
- mybatis框架会自动为UserMapper接口生成代理类$proxy50,代理类会数据库,找到UserMapper.xml中的sql执行,把resultSet转成list
- @autowired
- UserMapper userMapper userMapper是代理类的对象
- list userMapper.selectByExample()
- 配置application.yml,配置数据库信息,mapperLocation,Log
- 配置入口类
@MapperScan("mapper")必须加在入口类上
Application
- 错误:
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