mybatis中Dao的三种实现方式

来源:互联网 发布:股票主力监控软件 编辑:程序博客网 时间:2024/06/15 22:41

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();
}



TestAnn.java:
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框架中能十分方便的进行持久层的操作。