目录
一:使⽤MyBatis完成CRUD
准备工作
(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
<?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>mybatis-002-crud</groupId>
<artifactId>com.bjpowernode</artifactId>
<version>1.0-SNAPSHOT</version>
<!--出现1.5的警报,就加上这两句话-->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--打包方式jar-->
<packaging>jar</packaging>
<!--引入依赖-->
<dependencies>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.23</version>
</dependency>
<!--加入单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--引入logback的依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
1. Mybatis完成insert使用Map集合传参
(1)什么是CRUD,C: Create增、R: Retrieve查(检索)、U: Update改、D: Delete删
(2)原先使用的insert语句是写死到配置文件中的,这个在实际开发中是不存在的。一定是前端的form表单提交过来数据,然后将值传给sql语句
<?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="first">
<insert id="insertCar">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
values(null,'1003','丰田',30.0,'2000-10-11','燃油车');
</insert>
</mapper>
(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<String, Object> 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语句
<?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="first">
<insert id="insertCar">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
</insert>
</mapper>
2. Mybatis完成insert使用PoJo传参
(1)除了使用Map集合给SQL语句的占位符传值,使用一个PoJo类(普通的java类)也可以
Pojo类
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}
<?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="first">
<insert id="insertCar">
insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
<!--对应get方法所得到的参数-->
values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
</insert>
</mapper>
3. MyBatis完成delete删除操作
(1)编写删除的Sql语句
注意:如果占位符只有一个,那么#{}的大括号里可以随意,但是最好见名知意。
<?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="first">
<!--通过id删除-->
<delete id="deleteById">
<!--变量名随便写-->
delete from t_car where id = #{id};
</delete>
</mapper>
(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();
}
}
4. MyBatis完成update更新操作
(1)通过id修改某条记录
注:使用PoJo进行数据的封装,和插入数据很相似,插入数据id我们传null,因为它会自动生成;对于更新操作,我们需要传入id,然后根据id进行数据的整体覆盖
(2)编写更新的Sql语句
<?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">
<!--通过id更新-->
<update id="updateById">
update t_car set
car_num = #{carNum},
brand = #{brand},
guide_price = #{guidePrice},
produce_time = #{produceTime},
car_type = #{carType}
where
id = #{id};
</update>
</mapper>
(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();
}
}
5. MyBatis完成select查一个
(1)注意:select标签中有一个resultType属性,这个属性用来告诉mybatis,查询结果集封装成什么类型的java对象。
resultType通常写的是:全限定类名,带上包名。
<?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="first">
<!--通过id查询,一个结果-->
<select id="selectById" resultType="com.powernode.mybatis.pojo.Car">
select * from t_car where id = #{id};
</select>
</mapper>
(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 instanceof Car); // true,返回的就是Car类型
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语句;全都正常赋值!
注意:后期我们还可以在mybatis-config.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="first">
<!--通过id查询,一个结果-->
<select id="selectById" resultType="com.powernode.mybatis.pojo.Car">
select
id,
car_num as carNum,
brand,
guide_price as guidePrice,
produce_time as produceTime,
car_type as carType
from
t_car
where
id = #{id}
</select>
</mapper>
6. Mybatis完成select查所有
(1)编写sql语句,查询所有就不需要传id了
注意:resultType还是指定要封装的结果集的类型,不是指定List类型,是指定List集合中元素的类型;mybatis通过selectList这个方法就可以得知你需要一个List集合;它会自动给你返回一个List集合!
<?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="first">
<!--查询所有-->
<select id="selectAll" resultType="com.powernode.mybatis.pojo.Car">
select
id,
car_num as carNum,
brand,
guide_price as guidePrice,
produce_time as produceTime,
car_type as carType
from
t_car
</select>
</mapper>
(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<Object> list = sqlSession.selectList("selectAll");
// 遍历输出
for (Object car:list) {
System.out.println(car);
}
}
}
7. SQL Mapper映射文件的namespace
(1)在XxxMapper.xml文件当中有一个namespace属性,这个属性是用来指定命名空间的。用来防止id重复!
(2)怎么用?例如:有两个CarMapper.xml和UserMapper.xml文件中含有相同类型的insert语句,并且语句含有相同的id,并且这两个文件都被引用到核心文件mybatis-config.xml文件中;我们编写测试程序通过id获取返回结果就会出错!(3)所以我们可以加上namespace属性,防止id重复冲突;所以以后正确的语法应该是:namespace.id,例如:
// first是namespace属性的值,selectAll是查询语句的id
List<Object> cars = sqlSession.selectList("first.selectAll");
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128412.html