idea mybatis cannot find xml以及一些注意事项
映射文件和java工程在一起,sqlmapconfig.xml在maven webapp中的resources,但编译运行却报exception cannot find 映射文件,查看编译后的文件发现即target中没有Dept.xml解决办法
只需要在pom中加入
<build>
<finalName>mybatis-base</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
即可,意思是加载编译在java工程中的xml映射文件
即可,意思是加载编译在java工程中的xml映射文件
但在sqlmapconfig中mapper即映射路径需要这样写,以斜杠分割
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<mappers> <mapper resource="com/lz/mybat/User.xml"/> </mappers>
但在映射配置中
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDConfig 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="test"> <select id="findUserById" parameterType="int" resultType="com.lzq.mybat.User"> SELECT * FROM USER WHERE id=#{id} </select> </mapper>resulttype中路径是。分割,之所以是不同是因为,前者是路径以/分割,后者是类型即返回值类型pojo包类名
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">sqlmapconfig 为config.dtd
映射为 mapper.dtd
<!--中间是sql语句#{}表示展位副,其中的值可任意,parametertype的type和展位副类型一样--> <!--虽然这个模糊查询查询出多条记录,看似返回值是list,but,resulttype结果类型是单条result所映射的java类型--> <select id="findUserByName" parameterType="java.lang.String" resultType="com.lzq.mybat.User"> SELECT * FROM user WHERE username like #{value} </select>
User user = sqlSession.selectOne("test.findUserById", 1); // 参数一,映射文件中的 namespace+.+selectid,展位副值
SELECT * FROM user WHERE username LIKE '%${value}%'
${}表示拼接符用来模糊查询之类的,需加引号,但会引起sql注入
<!--得到主键,因为表间的关联关系,主表主键作为子表关联外键--> <!--添加用户--> <!--得到insert进去的主键值,仅适用于auto_increment主键--> <!--keyproperty 值为将结果映射为parameterType中的id属性值,order相对于insert 语句执行之后--> <insert id="insertUser" parameterType="com.lzq.mybat.User"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT last_insert_id() </selectKey> INSERT INTO user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) </insert> <!--适用于非自增主键,before,先通过uuid的到主键,在通过insert into 插入进去,所以是before--> <insert id="insertUser" parameterType="com.lzq.mybat.User"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer"> SELECT uuid() </selectKey> INSERT INTO user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) </insert>
<typeAliases> <!--单个别名设置--> <!--<typeAlias type="com.lzq.mybat.User" alias="User"/>--> <!--批量别名设置,别名就是类名,首字母大小写都可以,用来简化mapper。xml中输入输出映射的 简写 --> <package name="com.lzq.mybat"/> <package name="com.lzq.mapper"/> <package name="com.lzq.dao"/> </typeAliases>
<!--通过mapper接口来加载映射文件 前提:通过mapper代理开发,且映射文件和mapper接口在同一个目录下 --> <!--resource是路径用/分割,class是类名,用。引用--> <mapper class="com.lzq.mapper.UserMapper"/> <!--通过批量来加载,自动扫描包里面的mapper接口进行加载--> <!--前提:通过mapper代理开发,且映射文件和mapper接口在同一个目录下--> <package name="com.lzq.mapper"/>
<!--输入参数,输出参数多元化--> <select id="findUserList" parameterType="com.lzq.dao.UserQueryVo" resultType="com.lzq.dao.UserExpand"> SELECT * FROM user WHERE user.id = #{userExpand.sex} AND user.username LIKE '%${userExpand.user}%' </select> <!--userExpand.sex取出包装类型 的参数值,parametertype类型中包含userExpand-->