MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mapper根节点
namespace命名空间,一般情况下一个mapper映射文件对应一个不同的命名空间,利于管理和维护
书写:默认情况下可以随意输入,但是如果使用接口绑定的方式就必须要输入对应的战口的完整限定名
-->
<mapper namespace="com.zzx.mapper.UserMapper">
<!--插入操作-->
<select id="findAll" resultType="com.zzx.domain.User">
select * from user
</select>
<!--修改操作-->
<update id="update" parameterType="com.zzx.domain.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
<!--删除操作-->
<delete id="delete" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<select id="findByCondition" parameterType="user" resultType="user">
select * from user where
</select>
<!--插入
<--id同一个命名空间只能有一个唯一的id,除非有不同的databaseLd,可以被用来引用这条语句。
如果是接口绑定的是否一定要保证接口和方法名parameterType用来设置该SQL的参数类型,
可以当它不存在,因为mybatis会根据接口方法的参数能够自动读取参数的类型
statementType设置当前的statement,STATEMENT代表jdbc的statement不支持参数解析,不会设置
PREPARED代表jdbc的PreparedStatement支持参数解析,
默认的。CALLABLE代表jdbc的CallableStatement执行存储过程
useGeneratedKeys获取插入后的自动增长的主键(mysql和 SQL Server )
-->
<insert id="save" parameterType="user">
insert into user values (#{id},#{username},#{password},#{birthday})
</insert>
</mapper>
1、参数的取值方式
在xml文件中编写sql语句的时候有两种取值的方式,分别是#和$手,下面来看一下他们之间的区别:
<!----获取参数的方式;
1.#(==>jdbc String sql=" SELECT id, user_name FROM EMP WHERE id=?"
1.会经过JDBC当中PreparedStatement的预编译,会根据不同的数据类型来编译成对应数据库所对应的数据
2.能够有效的防止SQL注入。
字符串拼接方式
2.$( ==> jdbc String sql=" SELECT id, user_name FROM EMP WHERE id="+id
1.不会进行预编译,会直接将输入进来的数据拼接在SQL中。
2.存在SQL注入的风险。不推荐使用。
特殊用法:
调试的情况下可以临时使用一下
可以实现一些特殊功能:动态表,动态列,动态sql
5. map参数
和javaBean的参数传递是一样。一般情况下:
请求进来的参数和pojo对应,就用pojo请求进来的参数没有和pojo对应,就用map
请求进来的参数没有和pojo对应上,但是使用频率很高,就用TO、DTO(就是单独为这些参数创建一个对应的javaBean出来
-->
<select id="findById" parameterType="int" resultType="user">
select * from user where id=#{id}
</select>