当前位置: 首页 > 图灵资讯 > 技术篇> 使用mybatis完成CRUD

使用mybatis完成CRUD

来源:图灵教育
时间:2023-05-31 09:20:42

1.CRUD17是什么?

C:Create增加

R:Retrieve检索(检索)

U:Update改变

D:删除Delete

2.insert17

<insert id="insertCar">

insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)

values(null,丰田霸道,30.0,2000-10-11,‘燃油车’;

</insert>

这样写的问题是17.1

值显然是写死到配置文件中的。

这种情况在实际开发中并不存在。

前端form表单必须提交数据。然后将值传输到sql语句。

2.2例如:JDBC的代码是怎么写的?17

Stringsql="insertintot_car(id,car_num,brand,guide_price,produce_time,car_type)values(null,?,?,?,?,?)";

ps.setString(1,xxx);

ps.setString(2,yyy);

...

2.3在JDBC中使用的占位符是什么?在mybatis中?17

等效写法为:#{}

不能在mybatis中使用占位符,必须使用#{}代替JDBC中的占位符

{}等效于JDBC。

2.3.在1java程序中使用Map可以传输SQL语句的占位符:17

Map<String, Object> map = new HashMap<>();

map.put("k1", "1111");

map.put("k2", “比亚迪汉”);

map.put("k3", 10.0);

map.put("k4", "2020-11-11");

map.put("k5", "电车");

insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values(null,#{k1},#{k2},#{k3},#{k4},#{k5};

注意:#{这里写什么?写map集合的key,如果key不存在,获得null}

一般map集合的key在命名时都要见名知意。

map.put("carNum","1111");

map.put("brand“比亚迪汉2”);

map.put("guidePrice",10.0);

map.put("produceTime","2020-11-11");

map.put("carType","电车";

insertintot_car(id,car_num,brand,guide_price,produce_time,car_type)values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});

2.3.POJO类在2java程序中用于SQL语句的占位符传值:18

Carcar=newCar(null,“3333”、“比亚迪秦”、“2020-11-11”、“新能源”);

注:占位符#{},大括号中写着:pojo属性名

insertintot_car(id,car_num,brand,guide_price,produce_time,car_type)

values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})

2.3.2.1把SQL语句写成这个德行:18

insertintot_car(id,car_num,brand,guide_price,produce_time,car_type)

