前言
这篇文章参考了《MyBatis3开发文档》记录了初学时碰到的一些问题
正文
MyBatis两个配置文件
configuration.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/blog" />
<property name="username" value="root"/>
<property name="password" value="xx"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="withoutspring/User.xml"/>
</mappers>
</configuration>
User.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="withoutspring.UserDAO" >
<resultMap id="userMap" type="withoutspring.User">
<id property="id" column="userid" />
<result property="display" column="displayname"/>
<result property="logon" column="logon"/>
</resultMap>
<resultMap id="logons" type="withoutspring.Logon">
<id property="id" column="logon_id" />
<result property="logonname" column="logonname"/>
<result property="password" column="password"/>
<collection property="user" javaType="list" ofType="withoutspring.User">
<id property="id" column="user_id" />
<result property="display" column="displayname"/>
<result property="logon" column="logon"/>
</collection>
</resultMap>
<select id="getLogon" parameterType="int" resultMap="logons">
select t.id as logon_id,
t.logonname,
t.password,
t.userid,
t1.id as user_id,
t1.displayname,
t1.logon
from logon t,user1 t1
where t.userid = t1.id
and t.userid = #{userid}
</select>
<update id="updateLogonWithCondition" parameterType="Map">
update logon
<trim prefix="set" prefixOverrides="," suffixOverrides=",">
<if test="logonid != null and logonid != ''">
id = #{logonid},
</if>
<if test="displayname != null and displayname != ''">
logonname = #{displayname},
</if>
</trim>
<trim prefix="where" prefixOverrides="AND|OR">
<if test="myblog1 != null">logonname = #{myblog1}</if>
<if test="logonid1 != null"> or id = #{logonid2}</if>
<if test="logonid1 != null"> and id = #{logonid1};</if>
</trim>
</update>
</mapper>
问题列表
一、user.xml中的mapper里面的namespace如何设置
<mapper namespace="withoutspring.UserDAO" >
</mapper>
在我们三层模型中,我们一般会定义个UserDAO接口,然后有一个实现类UserDAOImpl,在这个实现类中调用操作数据库的开源框架(如hibernateTemplate),但是在MyBatis中,只需要定义个接口UserDAO,然后这个UserDAO的类完全限定名withoutspring.UserDAO填写到namespace属性中。先看看这个UserDAO接口
package withoutspring;
import java.util.Map;
public interface UserDAO {
public Logon getLogon(int userid);
public User getList(int myid);
public void getCount();
public void getLogonByCondition(TestDTO dto);
public void updateLogonWithCondition(Map map);
}
这个接口里面每一个方法名就是user.xml配置文件中select、update、insert中的id名
二、MyBatis的resultMap、resultType、parameterType
parameterType与resultType
例子:存在一种用户表user1里面有字段id、displayname。使用mybatis查找一个user1数据信息
准备:
1、一个user的javaBean作为存储user1查询出来的信息;
2、一个UserDAO接口,里面有一个叫做getUser的公共方法
在配置文件中配置
<mapper namespace="withoutspring.UserDAO" >
<select id="getUser" parameterType="map" resultType="withoutspring.User">
select id,
displayname as display
from user1
where id = #{userid}
and displayname = #{displayn}
</select>
</mapper>
调用代码
public static void main(String[] args) {
SqlSession session = sqlSessionFactory.openSession();
try {
session.selectOne("withoutspring.UserDAO.getCount");
UserDAO mapper = session.getMapper(UserDAO.class);
Map map = new HashMap();
map.put("userid", 52);
map.put("displayn", "goodman");
User user = mapper.getUser(map);
System.out.println(user);
} finally {
session.close();
}
}
1、id=”getUser”这里id对应的是UserDAO中的方法名
2、parameterType=“map”MyBatis里面有很多常用的引用类型,基本类型的别名,这里map是java.util.Map的别名。
3、在select中的sql中#{userid},#{displayn} 里面的命名什么要求? 它对应map中的key,同理如果parameterType指定的是自定义的对象,如DTO,那么对应的时候dto的属性名
4、resultType=”withoutspring.User”,sql在select的字段值存放到User中返回,因为resultType指定的是返回的对象。需要注意的是,select后面的column名必须与User属性名一致,如果不一致请加上as,上面user1表中displayname与User对象的属性display,不一致,所以加了一个as display
resultMap
1、从上面我们讲到select后面的column需要和返回对象的属性名一致,不一致使用as别名来指定成属性名,我们还可以使用resultMap代替resultType,在resultMap配置,column与propertyName的对应关系,因此就不需要使用别名了
<mapper namespace="withoutspring.UserDAO" >
<resultMap id="userMap" type="withoutspring.User">
<id property="id" column="id" />
<result property="display" column="displayname"/>
</resultMap>
<select id="getUser" parameterType="map" resultMap="userMap">
select id,
displayname
from user1
where id = #{userid}
and displayname = #{displayn}
</select>
</mapper>
在resultMap我把配置了对象与数据表的映射关系,resultMap type=”withoutspring.User” type表示这个resultMap返回的是一个User对象
2、既然resultMap是说明表与javaBean之间的映射,那么我们在做关联查询的时候就离不开这个resultMap了
在关联查询时,我们有几种resultMap的配置方法,请看《MyBatis几种关联查询配置》这篇文章
三、MyBatis的动态查询
在写sql,页面传过来的字段,有可能非空,我们总不能把空值给查询语句查询,同理在更新的时候,需要更新的字段也可能是空,我们使用动态查询来解决这些问题,动态查询中使用trim、where、set等标签配置,具体请看《MyBatis的动态查询配置》