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在配置文件中显示声明)
在集成过程中,涉及三类比较重要的文件。
- 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中。
@Autowiredprivate UserMapper userMapper;
更多参考官方文档:http://www.mybatis.org/mybatis-3/zh/index.html