目录
一:使⽤MyBatis完成CRUD
1. Mybatis完成insert使用Map集合传参
2. Mybatis完成insert使用PoJo传参
3. MyBatis完成delete删除操作
4. MyBatis完成update更新操作
5. MyBatis完成select查一个
6. Mybatis完成select查所有
7. SQL Mapper映射文件的namespace
准备工作
(1)创建module(Maven的普通Java模块)
(2)配置pom.xml
①打包⽅式jar
②引入依赖:mybatis依赖、mysql驱动依赖、junit依赖、logback依赖
(3)mybatis-config.xml放在类的根路径下
(4)CarMapper.xml放在类的根路径下
(5)logback.xml放在类的根路径下
(6)提供com.bjpowernode.mybatis.utils.SqlSessionUtil⼯具类
(7)创建测试⽤例:com.powernode.mybatis.CarMapperTest
4.0.0
mybatis-002-crud
com.bjpowernode
1.0-SNAPSHOT
1.8
1.8
jar
org.mybatis
mybatis
3.5.10
mysql
mysql-connector-java
5.1.23
junit
junit
4.12
test
ch.qos.logback
logback-classic
1.2.11
test
(1)什么是CRUD,C: Create增、R: Retrieve查(检索)、U: Update改、D: Delete删
(2)原先使用的insert语句是写死到配置文件中的,这个在实际开发中是不存在的。一定是前端的form表单提交过来数据,然后将值传给sql语句
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
values(null,'1003','丰田',30.0,'2000-10-11','燃油车');
(3)在JDBC当中占位符采用的是?,在mybatis当中是#{}; #{} 和 JDBC当中的?是等效的。并且这个#{}里面传的值,是Map集合的key,如果key不存在,获取的是null!
(4)测试类
package com.bjpowernode.mybatis.test;
import com.powernode.mybatis.utils.SqlSessionUtils;
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.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.mybatis.test
* @Project:mybatis
* @name:CarMapperTest
* @Date:2022/12/28 21:53
*/
public class CarMapperTest {
@Test
public void testInsertCarByUtil(){
SqlSession sqlSession = SqlSessionUtils.openSession();
// Map集合的数据
Map map = new HashMap<>();
map.put("carNum","1111");
map.put("brand","比亚迪汉");
map.put("guidePrice",10.0);
map.put("produceTime","2022-11-11");
map.put("carType","电车");
// insert方法:一个参数是id,另一个参数是一个map集合
int count = sqlSession.insert("insertCar",map);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
}
(5)sql语句
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
(1)除了使用Map集合给SQL语句的占位符传值,使用一个PoJo类(普通的java类)也可以
package com.powernode.mybatis.pojo;
/**
* @Author:朗朗乾坤
* @Package:com.powernode.mybatis.pojo
* @Project:mybatis
* @name:Car
* @Date:2022/12/29 19:09
* 封装汽车相关信息的pojo类,普通的java类
*/
public class Car {
// 数据库表中的字段应该和pojo类的属性一一对应
private Long id;
private String carNum;
private String brand;
private Double guidePrice;
private String produceTime;
private String carType;
// 构造方法
public Car() {
}
public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {
this.id = id;
this.carNum = carNum;
this.brand = brand;
this.guidePrice = guidePrice;
this.produceTime = produceTime;
this.carType = carType;
}
// setter and getter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCarNum() {
return carNum;
}
public void setCarNum(String carNum) {
this.carNum = carNum;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Double getGuidePrice() {
return guidePrice;
}
public void setGuidePrice(Double guidePrice) {
this.guidePrice = guidePrice;
}
public String getProduceTime() {
return produceTime;
}
public void setProduceTime(String produceTime) {
this.produceTime = produceTime;
}
public String getCarType() {
return carType;
}
public void setCarType(String carType) {
this.carType = carType;
}
// toString方法
@Override
public String toString() {
return "Car{" +
"id=" + id +
", carNum='" + carNum + '\'' +
", brand='" + brand + '\'' +
", guidePrice=" + guidePrice +
", produceTime='" + produceTime + '\'' +
", carType='" + carType + '\'' +
'}';
}
}
(2)编写测试类,直接传一个我们封装好的PoJo类进去
package com.bjpowernode.mybatis.test;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtils;
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.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.mybatis.test
* @Project:mybatis
* @name:CarMapperTest
* @Date:2022/12/28 21:53
*/
public class CarMapperTest {
public void testInsertCarByPojo(){
SqlSession sqlSession = SqlSessionUtils.openSession();
// 使用Pojo类封装
Car car = new Car(null,"333","比亚迪森",30.0,"2020-11-11","新能源");
// 执行sql
int count = sqlSession.insert("insertCar", car);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
}
(3)Map集合的方式给Sql语句传值传的是Map集合的key,那么使用PoJo类的方式怎么传值呢?传的值是getXxx()方法的方法名去掉get,然后将剩下的单词首字母小写xxx,然后放进去。例如:getUsername() --> #{username}
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
(1)编写删除的Sql语句
注意:如果占位符只有一个,那么#{}的大括号里可以随意,但是最好见名知意。
delete from t_car where id = #{id};
(2)编写测试方法,进行测试
package com.bjpowernode.mybatis.test;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtils;
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.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.mybatis.test
* @Project:mybatis
* @name:CarMapperTest
* @Date:2022/12/28 21:53
*/
public class CarMapperTest {
@Test
public void testDeleteById(){
SqlSession sqlSession = SqlSessionUtils.openSession();
// 执行sql,一个参数是id,另一个参数是要删除的id
int count = sqlSession.delete("deleteById", 10);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
}
(1)通过id修改某条记录
注:使用PoJo进行数据的封装,和插入数据很相似,插入数据id我们传null,因为它会自动生成;对于更新操作,我们需要传入id,然后根据id进行数据的整体覆盖
(2)编写更新的Sql语句
update t_car set
car_num = #{carNum},
brand = #{brand},
guide_price = #{guidePrice},
produce_time = #{produceTime},
car_type = #{carType}
where
id = #{id};
(3)编写测试方法,进行测试
package com.bjpowernode.mybatis.test;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtils;
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.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.mybatis.test
* @Project:mybatis
* @name:CarMapperTest
* @Date:2022/12/28 21:53
*/
public class CarMapperTest {
// 更新、修改
@Test
public void updateById(){
SqlSession sqlSession = SqlSessionUtils.openSession();
// 执行sql,根据传的id进行数据的覆盖修改
Car car = new Car(4L,"9999","凯美瑞",30.3,"1999-11-10","燃油车");
int count = sqlSession.update("updateById", car);
System.out.println(count);
sqlSession.commit();
sqlSession.close();
}
}
(1)注意:select标签中有一个resultType属性,这个属性用来告诉mybatis,查询结果集封装成什么类型的java对象。你需要告诉mybatis。
resultType通常写的是:全限定类名,带上包名。
(2)测试代码的编写,得到的结果实际上会自动进行封装;前面resultType属性已经指定了类型是Car,所以返回的类型实际上也是一个Car类型
package com.bjpowernode.mybatis.test;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtils;
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.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.mybatis.test
* @Project:mybatis
* @name:CarMapperTest
* @Date:2022/12/28 21:53
*/
public class CarMapperTest {
// 查询一个
@Test
public void selectById(){
SqlSession sqlSession = SqlSessionUtils.openSession();
// 执行sql,这里会自动进行数据的封装
// 前面已经指定了类型是Car,多一返回的类型实际上也是一个Car类型
Object car = sqlSession.selectOne("selectById", 1);
System.out.println(car);
// DQL语句,不需要提交
sqlSession.close();
}
}
(3)注意:经过测试发现一个奇怪的现象,只有id和brand字段有值,其它字段都为null;因为数据中的其它字段car_num、guide_price、produce_time、car_type与封装的Car类carNum、guidePrice、produceTime、carType字段对应不上,所以没有赋值上!
(4)怎么解决?使用as关键字起一个对应的别名即可,重新编写sql语句;全都正常赋值!
(1)编写sql语句,查询所有就不需要传id了
注意:resultType还是指定要封装的结果集的类型,不是指定List类型,是指定List集合中元素的类型。mybatis通过selectList这个方法就可以得知你需要一个List集合;它会自动给你返回一个List集合!
(2)查所有返回的就不是一个单纯的对象了,调用selectList方法返回的是一个List集合;所以遍历打印这个集合即可
package com.bjpowernode.mybatis.test;
import com.powernode.mybatis.pojo.Car;
import com.powernode.mybatis.utils.SqlSessionUtils;
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.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author:朗朗乾坤
* @Package:com.bjpowernode.mybatis.test
* @Project:mybatis
* @name:CarMapperTest
* @Date:2022/12/28 21:53
*/
public class CarMapperTest {
// 查询所有
@Test
public void selectAll(){
SqlSession sqlSession = SqlSessionUtils.openSession();
// 执行sql,返回的是一个List集合
List
(1)在XxxMapper.xml文件当中有一个namespace属性,这个属性是用来指定命名空间的。用来防止id重复!
(2)怎么用?例如:有两个CarMapper.xml和UserMapper.xml文件中含有相同类型的insert语句,并且语句含有相同的id,并且这两个文件都被引用到核心文件mbatis-config.xml文件中;我们编写测试程序通过id获取返回结果就会出错!(3)所以我们可以加上namespace属性,防止id重复冲突;所以以后正确的语法应该是:namespace.id,例如:
// first是namespace属性的值,selectAll是查询语句的id
List