- mybatis依靠
- mysql驱动依靠
- junit依靠
- logback依靠
上述内容,为什么放在类的根路径下(resources) 就是为了提高项目的可移植性。具体内容,大家可以移步至:✏️✏️✏️ 初始MyBatis ,具体步骤运行第一个MyBatis程序,同时对应步骤MyBatis底层分析-CSDN博客
- mybatis-config.xml放在类的根路径下
- CarMapper.xml放在类的根路径下
- logback.xml放在类的根路径下
- 提供com.powernode.mybatis.utils.SqlSessionUtil工具类
- 创建测试用例:com.powernode.mybatis.CarMapperTest
值,显然是写死到配置文件当中了SQL语句中的值不应该写死,值应该是用户提供的。之前的JDBC代码是这样写的:
这个实际开发中是不存在的
肯定是前端 form 表单提交过来数据,然后将值传给 sql 语句
在JDBC当中占位符采用的是?,在mybatis当中是什么呢?在MyBatis 中,的Java程序中,将数据放到Map集合中在mybatis当中不能使用 ? 占位符,必须使用 #{ } 来代替JDBC当中的 ?复制代码
- 和?等效的写法是: #{}
#{ } 和JDBC当中的 ? 是等效的。
添加/插入,执行 sqlSession.insert("Id", car); 方法
复制代码
- // 执行sql语句
- // insert方法的参数:
- // 第一个参数:sqlId;从CarMapper.xml 文件中复制,的对于是insert SQL 语句的 id 信息
- // 第二个参数: 封装数据的对象,这里为 Map 集合
- int count = sqlSession.insert("insertCar", map);
java 程序中使用POJO类给SQL语句的占位符传值:运行测试:
// 封装数据
Car car = new Car(null, "333", "比亚迪泰", 30.0, "2020-11-11", "新能源");
留意:占位符#{ }, 大括号内里写:pojo类的属性名
insert into t_car(id,car_num,bread,guider_prive,produce_time,car_type)
values(null,#{xyz},#{brand},#{guiderPrice},#{produceTime},#{carType})
There is no getter for property named 'xyz' in 'class com.rainbowsea.mybatis.pojo.Car'怎么解决的?
mybatis 去找,Car类中的getXyz()方法去了,没找到,报错了。
通过这个测试,得出一个结论:经过测试得出结论:
严格意义上来说,如果使用POJO对象通报值的话,#{}这个大括号中i给你到底写什么?
写的是对应的属性的 get方法的方法名去掉 get,然后将剩下的单词字母小写,然后放进去。
例如:getUsername() ---> #{username}
例如: getEmail() ---> #{email}
也就是说MyBatis在底层,传值的时候,先要获取值,怎么获取的?
调用了pojo对象的get方法,例如:car.getCarNum(); car.getCarType(), car.getBreand() 方法
留意:实在传参数的时候有一个属性 parameterType,这个属性用来指定传参的数据类型,不外这个属性是可以省略的
Java程序执行,删除操作,用sqlSession.delete("Id", 值) 方法,删除记录
Java程序执行,修改/更新数据操作,用sqlSession.update("Id", 值) 方法,修改记录
这里我们查询的是一条记录,用 sqlSession.selectOne("id") 方法,返回一个 映射对象。
报错信息:Error querying database. Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'rainbowsea.selectById'. It's likely that neither a Result Type nor a Result Map was specified.以上的异常大致的意思是:对于一个查询语句来说,你需要指定它的“结果类型”或者“结果映射”。
需要特别留意的是:
select 标签中给的resultType属性,这个属性用来告诉mybatis,查询结果封装什么类型的Java对象
resultType通常写的是:全限定类名
通过观察发现:只有 id 和 brand 是同等的,其他字段名和属性名对应不上,这就是导致null的原因了?我们可以在sql语句中使用 as 关键字来给查询结果列名起别名的方式,让它们两者保持同等的关系。
这里,因为我们查询的是多条记录,用 sqlSession.selectList("id") 方法,返回一个 List 集合,存储着我们的查询结果集。
如果是返回的是键值对 的话,我们还可以用 sqlSession.selectMap("id") 方法 返回的是一个 Map 集合
Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'UserMapper.xml'. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for rainbowsea.selectAll. please check CarMapper.xml and UserMapper.xml这里我们修改一下 UserMapper.xml 文件当中的 namespace = "rainbowsea2" 定名空间的值。
【翻译】selectCarAll在Mapped Statements集合中不明确(请实验使用包含名称空间的全名,或重定名其中一个条目)
【大致意思是】selectCarAll重名了,你要么在selectCarAll前添加一个名称空间,要有你改个其它名字。
实际上,本质上,mybatis中的 sqlId 的完备写法: namespace.id ,留意,之后都这么写了,这是完备正确的写法。5. 总结:
6. 末了:
- 在sql语句中使用 #{map集合的key} 来完成传值,#{} 等同于JDBC中的 ? ,#{}就是占位符。
- 在mybatis当中不能使用 ? 占位符,必须使用 #{ } 来代替JDBC当中的 ?
#{ } 和JDBC当中的 ? 是等效的。
- { } 不可以空着,就算是只有一个传值,也不可以空着,随便写,都不可以空着。
- pojo 对象的数据表 ORM 映射的 类对象,肯定要提供对应的 set 和 get 方法,不然 ,MyBatis 无法通过反射机制获取到相应所需要的信息的。 留意:占位符#{ }, 大括号内里写:pojo类的属性名
- 如果采用POJO传参,#{} 里写的是get方法的方法名去掉get之后将剩下的单词首字母变小写(例如:getAge对应的是#{age},getUserName对应的是#{userName}),如果这样的get方法不存在会报错。
- 留意:实在传参数的时候有一个属性 parameterType,这个属性用来指定传参的数据类型,不外这个属性是可以省略的
- 添加/插入,执行 sqlSession.insert("Id", car); 方法
- Java程序执行,删除操作,用sqlSession.delete("Id", 值) 方法,删除记录,只有一个占位符的时候,传一个值,MyBatis 可以自动载入,但是 #{} 不可以空着,要写上值
- Java程序执行,修改/更新数据操作,用sqlSession.update("Id", 值) 方法,修改记录
- 因为查询,没有修改的操作,是不需要事务操作的,所以我们不同提交数据,给数据库。
这里我们查询的是一条记录,用 sqlSession.selectOne("id") 方法,返回一个 映射对象。
- 你想让mybatis查询之后返回一个Java对象的话,至少你要告诉mybatis返回一个什么类型的Java对象,可以在标签中添加 resultType 属性,所赋值的对象是:全限定类名 ,用来指定查询要转换的类型:
复制代码
- select 查询时,需要 pojo的类当中的映射的类对象中的属性名要与 对应数据表中的字段名一致,才能赋值成功,不然为 Null。可以使用 as 关键字,定义别名的方式,解决。后面有更好的解决方式。
- 我们查询的是多条记录,用 sqlSession.selectList("id") 方法,返回一个 List 集合,存储着我们的查询结果集。
- 如果是返回的是键值对 的话,我们还可以用 sqlSession.selectMap("id") 方法 返回的是一个 Map 集合
- 实际上,本质上,mybatis中的 sqlId 的完备写法: namespace.id ,留意,之后都这么写了,这是完备正确的写法。
复制代码
- 在Java程序当中的写法:
- // 执行SQL语句
- List<Car> cars = sqlSession.selectList("rainbowsea2.selectAll");
- 实际上,本质上,mybatis中的sqlId的完整写法: namespace.id ,注意,之后都这么写了,这是完整正确的写法。
- 关于 MyBatis 的 CRUD 是重点内容,需要熟练掌握住。
“在这个末了的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时候再次相遇。”
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |