目录
MyBatis
准备工作:创建名为 ssm_data 数据库:
导入数据:source 路径:/college.sql
使用 college 数据进行数据操作查看数据表结构: show columns from college;
字段名称,字段对应的数据类型
结合数据分析字段的含义
结合数据,可以看到数据表的含义--代表学校的二级学院的信息:学院编码,学院名称,所在校区使用 MyBatis 操作数据(数据的添加)
设计流程:
1)在项目的 pojo 包中,根据分析的数据表结构,创建 class 与数据表建立映射关系
2)在项目的 mapper 包中,创建接口(interface),在接口中创建抽象方法
3)复制提供的 StudentMapper.xml,复制之后重命名文件 pojo 中创建类的类名+Mapper.xml(映射文件)
***配置映射文件
(1)打开文件,修改 namespace(命名空间)
(2)创建元素节点
元素节点名称:
添加数据:<insert> -->在元素内部使用的 SQL 语句为插入语句
修改数据:<update> -->在元素内部使用的 SQL 语句为修改语句
删除数据:<delete> -->在元素内部使用的 SQL 语句为删除语句
查询数据:<select> -->在元素内部使用的 SQL 语句为查询语句
--》本次示例:为插入数据,因此,在映射文件中添加<insert>节点
设计语句的时候,首先配置元素的属性(2 个)
--》id 属性:属性值与接口中的抽象方法名完全相同(字母大小写),初次使用的时候,属性值建议使用复制和粘 贴的方式完成
--》传入参数类型的属性: parameterType
属性值为 add 方法中的 参数类型(包名.类名)
(3)配置元素
设置要执行的 SQL 语句
当前的任务是向 college 数据表中添加一条数据(College 对象)
字段值:根据 MyBatis 的规则,引用对象的成员属性值;引用的格式为 #{类的成员属性名}
4)在映射文件中配置数据操作的 SQL 语句
5)在项目的 service 包中创建接口(功能是 JavaBean 为上层的调用提供服务)
6)实现 service 包中的接口,重写抽象方法---》在 service 包中创建一个子包,名为 impl
实现接口的时候,使用 CollegeMapper 调用 add 方法完成数据的操作。
添加注解
在类体中,创建成员,类型为 CollegeMapper
如果 Spring 容器中提取了对象,则使用的时候不会出现空指针异常完成数据的操作,在 save 方法中执行 SQL 语句:执行的方式调用 CollegeMapper 中的 add 方法
7)修改资源文件 jdbc.properties,配置数据库连接的驱动、URL、账号和密码
8)测试
在 test 文件夹中创建 package
在 test.college 包中创建测试类--新建 class ; test 目录下创建的 class 与 java 文件夹中创建的 class 性质不同
- test 文件夹中创建的 class 用于程序的运行(单元测试,内部测试)
- 在测试类中,创建一个无返回值的方法
- 运行测试程序,在方法头添加注解@Test
- 在@Test 行右击,选择 run -->运行测试程序
- 运行的时候,观察控制台消息(注意:测试程序是在控制台运行,没有部署到 tomcat)
- 验证是否数据添加成功,查看数据表中的数据
设计pojo类的时候,参考数据表结构 -- ORM
执行程序之后,存入数据库,字段值为?--乱码
解决方法:
连接数据库URL的后面添加参数
***注意:MySQL的编码格式也要设置为utf8
**url的参数指定的参数名和参数值
参考:MySQL URL 连接参数设置_mysql url参数-优快云博客
环境配置
1)重要配置文件applicationContext.xml
配置:Spring框架集成MyBatis
classpath:jdbc.properties
classpath: ---> 指类的根路径 --》对应发布之后classes文件夹的路径
jdbc.properties --》资源包中的属性文件--》属性文件
文件内容: key = value
根据key名称 得到 value的值
${dbcp.driverClassName} --> 读取属性文件中key为dbcp.driverClassName 的值,把值作为当前元素的属性值
2)applicationContext.xml -->引入了文件 jdbc.properties
读取映射文件(实现ORM): 扩展名为xml, 该文件要求满足MyBatis的指定的模板
MyBatis框架查找映射文件,源于路径
classpath:cs/sasu/pojo/*.xml
映射文件所在的位置
以项目发布为例:
classes文件夹为类的根路径
项目中,package的规范以小点分隔子包;文件系统中,包代表一个文件夹
查找xml文件,需要从文件系统中查找,文件系统--父目录与子目录的分隔符号 为 /
一个项目,可以创建若干映射文件,映射文件要求从myBatis提供的模板基础上做一些修改
解释了:文档中,复制一份studentMapper.xml
映射文件的模板:
在模板中修改:namespace(命名空间)
命名空间属性值为包名.接口名 (接口一定在项目中存在,并且接口要求在指定的package中)
指定的package:
修改命名空间
映射文件:
xml元素
<insert> -->元素的内部设计的是SQL的添加数据的命令
<update> -->SQL的修改命令
<delete>
<select>
**上面每一个元素,必须设置 id 属性
**** id 属性值 为 namespace属性指定的接口中的方法名
大小写完全一致
MyBatis执行数据操作原理:
*** MyBatis中的占位符:
#{变量} --》如果parameterType为类,#{}中的符号为 类定义的成员属性名 --》根据属性名 --》调用 getXxx方法得到成员属性 --》得到成员属性值之后,为 insert与中的字段值对应
*** 由此:设计pojo类的时候,每一个成员属性都必须设置get或set方法,为减少代码量,使用lombok
--》执行SQL之后,实现了数据的操作
映射文件中,保证SQL语法正确,否则编译的时候将出现错误
*** 练习过程中,学会解读异常信息
例如:
Cause: java.sql.SQLException: Column count doesn't match value count at row 1
The error may exist in file [D:\idea-proj\ssm-cs\out\production\ssm-cs\cs\sasu\pojo\CollegeMapper.xml]
The error may involve cs.sasu.mapper.CollegeMapper.add-Inline
The error occurred while setting parameters
SQL: INSERT INTO college(c_id,c_title,c_zone) VALUES(?,?)
Cause: java.sql.SQLException: Column count doesn't match value count at row 1
; bad SQL grammar []; nested exception is java.sql.SQLException: Column count doesn't match value count at row 1
这个异常java.sql.SQLException: Column count doesn't match value count at row 1
表明在执行SQL插入语句时,提供的值的数量与表中列的数量不匹配。具体来说,在您的SQL语句中,您指定了三个列(c_id
, c_title
, c_zone
),但只提供了两个占位符(?
)用于传递参数值。