1、新建springboot项目
2、选择版本依赖
3、maven配置
4、yml文件配置
# YML文件的语法
# 1.数据结构 key-value结构
# 2.写法: key:(空格)value
# 3.层级代码结构,注意缩进 !!!!!
# 4.字符集 文件读取时,默认采用UTF-8编码 可以写中文
# 规则: 命名时最好指定前缀.
server:
port: 8080
mysql:
username: root
password: root
5、动态为属性赋值,编辑JDBCController
/**
* 说明:
* 1.将该类交给Spring容器管理
* 2.SpringMVC负责调用该对象接收用户的请求.
* 3.将业务处理之后的结果,为页面返回JSON数据.
* @ResponseBody作用: 将数据转化为JSON串
*/
@RestController
public class JDBCController {
//${key} Spring提供的springel表达式 简称为:spel表达式
//语法: 从spring容器内部获取key,动态为属性赋值.
@Value("${mysql.username}")
String username; // = "root|";
@Value("${mysql.password}")
String password; // = "root";
@RequestMapping("/getMsg")
public String getMsg(){
return "你好数据库:"+ username +password;
}
}
6、访问:http://localhost:8080/getMsg,浏览器页面显示
7、利用properties文件为属性赋值,编辑mysql.properties
#默认ISO-8859-1 中文必定乱码
mysql.username2=mysql数据库
mysql.password2=你猜猜
8、通过注解为属性赋值,可以指定字符集
/**
* 说明:
* 1.将该类交给Spring容器管理
* 2.SpringMVC负责调用该对象接收用户的请求.
* 3.将业务处理之后的结果,为页面返回JSON数据.
* @ResponseBody作用: 将数据转化为JSON串
*
* propertySource: value属性指定路径
* encoding属性指定配置文件编码格式
*/
@RestController
@PropertySource(value="classpath:/mysql.properties", encoding = "UTF-8")
public class JDBCController {
//${key} Spring提供的springel表达式 简称为:spel表达式
//语法: 从spring容器内部获取key,动态为属性赋值.
@Value("${mysql.username}")
String username; // = "root|";
@Value("${mysql.password}")
String password; // = "root";
@RequestMapping("/getMsg")
public String getMsg(){
return "你好数据库:"+ username +password;
}
/**
* 难点: 如何将pro文件交给Spring容器管理????
* 解决方案: @PropertySource("xxxxxx/xxx.properties") 指定配置文件交给Spring容器管理
*/
@Value("${mysql.username2}")
private String username2;
@Value("${mysql.password2}")
private String password2;
@RequestMapping("/getMsg2")
public String getMsg2(){
return "你好数据库:"+ username2 +password2;
}
}
9、访问:http://localhost:8080/getMsg2,浏览器页面显示
10、springboot高级用法,创建springboot项目
模板,maven
11、编辑pom.xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jt</groupId>
<artifactId>springboot_demo2</artifactId>
<version>1.0-SNAPSHOT</version>
<!--只需要复制 除了坐标之外的文件即可-->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.4.1</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<mainClass>com.jt.SpringbootDemo1Application</mainClass>
</configuration>
<!--排除一些指定的配置-->
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
12、yml配置文件
开发 dev: 8080端口 生产 prod: 9000端口
#指定环境的默认配置
spring:
profiles:
active: dev
---
#为环境定义名称
server:
port: 8080
spring:
config:
activate:
on-profile: dev
# 采用---的方式实现环境分割
---
server:
port: 9000
spring:
config:
activate:
on-profile: prod
13、热部署
在开发阶段,需要频繁的修改配置文件/代码
需求:要求将代码保存之后,程序自动的编译,并且完成tomcat服务的重启
个别IDEA版本可能不生效
<!--支持热部署 开发阶段有效-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
14、创建pojo,DemoUser
/**
* 实体对象要求:
* 1.类名一般与表名关联
* 2.属性名称一般与字段关联
* 3.pojo中的属性类型必须为引用类型(包装类型)
* 4.实体对象必须有get/set方法
* 5.一般实体对象需要实现序列化接口(规则)
* 原因: 数据可能跨平台(跨服务器)传输,必须序列化
*/
public class DemoUser implements Serializable {
private Integer id;
private String name;
private Integer age;
private String sex;
}
15、lombok依赖
lombok可以为POJO实体对象,动态的生成get/set/toString/hashcode/equals等方法,无需程序员手动编辑
<!--引入插件lombok 自动的set/get/构造方法插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
16、采用注解
@Data //动态生成get/set/toString/equals等方法
@Accessors(chain = true) //开启链式加载 重写set方法
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
public class DemoUser implements Serializable {
private Integer id;
private String name;
private Integer age;
private String sex;
//方法测试
public void add(){
DemoUser user = new DemoUser();
user.setId(100).setName("aaaa").setAge(18).setSex("女");
}
}
17、Mybatis依赖
<!--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>
18、编辑DemoUser
@Data //动态生成get/set/toString/equals等方法
@Accessors(chain = true) //开启链式加载 重写set方法
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
public class DemoUser implements Serializable {
private Integer id;
private String name;
private Integer age;
private String sex;
}
19、编辑mybatis-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心配置文件-->
<configuration>
<!--环境配置标签 default 默认加载的环境 只能写一个 -->
<environments default="development">
<!--编辑开发环境 id是环境唯一标识符 -->
<environment id="development">
<!--事物管理器 利用jdbc控制事务 -->
<transactionManager type="JDBC"/>
<!--mybatis采用数据库链接池的方式整合数据源 -->
<dataSource type="POOLED">
<!--高版本数据库驱动 需要添加cj-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--Mybatis加载Mapper映射文件-->
<mappers>
<mapper resource="mybatis/mappers/UserMapper.xml"/>
</mappers>
</configuration>
20、构建DemoUserMapper接口
/**
* 说明:
* 1.根据面向接口开发的思想需要定义一个Mapper接口
* 2.在接口中可以写接口方法, 谁用谁去实现!!!
*/
public interface DemoUserMapper {
//1.查询所有的表数据
public List<DemoUser> findAll();
}
21、编辑DemoUserMapper.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.DemoUserMapper">
<!--实现接口中的方法
id: 需要与接口中的方法绑定. 一般复制粘贴
resultType: 对象的包路径.
规则: sql语句不要添加多余的;号 Oracle数据库不能添加;号
-->
<select id="findAll" resultType="com.jt.pojo.DemoUser">
select id,name,age,sex from demo_user
</select>
<!-- <insert id=""></insert>
<update id=""></update>
<delete id=""></delete>-->
</mapper>
22、编辑测试类TestMybatis,测试mybatis实现数据库查询
/**
* 业务说明: 实现mybatis入门案例
* 步骤:
* 1.动态生成SqlSessionFactory
*/
@Test
public void demo1() throws IOException {
//指定配置文件地址
String resource = "mybatis-config.xml";
//通过IO流 加载指定的配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//动态生成SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession 类比 数据库链接
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取Mapper接口
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
//获取数据
List<DemoUser> userList = demoUserMapper.findAll();
System.out.println(userList);
//关闭链接
sqlSession.close();
}
23、查询结果
24、编辑DemoUserMapper,根据ID查询数据
DemoUser findOne(int id);
25、编辑DemoUserMapper.xml映射文件
<!--
parameterType: 参数类型
mybatis中通过 #{} 获取参数
resultType: 返回值结果对象
-->
<select id="findOne" parameterType="int" resultType="com.jt.pojo.DemoUser">
select * from demo_user where id = #{id}
</select>
26、编辑测试类TestMybatis测试
/***
* 需求: 根据ID查询数据库记录 id=1的数据
*/
@Test
public void testFindOne() throws IOException {
//指定配置文件地址
String resource = "mybatis-config.xml";
//通过IO流 加载指定的配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//动态生成SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取接口
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
int id = 1;
DemoUser demoUser = demoUserMapper.findOne(id);
System.out.println(demoUser);
//关闭链接
sqlSession.close();
}
27、测试结果
28、@BeforeEach
该注解的作用是在执行@Test方法前调用,是测试方法提供的测试API
编辑TestMybatis2
public class TestMybatis2 {
//定义公共的属性
private SqlSessionFactory sqlSessionFactory;
/**
* mybatis的核心 SqlSessionFacotry对象
* @BeforeEach: 测试API中的注解 在执行@Test注解方法时,会提前执行!!!
*/
@BeforeEach
public void init() throws IOException {
//1.指定资源文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testMybatis01(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
List<DemoUser> list = demoUserMapper.findAll();
System.out.println(list);
sqlSession.close();
}
}
29、运行结果
30、根据名称查询,编辑TestMybatis2
/**
* 作业:
* 1. 查询name="王昭君"的用户
*/
@Test
public void testFindByName(){
//保证每个线程都能获取一个链接
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
String name = "王昭君";
//如果不能保证结果唯一,则使用List集合接收数据.
List<DemoUser> list = demoUserMapper.findByName(name);
System.out.println(list);
sqlSession.close();
}
31、编辑DemoUserMapper.xml
<!--说明: parameterType其中的类型程序可以根据参数自动判断,所以可以省略不写
根据名称,动态取值 使用#{}关键字
-->
<select id="findByName" resultType="com.jt.pojo.DemoUser">
select * from demo_user where name = #{name}
</select>
32、编辑DemoUserMapper
List<DemoUser> findByName(String name);
33、运行结果
34、编辑TestMybatis2,mybatis中参数封装
/**
* 需求 :2. 查询sex=女 and age > 18岁
* 条件 2个
*/
@Test
public void testFindBySA(){
//保证每个线程都能获取一个链接
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
//编程习惯: 面向对象
DemoUser user = new DemoUser();
user.setAge(18).setSex("女");
List<DemoUser> list = demoUserMapper.findBySA(user);
System.out.println(list);
sqlSession.close();
}
35、编辑DemoUserMapper
List<DemoUser> findBySA(DemoUser user);
36、编辑DemoUserMapper.xml
<!--
查询sex=女 and age > 18岁
参数: DemoUser user 意图:传递属性的
规则: 如果传递的参数是对象,则通过#{属性} 可以直接获取数据.
-->
<select id="findBySA" resultType="com.jt.pojo.DemoUser">
select * from demo_user where sex= #{sex} and age > #{age}
</select>
37、运行结果
38、编辑TestMybatis2,参数封装的3种常见情景
/**
* 需求 :2. 查询sex=女 and age > 18岁
* 方式1: User对象封装
*/
@Test
public void testFindBySA(){
//保证每个线程都能获取一个链接
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
//编程习惯: 面向对象
DemoUser user = new DemoUser();
user.setAge(18).setSex("女");
List<DemoUser> list = demoUserMapper.findBySA(user);
System.out.println(list);
sqlSession.close();
}
/**
* sex=女 and age > 18
* 方式2: @Param方式封装.
*/
@Test
public void testFindBySA2(){
//保证每个线程都能获取一个链接
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
String sex = "女";
int age = 18;
List<DemoUser> list = demoUserMapper.findBySA2(sex,age);
System.out.println(list);
sqlSession.close();
}
/**
* sex=女 and age > 18
* 方式3: map集合封装
*/
@Test
public void testFindBySA3(){
//保证每个线程都能获取一个链接
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("sex","女");
map.put("age",18);
List<DemoUser> list = demoUserMapper.findBySA3(map);
System.out.println(list);
sqlSession.close();
}
39、编辑DemoUserMapper.xml
<!--
查询sex=女 and age > 18岁
参数: DemoUser user 意图:传递属性的
规则: 如果传递的参数是对象,则通过#{属性} 可以直接获取数据.
-->
<select id="findBySA" resultType="com.jt.pojo.DemoUser">
select * from demo_user where sex= #{sex} and age > #{age}
</select>
<!--
如果参数被@Param("sex") String sex修饰
则#{参数key}即可获取数据
-->
<select id="findBySA2" resultType="com.jt.pojo.DemoUser">
select * from demo_user where sex= #{sex} and age > #{age}
</select>
<!--
Map<String, Object> map
sex=女 age=18
规则: 如果参数是一个map集合,则通过#{key}获取数据.
-->
<select id="findBySA3" resultType="com.jt.pojo.DemoUser">
select * from demo_user where sex= #{sex} and age > #{age}
</select>
40、编辑DemoUserMapper
List<DemoUser> findBySA(DemoUser user);
List<DemoUser> findBySA2(@Param("sex") String sex, @Param("age") Integer age);
List<DemoUser> findBySA3(Map map);
41、编辑TestMybatis2,Mybatis常规CURD操作,新增操作
/**
* 需求: 实现用户入库操作
* 关于事务说明:
* mybatis中的"更新"操作,默认事务都是开启的,如果进行更新操作,
* 则必须提交事务.
*/
@Test
public void testSaveUser(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
//数据库主键自增,所以对象的ID可以为null.
DemoUser user = new DemoUser(null,"宁荣荣",26,"女");
int rows = demoUserMapper.saveUser(user);
if(rows > 0){
System.out.println("影响的行数:"+rows);
//事务提交
sqlSession.commit();
}
sqlSession.close();
}
42、编辑DemoUserMapper
int saveUser(DemoUser user);
43、编辑DemoUserMapper.xml
<!--
需求: 需要返回影响的行数.
mybatis执行"更新"操作时,自动的返回影响的行数
-->
<insert id="saveUser">
insert into demo_user value (null,#{name},#{age},#{sex})
</insert>
44、运行结果
45、查看数据库
46、Mybatis中的转义字符
xml文件中的转义字符.
> > 大于
< < 小于
& & 号
说明:如果sql中有大量的转义字符 建议使用转义标签体
语法: <![CDATA[ xxx内容 报文 ]]>
47、编辑TestMybatis2,查询age> 18 and age< 100 的用户信息
/**
* 需求: 查询age> 18 and age< 100 的用户信息.
* 规则: 如果不能使用对象封装,则一般使用Map集合
*/
@Test
public void testSelect01(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("minAge",18);
map.put("maxAge",100);
List<DemoUser> userList = demoUserMapper.findByAge(map);
System.out.println(userList);
sqlSession.close();
}
48、编辑DemoUserMapper
List<DemoUser> findByAge(Map<String,Object> map);
49、编辑DemoUserMapper.xml
<select id="findByAge" resultType="com.jt.pojo.DemoUser">
<!--select * from demo_user where age > #{minAge} and age < #{maxAge}-->
<![CDATA[ select * from demo_user where age > #{minAge} and age < #{maxAge}]]>
</select>
50、运行结果
51、编辑TestMybatis2,Mybatis集合用法,批量删除
/**
* 例如: 删除id=232/233/234的数据?
* Sql: delete from demo_user where id in (232,233,234)
* 规则: 如果遇到相同的多个数据,则一般采用集合的方式封装数据.
* 封装方式:
* 1. array
* 2. list
* 3. map<List>
*/
@Test
public void testDeleteIds(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
//将数据封装为数组
int[] ids = {232,233,234};
demoUserMapper.deleteIds(ids);
System.out.println("删除操作成功!!!");
}
52、编辑DemoUserMapper
void deleteIds(int[] ids);
53、编辑DemoUserMapper.xml
<!--
需求: 批量删除多个数据
难点: 如果使用#{集合}获取的是集合对象的整体.删除无效.
思路: 将数组拆分为单个数据. 可以通过遍历的方式操作
语法: mybatis为了参数取值方便,特意封装了遍历的标签 foreach
关于标签参数说明:
<foreach collection=""></foreach>
1.如果传递的参数是数组, 则collection="array"
2.如果传递的参数是list集合, 则collection="list"
3.如果传递的参数是Map集合, 则collection="map中的key"
标签属性说明:
1.collection 集合的名称
2.item 每次遍历的数据的形参变量
3.open 循环的开始标签
4.close 循环的结束标签
5.index 循环遍历下标 一般不用
6.separator 循环遍历的分割符
-->
<delete id="deleteIds">
delete from demo_user where id in (
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</delete>
54、编辑TestMybatis2,Mybatis集合用法,练习list/map的用法
@Test
public void testDeleteList(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
List list = new ArrayList();
list.add(232);
list.add(233);
list.add(234);
demoUserMapper.deleteList(list);
System.out.println("删除操作成功!!!");
}
/*
* 说明: 有时业务需求导致需要使用map封装list集合
*/
@Test
public void testDeleteMap(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
List list = new ArrayList();
list.add(232);
list.add(233);
list.add(234);
HashMap map = new HashMap();
map.put("ids",list);
demoUserMapper.deleteMap(map);
System.out.println("删除操作成功!!!");
}
55、编辑DemoUserMapper
void deleteList(List list);
void deleteMap(HashMap map);
56、编辑DemoUserMapper.xml
<!--删除List集合中的数据-->
<delete id="deleteList">
delete from demo_user where id in (
<foreach collection="list" item="id" separator=",">
#{id}
</foreach>
)
</delete>
<!--删除List集合中的数据 如何是map,则写map中的key-->
<delete id="deleteMap">
delete from demo_user where id in (
<foreach collection="ids" item="id" separator=",">
#{id}
</foreach>
)
</delete>
57、编辑TestMybatis2,模糊查询
/*
Mybatis作业:
需求: 查询name中包含"王"的数据.并且按照年龄降序排列
*/
@Test
public void findLike(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
String name = "%王%";
List<DemoUser> list = demoUserMapper.findLike(name);
System.out.println(list);
sqlSession.close();
}
58、编辑DemoUserMapper.xml
<!--关于模糊查询的说明: 使用%号需要使用""号包裹.
注意事项: mybatis中的sql 最好小写. 因为不同的系统对于大小写 不敏感.
键位: eclipse ctrl + shift + y 小写
ctrl + shift + u 大写/小写
-->
<select id="findLike" resultType="com.jt.pojo.DemoUser">
<!--select * from demo_user where name like "%"#{name}"%" order by age desc -->
select * from demo_user where name like #{name} order by age desc
</select>
59、编辑DemoUserMapper
List<DemoUser> findLike(String name);
60、运行结果
61、编辑TestMybatis2,批量更新操作
/**
* 作业2: 将name为貂蝉/黄月英/宁荣荣的年龄改为28岁,性别女
*/
@Test
public void updateUser(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
Map<String,Object> map = new HashMap<>();
String[] array = {"貂蝉","黄月英","宁荣荣"};
map.put("names",array);
map.put("age",28);
map.put("sex","女");
demoUserMapper.updateUser(map);
sqlSession.close();
}
62、编辑DemoUserMapper.xml
<!--批量更新操作-->
<update id="updateUser">
update demo_user set age = #{age}, sex = #{sex}
where name in (
<foreach collection="names" item="name" separator=",">
#{name}
</foreach>
)
</update>
63、编辑DemoUserMapper
void updateUser(Map<String,Object> map);
64、编辑mybatis-config.xml,Mybatis简化
<!--核心配置文件-->
<configuration>
<!--配置别名-->
<typeAliases>
<typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>
</typeAliases>
65、编辑DemoUserMapper.xml,可以使用简化写法,代替类型的全路径
<mapper namespace="com.jt.mapper.DemoUserMapper">
<!--实现接口中的方法
id: 需要与接口中的方法绑定. 一般复制粘贴
resultType: 对象的包路径.
规则: sql语句不要添加多余的;号 Oracle数据库不能添加;号
-->
<!--
<select id="findAll" resultType="com.jt.pojo.DemoUser">-->
<select id="findAll" resultType="DemoUser">
select id,name,age,sex from demo_user
</select>
66、编辑mybatis-config.xml,如果有多个pojo,可以这样配置
<!--核心配置文件-->
<configuration>
<!-- 配置别名 -->
<typeAliases>
<!--别名标签只对某个类有效.-->
<!--<typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>-->
<!--package 指定的是包路径的信息.-->
<package name="com.jt.pojo"/>
</typeAliases>
67、编辑DemoUserMapper.xml
<mapper namespace="com.jt.mapper.DemoUserMapper">
<!--映射原理:
如果配置文件中定义了包路径,则映射对象时会自动的完成路径的拼接
resultType="com.jt.pojo.DemoUser"
-->
<select id="findAll" resultType="DemoUser">
select id,name,age,sex from demo_user
</select>
68、编辑DemoUser,注意新增注解
@Data //动态生成get/set/toString/equals等方法
@Accessors(chain = true) //开启链式加载 重写set方法
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
@Alias("DemoUser")
public class DemoUser implements Serializable {
private Integer id;
private String name;
private Integer age;
private String sex;
}
69、Mybatis简化,sql重复,可以使用sql标签
1. select id,name,age,sex from demo_user where id = 1
2. select id,name,age,sex from demo_user where name = xxx
70、用法
<!--2.简化Sql标签 -->
<sql id="demo_user_sql">
select id,name,age,sex from demo_user
</sql>
<!--include 代表包含Sql标签 -->
<select id="findAll" resultType="DemoUser">
<include refid="demo_user_sql"/>
</select>
71、sql标签的说明
优势:
1.使用Sql标签可以节省xml的文件大小.
2.代码的结构相对简单.
弊端:
1.Sql只能抽取公共的Sql语句,局限性稍大.
2.如果大量的使用Sql标签,则代码的可读性差
72、编辑TestMybatis2,Mybatis,动态sql
IF-WHERE用法
/**
* 封装DemoUser的对象,根据对象中不为null的属性查询
*/
@Test
public void testFindWhere(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
DemoUser demoUser = new DemoUser();
demoUser.setAge(3000);
List<DemoUser> list = demoUserMapper.findWhere(demoUser);
System.out.println(list);
sqlSession.close();
}
73、编辑DemoUserMapper.xml
<!--动态Sql案例
思路: 如果数据不为null,mybatis才会当做条件
if标签说明:
test: 判断的条件 直接写属性即可
where标签: 去除条件中多余的 and 或者 or的
说明: if和 where 几乎一起出现.
-->
<select id="findWhere" resultType="DemoUser">
select id,name,age,sex from demo_user
<where>
<if test="name != null">name = #{name}</if>
<if test="age !=null"> and age=#{age}</if>
<if test="sex !=null"> and sex=#{sex}</if>
</where>
</select>
74、编辑DemoUserMapper
List<DemoUser> findWhere(DemoUser demoUser);
75、运行结果
76、编辑TestMybatis2,动态Sql-SET标签
/**
* 需求: 根据Id,动态的实现数据的更新.
*/
@Test
public void testUpdateSet(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
DemoUser user = new DemoUser();
user.setId(1).setName("守山大使");
demoUserMapper.updateUser2(user);
sqlSession.close();
}
77、编辑DemoUserMapper