values(null,#{xyz},#{brand},#{guidePrice},#{produceTime},#{carType})

出了什么问题?

Thereisnogetterforpropertynamed'xyz'in'classcom.powernode.mybatis.pojo.Car'

mybatis去找:car类getxyz()方法去了。没找到。报错了。

2.3.2.1.1.如何解决?18.

可在Car类中提供getXyz()方法。这样问题就解决了。

通过这次测试,得出结论:

严格来说:如果使用POJO对象传递值,#{}这个大括号到底写了什么?

写的是去掉get方法的方法名,然后把剩下的单词首字母小写,然后放进去。

例如:getUsername()-->#{username}

例如:getEmail()-->#{email}

...

也就是说,mybatis在底层传值时,首先要获得值,如何获得值?

调用pojo对象的get方法。例如:car.getCarNum(),car.getCarType(),car.getBrand()

3.delete19

●需求:根据id删除数据:

删除id=14的数据。

实现:

int count = sqlSession.delete("deleteById", 14);

<delete id="deleteById">

delete from t_car where id = #{fdsfd}

</delete>

注:如果只有一个占位符,那么#{}的大括号可以随意使用。但最好知名。

4.update20

●●要求:根据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>

Car car = new Car(4L, "9999", “凯美瑞”, 30.3, "1999-11-10", "燃油车";

int count = sqlSession.update("updateById", car);

5.select(查一个,如果按主键查询,返回结果必须是一个。)21

●●要求:根据id查询。

实现:

<select id="selectById" resultType="com.powernode.mybatis.pojo.Car">

select * from t_car where id = #{id}

</select>

Object car = sqlSession.selectOne("selectById", 1);

5.1应特别注意:21

select标签中的resulttype属性用于告诉mybatis,查询结果集包装成什么类型的java对象。你需要告诉mybatis。

resulttype通常写:全限定类名。

Car{id=1,carNum='null',brand="宝马520Li",guidePrice=null,produceTime='null',carType='null'}

输出结果有点错:

Id和brand属性有值。

其它属性是null。

5.2carnum等属性没有赋值的原因是什么?21

select*fromt_carwhereid=1

执行结果:

使用mybatis完成CRUD_mybatis

car_num、guide_price、produce_time、car_type这是查询结果的列名。

这些列名与Car类中的属性名不匹配。

Car类属性名:

carNum、guidePrice、produceTime、carType

5.2.如何解决这个问题?

查询select语句时,查询结果集的列名可以用as关键词来命名。

<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>

起别名后:

+----+--------+-----------+------------+-------------+---------+

|id|carNum|brand|guidePrice|produceTime|carType|

+----+--------+-----------+------------+-------------+---------+

|1001|宝马520Li|10.00|2020-10-11|燃油车|

+----+--------+-----------+------------+-------------+---------+

6.select(查所有)22

<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>

List<Object> cars = sqlSession.selectList("selectAll");

注:resulttype或指定要包装的结果集类型。它不是指定List类型,而是指定List集中元素的类型。

selectlist方法:mybatis可以通过这种方法知道你需要一个list集合。它会自动给你一个list集合。

7.namespace23

在sql mapper.xml文件中有一个namespace,用于指定命名空间。用于防止id重复。

怎么用?

xml文件:

<mapper namespace="aaaaaaaaa">

<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

from

t_car

</select>

</mapper>

java程序中的写法:

List<Object> cars = sqlSession.selectList("aaaaaaaaa.selectAll");

事实上,本质上,mybatis中sqlid的完整写法:namespace.id

核心文件mybatis-config.xml

<mapper resource="UserMapper.xml"/>

commmain代码.powernode.mybatis.testtestNamespace

public class CarMapperTest {//研究namespace  这个属性是用来指定命名空间的。用于防止id重复。@Testpublic void testNamespace(){SqlSession sqlSession = SqlSessionUtil.openSession();//List<Object> cars = sqlSession.selectList("selectAll");// 正确完整的写作方法:namespace.idList<Object> cars = sqlSession.selectList("aaaaaa.selectAll");cars.forEach(car-> System.out.println(car));sqlSession.close();}}

usermaperesorces目录.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="aaaaaa">  <!--namespace用于指定命名空间。用于防止id重复。--><!--查询所有数据  20--><select id="selectAll" resultType="com.powernode.mybatis.pojo.Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_typefromt_car</select></mapper>

8.CRUD代码

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.powernode</groupId><artifactId>course4</artifactId><version>1.0-SNAPSHOT</version><!--    jar的包装方式--><packaging>jar</packaging><!--    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>8.0.30</version></dependency><!--            junit单元测试依赖于   13--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!--        引入logback的依赖,这个入职框架实现了slf4j标准化--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version></dependency></dependencies><properties><!--    jdk版本用于编译代码--><maven.compiler.source>1.8</maven.compiler.source><!--    使用jdk版本的操作程序--><maven.compiler.target>1.8</maven.compiler.target></properties></project>

commmain代码.powernode.mybatis.pojoCar

package com.powernode.mybatis.pojo;///这是一个与封装汽车相关的javabean  18public class Car {// 数据库表中的字段应与pojo属性一一对应。// 建议使用包装类,以防止null问题。private Long id;private String carNum;private String brand;private Double guidePrice;private String produceTime;private String carType;@Overridepublic String toString() {return "Car{" +"id=" + id +", carNum='" + carNum + '\'' +", brand='" + brand + '\'' +", guidePrice=" + guidePrice +", produceTime='" + produceTime + '\'' +", carType='" + carType + '\'' +'}';}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getCarNum() {return carNum;}/*public String getXyz() {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;}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;}public Car() {}}

com.powernode.mybatis.utilsSqlsessionutillillilililsionsion

package com.powernode.mybatis.utils;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 java.io.IOException;////mybatis工具类  16public class SqlSessionUtil {// 工具的结构方法一般都是私有化的。// 工具类的所有方法都是静态的,可以直接用类名调用。// 工具类的所有方法都是静态的,可以直接用类名调用。不需要new对象。// 结构方法私有化,以防止new对象。private SqlSessionUtil(){}private static SqlSessionFactory sqlSessionFactory;// 类加载时执行//// 第一次加载SqlSesionutil工具类时,分析mybatisis-config.xml文件。创建SqlSessionFactory对象。static {try {sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));} catch (IOException e) {throw new RuntimeException(e);}}/*public static SqlSession openSession(){SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// SqlSessionFactory对象:SqlSessionFactory对应于environment,environment通常是一个数据库。SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));SqlSession sqlSession = sqlSessionFactory.openSession();return sqlSession;}*//*** 获取会话对象。* @return 会话对象*//public static SqlSession openSession(){return sqlSessionFactory.openSession();}}

resources目录mybatistis的核心文件-config.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/powernode"/><property name="username" value="root"/><property name="password" value="lzl"/></dataSource></environment></environments><mappers><!--Xxxmapper执行.xml文件的路径     8--><!--Xxxmapper执行.xml文件的路径     8--><!--resource属性自动从类的根路径下开始寻找资源。--><mapper resource="CarMapper.xml"/><mapper resource="UserMapper.xml"/></mappers></configuration>

logback日志文件.xml

<?xml version="1.0" encoding="UTF-8"?><configuration debug="false"><!--定义⽇志⽂零件的存储地址--><property name="LOG_HOME" value="/home"/><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:从左显示5个字符宽度%msg:⽇志消息,%n是换⾏符--><pattern>[%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!--mybatis log configure--><logger name="com.apache.ibatis" level="TRACE"/><logger name="java.sql.Connection" level="DEBUG"/><logger name="java.sql.Statement" level="DEBUG"/><logger name="java.sql.PreparedStatement" level="DEBUG"/><!-- ⽇志愿输出等级,logback⽇志级包括五个:TRACE < DEBUG < INFO < WARN < ERROR --><root level="DEBUG"><appender-ref ref="STDOUT"/><appender-ref ref="FILE"/></root></configuration>

CarMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="jkljkljkl"><!--insert语句,id是这个SQL语句的唯一标志。这个id代表了这个SQL语句。   17--><insert id="insertCar"><!--增加数据   18--><!--insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)values(null,#{k1},#{k2},#{k3},#{k4},#{k5};--><!--insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});--><!--增加数据  18-->insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});</insert><!--删除数据  19--><delete id="deleteById">delete from t_car where id = #{id}</delete><!--更改数据  20--><update id="updateById">update t_car setcar_num=#{carNum},brand=#{brand},guide_price=#{guidePrice},produce_time=#{produceTime},car_type=#{carType}whereid = #{id}</update><!--查询一个数据  20--><select id="selectById" resultType="com.powernode.mybatis.pojo.Car"><!--查询一个数据  20--><select id="selectById" resultType="com.powernode.mybatis.pojo.Car"><!--select * from t_car where id = #{id}--><!--因为javabean中的属性名与表中的字段名不一致,会导致一些查询结果为空,所以我们用as命名-->selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_carwhereid = #{id}</select><!--查询所有数据  20--><select id="selectAll" resultType="com.powernode.mybatis.pojo.Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_car</select></mapper>

commtest代码.powernode.mybatis.testCarMapperTest

package com.powernode.mybatis.test;import com.powernode.mybatis.pojo.Car;import com.powernode.mybatis.utils.SqlSessionUtil;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.util.HashMap;import java.util.List;import java.util.Map;///使用mybatis完成CRUDD  17public class CarMapperTest {//查询多个数据  22@Testpublic void testSelectAll(){SqlSession sqlSession = SqlSessionUtil.openSession();// 执行SQL语句////List cars = sqlSession.selectList("selectAll");List cars = sqlSession.selectList("selectAll");// lamda表达式carr// -> System.out.println(car)cars.forEach(car -> System.out.println(car));sqlSession.close();}///查询一个数据  21@Testpublic void testSelectById(){SqlSession sqlSession = SqlSessionUtil.openSession();// 执行DQL语句。查询。查询。根据id查询。返回结果必须是一个。// select语句在mybatis底层执行后,肯定会返回结果集对象:ResultSet// JDBC被称为Resultset,其次是mybatis应该从Resultset中取出数据,包装java对象。Object car = sqlSession.selectOne("selectById", 1);System.out.println(car);sqlSession.close();}///改变数据   20@Testpublic void testUpdateById(){SqlSession sqlSession = SqlSessionUtil.openSession();// 准备数据//这个4L代表Long类型的idlCar car = new Car(6L, "9999", “凯美瑞”, 30.3, "1999-11-10", "燃油车";// 执行SQL语句intt count = sqlSession.update("updateById",car);System.out.println(count);sqlSession.commit();sqlSession.close();}///删除数据   19@Testpublic void testDeleteById(){SqlSession sqlSession = SqlSessionUtil.openSession();// 执行SQL语句////int count = sqlSession.delete("deleteById", 14);int count = sqlSession.delete("deleteById", 30);System.out.println(count);sqlSession.commit();sqlSession.close();}///用pojo包装数据库18@Testpublic void testInsertCarByPOJO(){SqlSession sqlSession = SqlSessionUtil.openSession();Car/包装数据 car = new Car(null, "3333", “比亚迪秦”, 30.0, "2020-11-11", “新能源”);///执行sqlinttint count = sqlSession.insert("insertCar",car);System.out.println(受影响行数==~~+count);sqlSession.commit();sqlSession.close();}////将数据添加到数据库中   17@Testpublic void testInsertCar(){SqlSession sqlSession = SqlSessionUtil.openSession();// 数据从前端传输。// 我们首先使用Map集合来包装数据。Map map = new HashMap<>();/*map.put("k1", "1111");map.put("k2", “比亚迪汉”);map.put("k3", 10.0);map.put("k4", "2020-11-11");map.put("k5", "电车");*/map.put("carNum", "1111");map.put("brand", “比亚迪汉2”;map.put("guidePrice", 10.0);map.put("produceTime", "2020-11-11");map.put("carType", "电车");// 执行SQL语句//// insert方法的参数:/// 第一个参数:sqlId,从CarMapper开始.复制xml文件。// 第二个参数:包装数据的对象。// 第二个参数:包装数据的对象。int count = sqlSession.insert("insertCar",map);System.out.println(受影响行数==~~+count);sqlSession.commit();sqlSession.close();}}