Mybatis 常见问题

resultMap与resultType

两者都是用来实现数据库与java代码的映射。

resultMap必须写指明映射关系,且要select等语句要用其id
ResultMap

reslutType无需指明关系,映射方式是看语句的列名与java代码列名相同,且忽略大小写,内容是java的文件名

1
2
3
<select id="queryMessageList" parameterType="com.imooc.bean.Message" resultType="com.imooc.bean.Message">
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
</select>

parameterMap与parameterType

两者都是指定参数内容
parameterMap已经废弃
parameterType是指明参数类型,如果是string和java常用类型,直接写名字即可,比如int,double,string,如果是自定义和其他类型,需要写出报名,比如com.imooc.bean.Message,java.util.List

1
2
3
4
5
6
7
<delete id="deleteBatch" parameterType="java.util.List" >
delete from message where ID in (
<foreach collection="list " item="item" separator=",">
#{item}
</foreach>
)
</delete>

#{}${}

两者都是传入参数的
#{}是带有预编译过程的,而${}没有,传进来什么就是什么

1
2
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE where ID = #{id}
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE where ID = ${id}

编译后变为

1
2
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE where ID = '?'
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE where ID = xxx

可以看出#{}可以有预编译,防止sql注入等,而${}原样带入
但是在order by语句中经常使用${}

1
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE order by ${id}

获取自增主键的值

当主键自增,添加数据需要获取主键的值时可使用时useGeneratedKeys="true"表示逐渐自增和keyColumn="id"表示获取id的值

1
2
3
<insert id="insert" parameterType="UserAlias" useGeneratedKeys="true" keyColumn="id">
INSERT INTO user( id,username,) VALUES ( #{id},#{username})
</insert>

中文乱码

  • 数据库文件
  • Mybatis的configuration.xml文件

    1
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/wechat?useUnicode=yes&characterEncoding=UTF-8"/>
  • jsp文件

    1
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  • servlet文件

1
2
3
// 设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
  • Myeclipse文件编码