MyBatis的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>
<typeAliases>
<typeAlias alias="User" type="com.xxx.mybatis.models.User" />
</typeAliases>
<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/yiibai" />
<property name="username" value="root" />
<property name="password" value="" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/xxx/mybatis/models/User.xml" />
</mappers>
</configuration>
该xml文件用来构建MyBatis的session factory。
MyBatis实体类
即POJO
Mapper示例
<?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="com.xxx.mybatis.models.UserMapper">
<select id="GetUserByID" parameterType="int" resultType="User">
select * from `user` where id = #{id}
</select>
</mapper>
最初级使用代码示例
try {
reader = Resources.getResourceAsReader("config/Configure.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//构建session factory
} catch (Exception e) {
e.printStackTrace();
}
SqlSession session = sqlSessionFactory.openSession();
try {
User user = (User) session.selectOne("com.yiibai.mybatis.models.UserMapper.GetUserByID", 1);
if(user!=null){
String userInfo = "名字:"+user.getName()+", 所属部门:"+user.getDept()+", 主页:"+user.getWebsite();
System.out.println(userInfo);
}
} finally {
session.close();
}
使用带注解的接口消除xml mapper
通过带注解的dao接口类可以替代xml形式的mapper
public interface IUser {
@Select("select * from user where id= #{id}")
public User getUserByID(int id);
}
SqlSession session = sqlSessionFactory.openSession();
try {
IUser iuser = session.getMapper(IUser.class);
User user = iuser.getUserByID(1);
System.out.println("名字:"+user.getName());
System.out.println("所属部门:"+user.getDept());
System.out.println("主页:"+user.getWebsite());
} finally {
session.close();
}
完全使用接口和xml mapper
接口
public interface IUser {
public List<User> getUserList();
public void insertUser(User user);
public void updateUser(User user);
public void deleteUser(int userId);
public User getUser(int id);
}
xml mapper
<?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="com.yiibai.mybatis.dao.IUser">
<select id="getUser" parameterType="int"
resultType="com.xxx.mybatis.models.User">
SELECT *
FROM USER
WHERE id = #{userId}
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO USER(name,
dept, website,phone)
VALUES(#{name}, #{dept}, #{website}, #{phone})
</insert>
<select id="getUserList" resultType="com.xxx.mybatis.models.User">
SELECT * FROM USER
</select>
<update id="updateUser" parameterType="User">
UPDATE USER
SET
name=
#{name},
dept = #{dept},
website = #{website},
phone = #{phone}
WHERE
id =
#{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM USER WHERE id = #{id}
</delete>
</mapper>
注意在User.xml 配置文件中,mapper namespace=”com.yiibai.mybatis.inter.IUser” ,命名空间对应非常重要,名称不能有错,必须与我们定义的 package 和 接口一致。
使用代码
try {
reader = Resources.getResourceAsReader("config/Configure.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//构建session factory
} catch (Exception e) {
e.printStackTrace();
}
try{
// 获取Session连接
SqlSession session = sqlSessionFactory.openSession();
// 获取Mapper
IUser userMapper = session.getMapper(IUser.class);
// 执行插入
User user = new User();
user.setId(0);
user.setName("Google");
user.setDept("Tech");
user.setWebsite("http://www.google.com");
user.setPhone("120");
userMapper.insertUser(user);
// 提交事务
session.commit();
System.out.println("Test insert finished...");
} catch (Exception e){
e.printStackTrace();
}
一对多关联,多对一关联
User用户与Post文章之间存在一对多关系
public class User implements Serializable{
private int id;
private String username;
private String mobile;
private List<Post> posts;
public class Post implements Serializable{
private int id;
private User user;
private String title;
private String content;
mapper中的一对多映射语句
<resultMap type="User" id="resultUserMap">
<result property="id" column="user_id" />
<result property="username" column="username" />
<result property="mobile" column="mobile" />
<collection property="posts" ofType="com.xxx.pojo.Post" column="userid">
<id property="id" column="post_id" javaType="int" jdbcType="INTEGER"/>
<result property="title" column="title" javaType="string" jdbcType="VARCHAR"/>
<result property="content" column="content" javaType="string" jdbcType="VARCHAR"/>
</collection>
</resultMap>
<select id="getUser" resultMap="resultUserMap" parameterType="int">
SELECT u.*,p.*
FROM user u, post p
WHERE u.id=p.userid AND id=#{user_id}
</select>
mapper中的多对一映射语句
<resultMap type="Post" id="resultPostsMap">
<result property="id" column="post_id" />
<result property="title" column="title" />
<result property="content" column="content" />
<association property="user" javaType="User">
<id property="id" column="userid"/>
<result property="username" column="username"/>
<result property="mobile" column="mobile"/>
</association>
</resultMap>
<select id="getPosts" resultMap="resultPostsMap" parameterType="int">
SELECT u.*,p.*
FROM user u, post p
WHERE u.id=p.userid AND p.post_id=#{post_id}
</select>
多对多关联
在多对多关联中需要建立中间关联表的实体。
User用户与Group用户组之间存在多对多关系
public class User {
private int id;
private String username;
private String mobile;
private List<Group> groups;
public class Group {
private int groupId;
private String groupName;
private List<User> users;
public class UserGroup {
private int userId;
private int groupId;
Group的mapper配置片段
<resultMap type="Group" id="resultGroupMap_1">
<result property="id" column="id" />
<result property="groupName" column="group_name" />
<collection property="users" column="group_id"
select="com.yiibai.maper.UserGroupMaper.getUsersByGroupId" />
</resultMap>
<select id="getGroup" resultMap="resultGroupMap_1"
parameterType="int">
SELECT *
FROM `group`
WHERE group_id=#{id}
</select>
User的mapper配置片段
<resultMap type="User" id="resultUser">
<result property="id" column="group_id"/>
<result property="name" column="name"/>
<collection property="groups" column="id" select="com.yiibai.maper.UserGroupMaper.getGroupsByUserId"/>
</resultMap>
<select id="getUser" resultMap="resultUser" parameterType="int">
SELECT *
FROM user
WHERE id=#{id}
</select>
UserGroup的mapper配置片段
<!-- 根据一个用户组ID,查看这个用户组下的所有用户 -->
<resultMap type="User" id="resultUserMap_2">
<result property="id" column="id"/>
<result property="username" column="username"/>
<result property="mobile" column="mobile"/>
</resultMap>
<select id="getUsersByGroupId" resultMap="resultUserMap_2" parameterType="int">
SELECT u.*, ug.group_id
FROM user u, user_group ug
WHERE u.id=ug.user_id AND ug.group_id=#{group_id}
</select>
<!-- 根据一个用户ID,查看这个用户所对应的组-->
<resultMap type="Group" id="resultGroupMap_2">
<result property="groupId" column="group_id"/>
<result property="groupName" column="group_name"/>
</resultMap>
<select id="getGroupsByUserId" resultMap="resultGroupMap_2" parameterType="int">
SELECT g.*, u.user_id
FROM group g, user_group u
WHERE g.group_id=u.group_id AND u.user_id=#{user_id}
</select>
MyBatis与Spring集成(非扫描mapper,mapper在配置文件中显示声明)
在集成过程中,涉及三类比较重要的文件。
- Spring的配置文件applicationContext.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/yiibai?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="config/Configuration.xml" />
</bean>
<bean id="userMaper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<property name="mapperInterface" value="com.xxx.maper.UserMaper" />
</bean>
MyBatis的配置文件mybatisConfiguration.xml (可以配置MyBatis相关的setting属性)
在mybatisConfiguration.xml中不在需要配置environments节点,但是仍要配置mappers节点(下文会通过配置spring中sqlSessionFactory内的mapperLocations,将mappers节点配置也给省略)。MyBatis中的映射文件
调用Spring context中的dao接口
ctx = new ClassPathXmlApplicationContext("config/applicationContext.xml");
UserMaper userMaper = (UserMaper) ctx.getBean("userMaper");
// 测试id=1的用户查询,可根据数据库中的情况修改.
User user = userMaper.getUserById(1);
System.out.println("获取用户 ID=1 的用户名:"+user.getUsername());
MyBatis与Spring集成(扫描mapper,mapper无需在配置文件中显示声明)
如果想使用MyBatis的扫描mapper的功能,需要在Spring中增加配置。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:config/Configuration.xml" />
<property name="mapperLocations" value="classpath*:com/yiibai/mapepr/*.xml" />
//不在需要在mapper中指定type全限定名
<property name="typeAliasesPackage" value="com.xxx,com.yyy"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<property name="basePackage" value="com.xxx.maper" />
//可以指定扫描包下面有特殊注解的mapper类
<property name="annotationClass" value="com.xxx.common.persistence.annotation.MyBatisDao"/>
</bean>
通过自动注入,可以将dao接口的实现注入到具体的service中。
@Autowired
private UserMapper userMapper;