目录
1 、mybatis的补充知识
1.1 、参数取值特殊说明
// 案例:根据id查询部门信息
@Test
public void testFindDeptById(){
SqlSession sqlSession=sqlSessionFactory.openSession();
DeptMapper deptMapper=sqlSession.getMapper(DeptMapper.class);
int id=100;
Dept dept=deptMapper.findDeptById(id);
System.out.println(dept);
sqlSession.close();
}
<!-- 1.形参和实参 参数传递的是值 和名称无关
2.resultMap 的简化 当开启驼峰映射规则时,可以自动映射,则使用resultType 即可
3.如果mybatis传递的参数只有一个,则mybatis是利用下标取值,所以名称可以任意取名#{xxx}
注意开发注意规范
-->
<select id="findDeptById" resultType="com.jt.pojo.Dept">
select * from dept where dept_id=#{id}
</select>
1.2 、代理对象的说明
JDK动态代理
特点:
要求被代理者必须实现(有)接口,代理对象是目标对象的实现类或兄弟元素。
JDK代理是jdk默认提供的
CGLIB动态代理
特点:
不管我们的被代理者是否有接口,我们都可以为其创建代理对象,代理对象是目标对象的子类。
cglib需要手动导jar包
spring为了创建对象方便处理对象自身,自身自动添加cglib依赖
对象创建说明:
关于对象创建说明: DeptMapper是一个接口 接口不能直接实例化对象 获取的deptMapper是jdk在内部动态为接口生成的代理对象 调用代理对象功能上与接口一致
2 、三大框架整合
2.1 、框架概述
2.1.1 、Spring框架:
Spring为了团队开发将复杂的框架进行整合,使得程序从控制到调用浑然一体,以一种统一的方式进行调用。
核心:整合第三方框架
2.1.2 、核心机制:IOC-DI AOP
IOC:控制反转 将对象创建的权利交给Spring容器管理,由Spring容器管理对象的生命周期.
DI:依赖注入 创建对象时,如果该对象中有需要依赖的属性,Spring负责对属性赋值.
@RestController
public class UserController{
@Autowired
private Uservice uservice;
}
AOP:面向切面编程
2.1.3 、SpringMVC
说明:该框架的主要作用 接受用户的请求 之后完成相应的业务处理 最终返回响应给用户
2.2 、项目整合
2.2.1 、创建项目
2.2.2 、编辑pom.xml文件(添加依赖包)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入插件lombok 自动的set/get/构造方法插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mybatis依赖包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--jdbc依赖包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--支持热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.2.4 、创建pojo对象:
package com.jt.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain=true)
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private Integer id;
private String name;
private Integer age;
private String sex;
}
2.2.5 、Mapper接口:
package com.jt.mapper;
import com.jt.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
//该接口应该交给spring容器管理
@Mapper
public interface UserMapper {
//查询表中所有数据
List<User> findAll();
}
2.2.6 、xml映射文件:
<?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">
<!--xml映射文件 必须与接口一对一绑定
namespace:指定需要绑定的接口名称,不能重复。-->
<mapper namespace="com.jt.mapper.UserMapper">
<select id="findAll" resultType="com.jt.pojo.User">
select * from demo_user
</select>
</mapper>
2.2.7 、service接口和实现类:
接口:
package com.jt.service;
import com.jt.pojo.User;
import java.util.List;
public interface UserService {
//查询表中所有数据
List<User> findAll();
}
实现类:
package com.jt.service;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.List;
@Service//交给spring容器处理
public class UserServiceImpl implements UserService{
//定义属性
@Autowired
private UserMapper userMapper;//代理对象 jdk 动态代理
@Override
public List<User> findAll() {
//List<User> userList=userMapper.findAll();
//return userList;
return userMapper.findAll();
}
}
2.2.8 、Controller类:
package com.jt.controller;
import com.jt.pojo.User;
import com.jt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
//@Controller 将该类交给spring容器+
//@RestController 业务返回值时,将数据转化json
@RestController
public class UserController {
@Autowired
private UserService userService;
/*
* 需求:查询user表全部数据
* 请求类型:get/post/put/delete
* 路径:/findUser
* 参数:无
* 返回值:List<User>
* */
@RequestMapping("/getUser")
public List<User> findUser() {
return userService.findAll();
}
}
2.3 、编辑核心配置信息
#数据源配置连接大写法
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
serverTimezone=GMT%2B8 指定时区 东8区 %2B 是 + 的意思
&useUnicode=true &characterEncoding=utf8 开启使用Unicode编码 并且指定字符集 utf-8
&autoReconnect=true 断线 是否重新连接
&allowMultiQueries=true 是否允许批量操作
#整合mybatis
mybatis:
#指定别名包
type-aliases-package: com.jt.pojo
#加载指定的xml映射文件
mapper-locations: classpath:\mybatis\mappers\*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
spring 报错说明
在启动类里添加@mapperScan注解,根据包扫描 扫描全部的mapper文件
@MapperScan("com.jt.mapper")//根据包扫描 扫描全部的mapper文件
解决方案(绑定异常):
1.检查xml文件中的namespace;
2.检查xml文件里查询语句id的方法名;
3.检查yml文件中整合mybatis的加载xml映射文件的导入,以及是否存在没有顶格写,存在层级问题;
4.启动文件里的@MapperScan()注解的配置路径问题。
连接不上数据库问题(数据库连接异常):
解决方案:检查yml文件数据源的相关配置
3 、RestFul实现参数传递
3.1 、get方法
/*
* 需求:根据id查询用户数据
* URL:http://localhost:8088/findUserById?id=1
* 参数:id=1
* 返回值:User对象
* springMVC业务规范:接受参数时必须与用户的参数保持一致
*
* */
//@RequestMapping(value = "findUserById",method = RequestMethod.GET)//method=指定的类型
@GetMapping("findUserById")//只能接受get请求的类型
public User findUserById(Integer id){
return userService.findUserById(id);
}
UserServiceImpl 里有两个方法了得再重写一下
@Override
public User findUserById(Integer id) {
return userMapper.findUserById(id);
}
查询代码:
<select id="findUserById" resultType="User">
select * from demo_user where id=#{id}
</select>
执行后在浏览器容易得到不同的结果(更改?id=后面的参数值就可以得到不同的数据)
3.2 、作业
1.根据用户的name和age查询用户信息
@GetMapping("findUserByNA")
public User findUserByNA(User user){
return userService.findUserByNA(user);
}
<select id="findUserByNA" resultType="User">
select * from demo_user where name=#{name} and age=#{age}
</select>
查询结果:
2.查询名称以“xxx”结尾的数据
@GetMapping("findUserLike")
public User findUserLike(User user){
return userService.findUserLike(user);
}
<select id="findUserLike" resultType="User">
select * from demo_user where name like concat('%',#{name},'%')
</select>
查询结果:
3.查询id为1,3,5,6,7的数据
@GetMapping("findUserByIds")
public List<User> findUserByIds(Integer[] id){
return userService.findUserByIds(id);
}
<select id="findUserByIds" resultType="User">
select * from demo_user where id in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
查询结果:
4.根据对象中不为null的元素查询数据 动态Sql查询
//根据对象中不为null的元素查询数据 动态Sql查询
//URL: http://localhost:8090/findUser?id=xx&name=“xx”&age=xx&sex=xx
//URL: http://localhost:8090/findUser?age=xx&sex=xx
//URL: http://localhost:8090/findUser?sex=xx
@GetMapping("findUser")
public List<User> findUser(User user){
return userService.findUser(user);
}
<!-- 4动态通过name,age,sex,id来查询用户的所有信息 -->
<select id="findUser" resultType="User" >
select * from demo_user
<where>
<if test="id!=null">id=#{id}</if>
<if test="name!=null"> and name=#{name}</if>
<if test="age!=null">and age=#{age}</if>
<if test="sex!=null">and sex=#{sex}</if>
</where>
</select>
查询结果:
5.更新操作 利用restFul的结构, 根据Id修改数据,修改name/age
//更新操作 利用restFul的结构, 根据Id修改数据,修改name/age
//URL:http://localhost:8090/user/貂蝉/18/227
//解析: URL:http://localhost:8090/user/{name}/{age}/{id}
@GetMapping("/updateUser/{id}/{name}/{age}")
public Integer updateUser(
@PathVariable Integer id,
@PathVariable String name,
@PathVariable Integer age){
User user=new User();
user.setId(id).setName(name).setAge(age);
return userService.updateUser(user);
}
<!--5.更新操作 利用restFul的结构, 根据Id修改数据,修改name/age-->
<update id="updateUser">
update demo_user
<set>
<if test="name !=null">name = #{name},</if>
<if test="age !=null">age = #{age}</if>
</set>
where
id = #{id}
</update>
查询结果:
4 、Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
概括: Servlet是java后台程序与用户交互的机制(媒介).
//http://localhost:8090/findUserByIds?id=1,3,5,6,7
@GetMapping("/findUserByIds")
public String findUserByIds(HttpServletRequest request){
String id = request.getParameter("id");
String[] idStr = id.split(",");
Integer[] intArray = new Integer[idStr.length];
for (int i=0;i<idStr.length;i++){
intArray[i] = Integer.parseInt(idStr[i]);
}
System.out.println(intArray);
return "参数接收成功!!!";
}
/**
* Servlet参数传递核心规则
* http://localhost:8090/findServlet?name="张三"
* 问题: String name 值从哪里来????
* 核心: 参数是取的 而不是传的
* 请求的流程: 一个request对象,返回response
* 注意事项:
* 1.参数名称必须相同.
* 2.弊端无论什么样的数据,都是String数据类型,需要手动的转化
* SpringMVC:
* 在内部封装了Servlet机制.并且可以根据用户的参数类型,实现自动的数据
* 类型的转化
*/
@GetMapping("/findServlet")
public String findServlet(Integer age){
return "获取数据:"+age;
}
/*@GetMapping("/findServlet")
public String findServlet(HttpServletRequest request){
String age = request.getParameter("age");
Integer ageInt = Integer.parseInt(age);
return "获取数据:"+age;
}*/