MyBatis使用小结

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在配置文件中显示声明)

在集成过程中,涉及三类比较重要的文件。

  1. 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>
  1. MyBatis的配置文件mybatisConfiguration.xml (可以配置MyBatis相关的setting属性)
    在mybatisConfiguration.xml中不在需要配置environments节点,但是仍要配置mappers节点(下文会通过配置spring中sqlSessionFactory内的mapperLocations,将mappers节点配置也给省略)。

  2. 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;

更多参考官方文档:http://www.mybatis.org/mybatis-3/zh/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值