mybatis是继Hibernate后优秀的ORM框架之一,是支持自定义SQL,存储过程和高级映射的第一类持久化框架。本文将总结一下mybatis中Dao的三种实现方式。
1.Dao类调用映射文件:创建BaseDao,BaseDao中有sqlSession和对数据库的相关操作,其他Dao类继承BaseDao来实现使用sqlSession,其他的Dao类调用xml文件中定义的select中的id方法,返回相关结果或执行相关操作。这种方式是不被推荐的方法,仅了解即可,代码如下:
mybatis-config.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>
<settings>
<setting name="useGeneratedKeys" value="true"></setting>
<setting name="lazyLoadingEnabled" value="false"></setting>
</settings>
<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://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="132566" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="xcg/model/TuserMapper.xml" />
<mapper resource="xcg/model/EmpMapper.xml" />
<mapper resource="xcg/model/EducationMapper.xml" />
<mapper resource="xcg/model/EmpMapperAndInterface.xml" />
</mappers>
</configuration>
Tuser.java:
@Getter
@Setter
public class Tuser {
private Integer userid;
private String loginname;
private String userpwd;
private String realname;
public Tuser() {
super();
}
}
BaseDao.java:
package xcg.dao;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class BaseDao {
public static SqlSession sqlSession=null;
static{
String path = "mybatis-config.xml";
Reader reader;
try {
reader = Resources.getResourceAsReader(path);
SqlSessionFactory factory = (SqlSessionFactory) new SqlSessionFactoryBuilder().build(reader);
sqlSession = factory.openSession();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*
* Discription:查询方法,不分页,直接返回结果集
*
* @param statement
* SqlMapper配置文件中insert SQL语句对应的“命名空间.sqlId”
* @return
*/
public List<?> selectList(String statement) {
return sqlSession.selectList(statement);
}
/**
*
* Discription:查询方法,不分页,直接返回结果集
*
* @param statement
* SqlMapper配置文件中insert SQL语句对应的“命名空间.sqlId”
* @param parameter
* 持久化对象
* @return
*/
public List<?> selectList(String statement, Object parameter) {
return sqlSession.selectList(statement, parameter);
}
/**
* 查询方法,查询单个对象
*
* @param statement
* @param parameter
* @return
*/
public Object selectOne(String statement, Object parameter) {
return sqlSession.selectOne(statement, parameter);
}
/**
*
* Discription:新增操作
*
* @param statement
* SqlMapper配置文件中insert SQL语句对应的“命名空间.sqlId”
* @param parameter
* @return
*/
public <P> int insert(String statement, P parameter) {
return sqlSession.insert(statement, parameter);
}
/**
*
* Discription:修改操作
*
* @param statement
* SqlMapper配置文件中update SQL语句对应的“命名空间.sqlId”
* @param parameter
* 持久化对象
* @return
*/
public int update(String statement, Object parameter) {
return sqlSession.update(statement, parameter);
}
/**
*
* Discription:删除操作
*
* @param statement
* @param parameter
* @return
*/
public int delete(String statement, Object parameter) {
return sqlSession.delete(statement, parameter);
}
/**
*
* Discription:插入多行数据
*
* @param <P>
* @param statement
* @param list
* @return
*/
public <P> int insertMore(String statement, List<P> list) {
// TODO Auto-generated method stub
return 0;
}
public void close(){
sqlSession.close();
}
}
TuserDao.java:
package xcg.dao;
import java.util.List;
import java.util.Map;
import xcg.model.Tuser;
public class TuserDao extends BaseDao{
public List<Tuser> getAll(){
return (List<Tuser>) this.selectList("xcg.model.Tuser.getAll");
}
public Tuser getOne(Tuser u){
return (Tuser) this.selectOne("xcg.model.Tuser.getOne",u);
}
public int insertOne(Tuser u){
int i = this.insert("xcg.model.Tuser.insertOne",u);
this.sqlSession.commit();
return i;
}
public int delete(Tuser u){
int i = this.delete("xcg.model.Tuser.delete", u);
this.sqlSession.commit();
return i;
}
//分页
public List<Tuser> getPage(Map<String,?> map){
return this.sqlSession.selectList("xcg.model.Tuser.selectPage", map);
}
}
TuserMapper.xml:
<?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="xcg.model.Tuser">
<resultMap type="xcg.model.Tuser" id="UserInfoMap">
<id column="userid" property="userid" />
<result column="loginname" property="loginname" />
<result column="userpwd" property="userpwd" />
<result column="realname" property="realname" />
</resultMap>
<select id="getAll" parameterType="xcg.model.Tuser" resultMap="UserInfoMap">
select
userid,
loginname,
userpwd,
realname
from t_user
</select>
<select id="getOne" parameterType="xcg.model.Tuser" resultMap="UserInfoMap">
select
userid,
loginname,
userpwd,
realname
from t_user
where 1=1
<if test="userid!=null">
and userid=#{userid};
</if>
</select>
<select id="insertOne" parameterType="xcg.model.Tuser">
insert into t_user set userid=#{userid},loginname=#{loginname},userpwd=#{userpwd},realname=#{realname}
</select>
<select id="delete" parameterType="xcg.model.Tuser">
delete from t_user where userid=#{userid}
</select>
<select id="change" parameterType="xcg.model.Tuser">
update t_user set userid=#{userid},loginname=#{loginname},userpwd=#{userpwd},realname=#{realname}
</select>
<select id="selectPage" parameterType="map" resultType="xcg.model.Tuser">
select *from t_user limit #{start},#{size}
</select>
</mapper>
测试:
package xcg.test;
import java.util.List;
import xcg.dao.TuserDao;
import xcg.model.Tuser;
public class Test {
public static void main(String[] args) throws Exception {
TuserDao userDao = new TuserDao();
Tuser t = new Tuser();
t.setUserid(2);
//获取所有
List<Tuser> list = userDao.getAll();
for(Tuser u:list){
System.out.println(u.toString());
}
//获取单个
System.out.println("**********");
Tuser user = userDao.getOne(t);
System.out.println(user.toString());
System.out.println("**********");
Tuser userinsert = new Tuser();
userinsert.setUserid(null);
userinsert.setLoginname("test");
userinsert.setUserpwd("1325665");
userinsert.setRealname("hehe");
System.out.println(userDao.insertOne(userinsert));
System.out.println("保存成功");
System.out.println("**********");
Tuser userdelete = new Tuser();
userdelete.setUserid(136);
System.out.println(userDao.delete(userdelete));
System.out.println("删除成功!");
}
}
//注意:测试最好使用junit或testng,输出尽量不要使用system.out,当需要测试的内容量大时,这个语句会占用很多资源。此类是早前写的,在这里描述一下,不做修改。
2.接口+注解方式:注解方式脱离了xml,使用与sql语句不复杂的情况,定义接口,在接口上使用mybatis注解声明sql语句,在mybatis的核心配置文件中mappers页签中声明注册包扫描:<package name=”xcg.dao”>声明接口所在位置,通过:
接口 dao类对象 = sqlsession.getMapper(接口.class);
来获得相应的dao类的实例对象。代码如下:
mybatis-config.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>
<settings>
<setting name="useGeneratedKeys" value="true"></setting>
<setting name="lazyLoadingEnabled" value="false"></setting>
</settings>
<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://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="132566" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 使用注解方式自动扫描包 -->
<package name="xcg.dao"/>
</mappers>
</configuration>
TuserDaoAnno.java:
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import xcg.model.Tuser;
//使用注解方式使用mybatis
public interface TuserDaoAnno {
@Insert("insert into t_user values(null,#{loginname},#{userpwd},#{realname})")
public void save(Tuser u);
@Select("select *from t_user")
public List<Tuser> getAll();
}
package xcg.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import xcg.dao.BaseDao;
import xcg.dao.TuserDaoAnno;
import xcg.model.Tuser;
//使用注解的方式
public class TestAnn{
public static void main(String[] args) {
SqlSession session = BaseDao.sqlSession;
TuserDaoAnno t = session.getMapper(TuserDaoAnno.class);
List<Tuser> list = t.getAll();
for(Tuser tt:list){
System.out.println(tt.toString());
}
}
}
//此类方法用的要多于第一种。
3.接口+xml方式:推荐,接口定义方法和2相同,将接口的sql语句写到xml文件中,并保证接口中的方法名和xml中的select的id相同,并在xml的namespace配置为接口的地址,然后在mybatis中的核心配置文件中配置xml的mapper,并且该方法获取dao的实例和第二种方法完全相同。推荐使用这种方法。这种方法配置在ssm环境中需要在spring配置文件中加入:
<bean id="configure" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="xcg.dao"></property>
</bean>
这句配置就是可以将Dao的接口实例化出Dao类。代码如下:
Emp.java:
package xcg.model;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
@Gettrer
@Setter
public class Emp {
private Integer empno;
private String empName;
private String passWord;
private Date birth;
private String email;
private Set<Education> set = new HashSet<Education>();
public Emp(){
}
}
EmpDaoAnnoAndXml .java:
package xcg.model;
import java.util.List;
public interface EmpDaoAnnoAndXml {
public List<Emp> getAll();
}
EmpMapperAndInterface.xml:
<?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="xcg.model.EmpDaoAnnoAndXml">
<resultMap type="xcg.model.Emp" id="userAndStuResultMap">
<id column="EMPNO" property="empno" />
<result column="EMPNAME" property="empName" />
<result column="PASSWORD" property="passWord" />
<result column="BIRTH" property="birth" />
<result column="EMAIL" property="email" />
<collection property="set" resultMap="EducationMap" />
</resultMap>
<resultMap type="xcg.model.Education" id="EducationMap">
<id column="EDUNO" property="eduno" />
<result column="XUELI" property="xueli" />
<result column="SCHOOL" property="school" />
<result column="MAGIR" property="magir" />
<result column="STARTTIME" property="startTime" />
<result column="ENDTIME" property="endTime" />
</resultMap>
<select id="getAll" resultMap="userAndStuResultMap">
select
e.empno,e.empname,e.password,e.birth,e.email,d.eduno,d.xueli,d.school,d.magir,d.starttime,d.endtime
from emp e left join education d
on e.empno=d.empno
</select>
</mapper>
TestEmpInterfAndXml .java:
package xcg.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import xcg.dao.BaseDao;
import xcg.model.Emp;
import xcg.model.EmpDaoAnnoAndXml;
//使用Interface和xml方式
public class TestEmpInterfAndXml {
public static void main(String[] args) {
SqlSession session = BaseDao.sqlSession;
EmpDaoAnnoAndXml t = session.getMapper(EmpDaoAnnoAndXml.class);
List<Emp> list = t.getAll();
for(Emp tt:list){
System.out.println(tt.toString());
}
}
}
笔者推荐使用第三种方式,集成在SSM框架中能十分方便的进行持久层的操作。