mybatis学习第三天

180 阅读3分钟

Mybatis基于代理Dao的CRUD操作

1 CRUD操作

1 mapper的路径最好和到路径相同。

2 Setting autocommit to false Rolling back JDBC Connection

    // 提交事务
    sqlSession.commit();

3 parameterType 的 Integer写法

4 parameterType 是基本类型或者包装类 占位符可以随意写。 delete from user where id = #{aaa}

5 模糊查询的配置方式

select * from user where username like '%${value}%'

我们在上面将原来的#{}占位符,改成了{value}。注意如果用模糊查询的这种写法,那么{value}的写 法就是固定的,不能写成其它名字。

public String handleToken(String content) {
  Object parameter = context.getBindings().get("_parameter");
  if (parameter == null) {
    context.getBindings().put("value", null);
  } else if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) {
    context.getBindings().put("value", parameter);
  }
  Object value = OgnlCache.getValue(content, context.getBindings());
  return (value == null ? "" : String.valueOf(value)); // issue #274 return "" instead of "null"
}

源码中指定了读取的 key 的名字就是”value”,所以我们在绑定参数时就只能叫 value 的名字

6

'%${value}%':

select * from user where username like '%111%'

A: #{aaa}: select * from user where username like ?

#{}表示一个占位符号

通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。

${}表示拼接 sql 串

通过{}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,{}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。

7 新增用户ID的返回值

    <!--    keyProperty 代表要返回的值名称 实体类 keyColumn 数据库的名称 表 order 取值为AFTER代表插入后的行为 resultType 代表返回值的类型-->

	<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="java.lang.Integer">
	SELECT 1712435;
	</selectKey>

8 Mybatis 与 JDBC 编程的比较

1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

解决: 在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。

2.Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。

解决: 将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。

3.向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数对应。

解决: Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的类型。

4.对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析比较方便。

解决: Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型。

Mybatis的参数深入

parameterType输入类型

1 简单类型

2 pojo对象

使用ognl表达式解析对象字段的值,#{}或者${}代表属性名称

ognl表达式 Object Graphic Navigation Language 对象 图 导航 语言

通过对象的取值方法来获取数据。在写法上把get省略。

eg:

类中的写法:user.getUserName() OGNL:user.username

mybatis中为什么能直接写username,而不用user.呢

在parameterType中已经提供了属性所属的类。

3 pojo包装对象

resultType结果类型封装

1 简单类型

2 pojo对象

3 pojo列表

mysql 在 windows 系统中不区分大小写!

resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。

1)使用别名查询 执行效率快 SQL文

<!-- 配置查询所有操作 --> 
<select id="findAll" resultType="com.itheima.domain.User">
select id as userId,username as userName,birthday as userBirthday,
sex as userSex,address as userAddress from user
</select>

2)定义 resultMap 执行效率比较慢 开发效率快

<resultMap type="com.itheima.domain.User" id="userMap"> <id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="sex" property="userSex"/>
<result column="address" property="userAddress"/>
<result column="birthday" property="userBirthday"/>
</resultMap>

id 标签:用于指定主键字段

result 标签:用于指定非主键字段

column 属性:用于指定数据库列名

property 属性:用于指定实体类属性名称 JAVA

<select id="findAll" resultMap="userMap">
select * from user
</select>

PreparedStatement对象它的执行方法

execute 能执行CRUD中的任意一种语句 返回boolen 表示是否有结果集。有的是true

executeUpdate 只能执行CUD语句 查询语句无法执行 返回值影响数据库记录的行数

executeQuery 只能只想SELECT语句 无法执行增删改 返回值ResultSet对象

配置内容

1 配置properties

<!--    配置properties
    可以在标签内部配置连接数据库信息 也可以通过属性引用外部配置文件信息
    resource 常用 用于指定配置文件的位置 按照类路径的写法 并且必须存在于类路径下
    url 要求按照URL的写法 可以唯一标志一个资源的位置
        写法:协议    主机     端口  URI
              http://localhost:8080/mybatis
        URI: 统一资源标识符 应用中可以唯一定位一个资源的
-->
<properties resource="jdbcConfig.properties">
<!--    <properties url="file:///C://XXX">-->
<!--        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!--        <property name="url" value="jdbc:mysql://localhost:3306/htoa?serverTimezone=GMT"/>-->
<!--        <property name="username" value="root"/>-->
<!--        <property name="password" value="htoa"/>-->
</properties>

        <dataSource type="POOLED">
<!--                配置连接数据库的基本信息 -->
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>

2 配置typeAliases

<!--    使用typeAliases配置别名 只能配置domain中的类名-->
<typeAliases>
<!--        typeAlias 配置别名 type 指定实体类全限定类名 alias 指定别名 当指定别名不在区分大小写-->
<!--        <typeAlias type="com.mybatis.domain.User" alias="user"></typeAlias>-->
<!--        用于执行要配置别名的包 当指定之后该包下的实体类都会注册别名 类名就是别名 不在区分大小写-->
    <package name="com.mybatis.domain"/>
</typeAliases>

3 package

<!--    指定映射配置文件的位置,映射配置文件指的是每个Dao独立的配置文件 -->
<mappers>
<!--        <mapper resource="com/mybatis/dao/User.xml"></mapper>-->
<!--        用于指定dao接口所在的包 当指定完成无需mapper或者class-->
<package name="com.mybatis.dao"></package>
</mappers>