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的代码是怎么写的?17Stringsql="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语句的占位符:17Map<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语句的占位符传值:18Carcar=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语句写成这个德行:18insertintot_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应特别注意:21select标签中的resulttype属性用于告诉mybatis,查询结果集包装成什么类型的java对象。你需要告诉mybatis。
resulttype通常写:全限定类名。
Car{id=1,carNum='null',brand="宝马520Li",guidePrice=null,produceTime='null',carType='null'}
输出结果有点错:
Id和brand属性有值。
其它属性是null。
5.2carnum等属性没有赋值的原因是什么?21select*fromt_carwhereid=1
执行结果:
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.testtestNamespacepublic 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.pojoCarpackage 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.utilsSqlsessionutillillilililsionsionpackage 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.testCarMapperTestpackage 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();}}