MyBatis(二)-增删改查
MyBatis(二)-增删改查
环境搭建
- 创建 maven 工程
- 导入坐标
- 编写必要代码(实体类和持久层接口)
- 编写 SqlMapConfig.xml
- 编写映射配置文件
- 编写测试类
用户映射文件配置
那些过于基础的…什么方法名要对应还是不浪费时间了…
resultType 属性:
用于指定结果集的类型parameterType 属性:
用于指定传入参数的类型,传入的是一个类的对象 就写类的全名称。
sql 语句中使用#{}字符:
它代表占位符, 相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。具体的数据是由#{}里面的内容决定的。#{}中内容的写法:
如果数据类型是基本类型,所以此处可以随意写。一般还是使用方法接收的参数名如果是一个 User 对象,此处要写 User 对象中的属性名称。
它用的是 ognl 表达式。
ognl 表达式:
它是 apache 提供的一种表达式语言, 全称是:Object Graphic Navigation Language 对象图导航语言
它是按照一定的语法格式来获取数据的。语法格式就是使用 #{对象.对象}的方式#{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用
getUsername()方法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user.
而直接写 username。
测试类
1 | public class MybastisCRUDTest { |
如果要获得新增用户id的返回值?
新增用户后, 同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长 auto_increment 的值返回。
1 | <insert id="saveUser" parameterType="USER"> |
或者可以使用
在自己的博客项目里使用的是下面这种
1 | <insert id="insert" parameterType="me.xyt.entity.Article" useGeneratedKeys="true" keyProperty="articleId"> |
模糊查询相关
如果SQL语句
1
select * from user where username like #{username}
则参数要 带上%
如果SQL语句
1
select * from user where username like '%${value}%'
在上面将原来的#{}占位符,改成了${value}。注意如果用模糊查询的这种写法,那么${value}的写法就是固定的,不能写成其它名字
#{}与${}的区别
#{}表示一个占位符号:
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值, #{}括号中可以是 value 或其它名称。
${}表示拼接 sql 串:
通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, ${}括号中只能是 value。
MyBatis与JDBC编程的比较
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:
在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大, sql 变动需要改变 java 代码。
解决:
将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数对应。
解决:
Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的parameterType 定义输入参数的
类型。对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析比较方便。
解决:
Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型
MyBatis输出结果封装——resultMap
resultMap
1 | <resultMap type="com.itheima.domain.User" id="userMap"> |
id 标签:用于指定主键字段
result 标签:用于指定非主键字段
column 属性:用于指定数据库列名
property 属性:用于指定实体类属性名称
映射配置
1 | <select id="findAll" resultMap="userMap"> |
SqlMapConfig.xml配置文件
配置内容和顺序
1 | -properties(属性) |
properties可以使用配置文件配置
定义db.properties
1 | jdbc.driver=com.mysql.jdbc.Driver |
标签配置
1 | <properties url=file:///D:/IdeaProjects/day02_eesy_01mybatisCRUD/src/main/resources/jdbcConfig.properties"> |
resource 属性:用于指定 properties 配置文件的位置,要求配置文件必须在类路径下
resource=”jdbcConfig.properties”url 属性:
URL: Uniform Resource Locator 统一资源定位符
http://localhost:8080/mystroe/CategoryServletURL 协议 主机 端口 URI
URI: Uniform Resource Identifier 统一资源标识符
/mystroe/CategoryServlet
它是可以在 web 应用中唯一定位一个资源的路径
datasouece标签
1 | <dataSource type="POOLED"> |
typeAliases(类型别名)
在 SqlMapConfig.xml 中配置:
1 | <typeAliases> |
mappers(映射器)
1 | <!-- 使用相对于类路径的资源--> |
资料参考: 黑马程序员