MyBatis使用小结

来源:互联网 发布:crossover16破解版mac 编辑:程序博客网 时间:2024/05/17 09:03

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中。

@Autowiredprivate UserMapper userMapper;

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

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2019注会经济法 注会考试需要带什么 注会打印准考证 考注会条件 注会考试带什么 注会缺考有什么后果 注会缺考 注会考试条件 注册会记师 注会综合阶段年限 注会证有什么用 注会年薪大概多少钱 注会考试报名 注会考试资格 会记师 注会工资 注会报名费 注会吧 注会怎么搭配考试 注会考试资格要求 考注会的条件 注会报名科目搭配 注会考试搭配 注会什么时候报名 报考注会的条件 注会培训班一般多少钱 注会综合考什么 注会综合考试考什么 注会税法复习方法 注会综合怎么考 注会培训费用 高顿注会培训班 注会经济法题库 注会税法模拟题 注会培训价格 报考注会条件 注会职称报名条件 注会辅导班价格 注会审计怎么学 注会轻松过关 关于注会