cgb2104-day18
Posted cgblpx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cgb2104-day18相关的知识,希望对你有一定的参考价值。
一,Mybatis接口开发的练习
–1,需求:查询car表里的所有数据
–2,开发步骤:
准备表和数据
DROP TABLE IF EXISTS `car`;
CREATE TABLE `car` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(10) default NULL,
`color` varchar(10) default NULL,
`price` double default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `car` VALUES ('1', 'BMW', 'red', '9.9');
INSERT INTO `car` VALUES ('2', 'Audi', 'black', '0.3');
创建Car类
package cn.tedu.pojo;
//封装汽车表返回的数据 orm
public class Car {
private Integer id;
private String name;
private String color;
private Double price;
@Override
public String toString() {
return "Car{" +
"id=" + id +
", name='" + name + '\\'' +
", color='" + color + '\\'' +
", price=" + price +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
创建CarMapper接口
package cn.tedu.dao;
import cn.tedu.pojo.Car;
import java.util.List;
//用来操作car表的各种方法
public interface CarMapper {
List<Car> selectList();//查所有数据
}
创建CarMapper.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">
<!--mapper是映射文件的根标签 ,
namespace属性用来作为mapper文件的唯一标识
namespace属性的值是 接口的全路径
-->
<mapper namespace="cn.tedu.dao.CarMapper">
<!--select用来标记着这是一个查询的SQL语句
id属性是SQL的唯一标识
id属性的值是 接口里对应的方法名
resultType属性的值是 要把查询结果封装给哪个类的全路径
-->
<select id="selectList" resultType="cn.tedu.pojo.Car">
select * from car
</select>
</mapper>
修改mybatis-config.xml,加入映射文件
<!-- 用来引入映射文件 ,底层维护了MapperRegistry,用来存各种Mapper文件-->
<mappers>
<!--加入了一个新的映射文件-->
<mapper resource="CarMapper.xml"></mapper>
<mapper resource="UserMapper.xml"></mapper>
<mapper resource="DeptMapper.xml"></mapper>
</mappers>
创建测试类
package cn.tedu.mybatis;
import cn.tedu.dao.CarMapper;
import cn.tedu.pojo.Car;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestCar {
private SqlSessionFactory factory;
@BeforeEach //Junit5版本才支持的注解,Junit4版本用@Before
public void init() throws IOException {
//1,读取核心配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2,创建会话工厂
factory = new SqlSessionFactoryBuilder().build(in);
}
@Test
public void get(){
//开启会话
SqlSession session = factory.openSession();
//获取了指定的接口
CarMapper mapper = session.getMapper(CarMapper.class);
//调用接口里的方法
List<Car> list = mapper.selectList();
//遍历打印
for (Car c : list) {
System.out.println(c);
}
}
}
二,解析SQL的参数
–1,需求:查询id=1 的汽车数据
修改pom.xml,添加了mybatis的jar包
<!--添加mybatis的依赖-->
<dependencies>
<!--mybatis依赖包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!--jdbc依赖包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
</dependencies>
创建核心配置文件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">
<!--这个文件,是mybatis框架的核心配置文件,都配置了数据源,事务,映射文件-->
<configuration>
<environments default="test">
<!--配置数据源,事务-->
<environment id="test">
<!--配置了事务,使用jdbc提供的事务-->
<transactionManager type="JDBC"></transactionManager>
<!--配置了数据源,指定连接数据库的4个参数-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
创建Car类
package cn.tedu.pojo;
public class Car {
private Integer id;
private String name;
private String color;
private Double price;
@Override
public String toString() {
return "Car{" +
"id=" + id +
", name='" + name + '\\'' +
", color='" + color + '\\'' +
", price=" + price +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
创建CarMapper 接口
package cn.tedu.dao;
import cn.tedu.pojo.Car;
public interface CarMapper {
Car getById(Integer id);/**查询id=1的汽车数据*/
}
创建CarMapper.xml
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace的值是接口的全路径-->
<mapper namespace="cn.tedu.dao.CarMapper">
<!--id的值写接口中的方法的名字-->
<select id="getById" resultType="cn.tedu.pojo.Car">
select * from car
where id = ${id} /*获取用户传入的参数,固定语法::${要获取谁的值}*/
</select>
</mapper>
修改核心配置文件,引入mapper文件
<!--引入mapper文件-->
<mappers>
<mapper resource="CarMapper.xml"></mapper>
</mappers>
测试
package cn.tedu.test;
import cn.tedu.dao.CarMapper;
import cn.tedu.pojo.Car;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.net.CacheRequest;
public class Test1 {
private SqlSessionFactory factory;
//@BeforeEach在执行@Test前执行,以下两步代码重复出现,提取出来,提高代码的复用性
@BeforeEach
public void init() throws IOException {
//1,读取核心配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2,创建会话工厂
factory = new SqlSessionFactoryBuilder().build(in);
}
@Test
public void get(){
SqlSession session = factory.openSession();
CarMapper mapper = session.getMapper(CarMapper.class);
Car c = mapper.getById(1);
System.out.println(c);
}
}
总结
三,解析SQL参数的练习
–1,需求:按名字查汽车数据
修改映射文件
<!--按名字查-->
<select id="getByName" resultType="cn.tedu.pojo.Car">
select * from car where
name = #{name}
/*$和#都可以获取参数,但是 $不会拼接字符串不安全低效,#会自动拼接字符串而且高效安全避免了SQL攻击问题*/
</select>
修改接口文件
Car getByName(String name);/**查询name=bmw的汽车数据*/
修改测试文件
@Test
public void get(){
SqlSession session = factory.openSession();
CarMapper mapper = session.getMapper(CarMapper.class);
Car c = mapper.getById(2);//按照id查
System.out.println(c);
Car c2 = mapper.getByName("bmw");//按照name查
System.out.println(c2);
}
总结
四,动态SQL
–1,作用
让SQL更加灵活动态
–2,常见的标签
sql标签:用来提取SQL片段
include标签:引用指定的SQL片段
if 标签:用来做判断
where 标签:用来表示过滤条件
set 标签:用来在update语句中设置新的值
foreach 标签:用来完成循环结构
–3,普通标签测试
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace的值是接口的全路径-->
<mapper namespace="cn.tedu.dao.CarMapper">
<!--1. 动态SQL标签,用来提取共性的SQL-->
<sql id="columns">
id,name,color,price
</sql>
<!--id的值写接口中的方法的名字-->
<select id="getById" resultType="cn.tedu.pojo.Car">
select
/*2. 引用了指定的SQL片段*/
<include refid="columns"></include>
from car
where id = ${id}
/*获取用户传入的参数,固定语法::${要获取谁的值}*/
</select>
<!--按名字查-->
<select id="getByName" resultType="cn.tedu.pojo.Car">
select
<include refid="columns"></include>
from car
<where> /*4, where标签*/
/*3, if标签用来做判断,满足条件才执行SQL,test属性用来写判断条件*/
<if test="name != null">
name = #{name}
</if>
</where>
/*$和#都可以获取参数,但是 $不会拼接字符串不安全低效,#会自动拼接字符串而且高效安全避免了SQL攻击问题*/
</select>
</mapper>
–4,foreach 标签测试
1,需求:查询id为1或者2的car的数据
2,修改映射文件,添加新的SQL
<!--查询id为1或者2的car的数据-->
<select id="getByIds" resultType="cn.tedu.pojo.Car">
select * from car where id
in
/*获取数组里的数据,collection的值是固定值array
open是以啥开始 close是以啥结束 separator是以啥分隔 item是表示数组里的每个数据
*/
<foreach collection="array" open="(" close=")" separator="," item="i">
#{i}
</foreach>
</select>
3,修改接口文件,添加新方法
List<Car> getByIds(Integer[] ids);/*查询id为1或者2的car的数据*/
4,修改测试文件,调用新方法
package cn.tedu.test;
import cn.tedu.dao.CarMapper;
import cn.tedu.pojo.Car;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.net.CacheRequest;
import java.以上是关于cgb2104-day18的主要内容,如果未能解决你的问题,请参考以下文章