#MyBatis介绍
MyBatis是一个开源的数据待久层框架。
注意本人是在idea上学习的针对idea做的基础使用教程,使用Eclipse需要对应的改变。
#Mybatis环境搭建
首先下载对应的jar包导入自己的项目中,在这里贴一个链接Mybatis的jar。
然后对应做配置文件。在这里贴一个我的配置文件.对应自己的项目做对应的改变即可直接使用。
在idea中maven中resources中的文件不会默认编译,需要在配置文件中配置,详细请——百度Maven工程中不识别mybatis的Mapper.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>
<!-- 引入database.properties-->
<properties resource="database.properties"/>
<!-- 配置mybatis的log实现LOG4J-->
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="cacheEnabled" value="true"/>
</settings>
<!--<typeAliases>
<typeAlias type="poje.User" alias="user"></typeAlias>
<typeAlias type="poje.provider" alias="provider"></typeAlias>
</typeAliases>-->
<typeAliases>
<package name="pojo"/>
</typeAliases>
<!-- 配置mybatis多套运行环境-->
<environments default="development">
<!-- 开发环境-->
<environment id="development">
<!-- 配置事务管理,采用JDBC的事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED:mybatis自带的数据源JNDI:基于tomcat的数据源-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED:mybatis自带的数据源JNDI:基于tomcat的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 将mapper文件加入到配置文件中-->
<mappers>
<!-- <mapper resource="dao/user/UserMapper.xml"/>-->
<package name="dao"/>
</mappers>
</configuration>
然后创建对应的类的映射文件,如下,但是右键是不能直接创建xml文件的。
详细过程百度idea如何创建mapper.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.user.UserMapper">
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
<insert id="add" parameterType="User">
insert into smbms_user
(userCode,userName,userPassword,userRole,gender,birthday,phone,address,creationDate,createdBy)
values(#{userCode},#{userName},#{userPassword},#{userRole},#{gender},#{birthday},#{phone},#{address},#{creationDate},#{createdBy})
</insert>
<select id="getLoginUser" resultType="User" parameterType="string">
select * from smbms_user where userCode=#{userCode}
</select>
</mapper>
还有与之对应的mapper接口
package dao.user;
import org.apache.ibatis.annotations.Param;
import pojo.User;
import java.util.List;
public interface UserMapper {
/**
* 增加用户信息
* @param user
* @return
*/
public int add(User user);
/**
* 通过userCode获取User
* @param userCode
* @return
*/
public User getLoginUser(@Param("userCode") String userCode);
/**
* 通过条件查询-userList
* @param userName
* @param userRole
* @param currentPageNo
* @param pageSize
* @return
*/
public List<User> getUserList(@Param("userName") String userName,@Param("userRole") int userRole,
@Param("currentPageNo") int currentPageNo,@Param("pageSize") int pageSize);
/**
* 通过条件查询-用户表记录数
* @param userName
* @param userRole
* @return
*/
public int getUserCount(@Param("userName") String userName,@Param("userRole") int userRole);
/**
* 通过userId删除user
* @param delId
* @return
*/
public int deleteUserById(@Param("delId") Integer delId);
/**
* 通过userId获取user
* @param id
* @return
*/
public User getUserById(@Param("id") String id);
/**
* 修改用户信息
* @param user
* @return
*/
public int modify(User user);
/**
* 修改当前用户密码
* @param id
* @param pwd
* @return
*/
public int updatePwd(@Param("id") int id, @Param("pwd") String pwd);
}
注意@param() 是为参数中起的别名,能够直接对应在mapper.xml文件中使用。xml文件中parameterType是参数类型 一般可以不用写,如果参数是对象的话一般需要写上。resultType是返回的类型,delete,insert,update语句不需要声明,在select需要声明。
#xml映射文件中的多表格查询和条件查询
日常开发中我们大多需要多表连接并有条件。然后我们开始学习
开发中我们有基本的条件查询,常用语句如下
if语句的用法
<if test=”userCode!=null”> userCode=#{userCode},</if>
相对于java中的if else
<choose>
<when test=””>
</when>
<otherwise>
</otherwise>
</choose>
条件查询中有一种特殊不同查询即当参数类型是list,map实现in语句时
在MyBatis中使用的是
接口中的方法
Public List<User> getUserList(List<Integer> roleList)
对应mapper.xml方法
select * from user where id in
<foreach collection=”list” item=”roleList” open=”(“ separator=”,”close=”)”>
#{roleList}
</foreach>
对于foreach是通用的当参数类型不同时 只要改变 collection 即可。
参数类型 | 对应的类型 |
---|---|
list | list |
map | key |
数组 | array |
更多参考MyBatis帮助文档
开发中遇到多表查询可以有两种方法,一种是在对应的实体类中增加一个属性,一种是使用resultMap实现。
实体类中增加属性的就不用讲了,我们重点讲解使用resultMap
<resultMap type="User" id="userRoleResult">
<id property="id" column="id"/>
<result property="userCode" column="userCode"/>
<!--对应实体类有的属性可以不用写会自动映射,后面我们讲解MyBatis自动映射;
property是对应的实体类中的属性名字 此处是属性是一个对象 javaType是对应的实体类-->
<association property="role" javaType="Role">
<!--注意column是对应sql语句查询出来的结果集合的名字-->
<id property="id" column="r_id"/>
</association>
<!--可以使用下面方法-->
<collection property="role" ofType="Role">
<id property="id" column="r_id"/>
</collection>
<!--当collection可以重复使用的时候考虑抽出来写一个resultMap,在collection使用属性resultMap="" 实现引用-->
<collection property="role" ofType="Role" resultMap="roleList"/>
</resultMap>
配置就到这里就好
然后我们实现编码
package util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisUtil {
private MyBatisUtil() {
}
private static SqlSessionFactory factory;
static {
try {
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
factory=new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession createSqlSession(){
//true为自动提交事务
return factory.openSession(false);
}
public static void closeSqlSession(SqlSession sqlSession){
if (null!=sqlSession){
sqlSession.close();
}
}
}
这个是一个工具类 方便我们直接使用可以基本不用改变
然后使用时创建对应的方法即可。以下是个事例。
public void testGetUserList(){
SqlSession sqlSession=null;
List<Role> roles=new LinkedList<Role>();
try {
sqlSession= MyBatisUtil.createSqlSession();
System.out.println(sqlSession.getMapper(ProviderMapper.class).getProviderById("1").getProName());
//事务提交
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
//事务回滚
}finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
for (Role role:roles){
System.out.println(role.getRoleName());
}
}
本教程就暂时介绍到这里,希望能看到份教程的你喜欢