1. 程式人生 > >Mybatis開發dao的方式

Mybatis開發dao的方式

一、原始dao的開發方式

抽取一個工具類MyBatisUtils

public class MyBatisUtils {
static SqlSession sqlSession;
static SqlSessionFactory sqlSessionFactory;
static{
   try {
	sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatisConfig.xml"));
     
   } catch (IOException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
	return sqlSessionFactory.openSession();
}
}

對映檔案    namespace與實體類相對應

<?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.tf.domain.Users">
    <select id="findById" parameterType="int" resultType="com.tf.domain.Users">
    select *from users where id=#{id}
    </select>
    <insert id="saveUsers" parameterType="com.tf.domain.Users">
      insert into users(name,password,status,createDate) values(#{name},#{password},#{status},#{createDate})
    </insert>
</mapper>

配置檔案

<?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>
	<environments default="development"> 
		<environment id="development">
			<!-- 使用jdbc方式控制事務 -->
			<transactionManager type="JDBC"/> 
			<!-- mybatis提供的連線池連結資料
			  未來:mybatis+spring+sprignmvc  這一步交給spring
			 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/> 
				<property name="url" value="jdbc:mysql:///mydb?unicode=true&amp;characterEncoding=utf-8"/>
				<property name="username" value="root"/> 
				<property name="password" value="111111"/>
			</dataSource> 
		</environment>
	</environments>
	<!-- 指定對映檔案 -->
	<mappers>
		<mapper resource="com/tf/domain/UsersMapper.xml"></mapper>	
	</mappers>
</configuration>

dao的實現類

ublic class UsersDaoImpl implements UserDao {
	public Users findId(int id) {
		SqlSession sqlSession = MyBatisUtils.getSqlSession();
		Users users = 	sqlSession.selectOne("findById", id); //和對映檔案的id一致
		sqlSession.commit();
		sqlSession.close();
		return users;
	}
	public void insertUsers(Users users) {
		SqlSession sqlSession = MyBatisUtils.getSqlSession();
		sqlSession.insert("saveUsers",users);  //和對映檔案的id一致
		sqlSession.commit();
		sqlSession.close();
	}

}

SqlSessionFactory,它的生命週期,應該是應用範圍,全域性範圍只有一個工廠,使用單例模式來實現這個功能。與spring整合之後,由spring來對其進行單例管理。

SqlSession,它內部含有一塊資料區域,存線上程不安全的問題,所以應該將sqlsession宣告到方法內部。

測試類

public class TestDao {
public static void main(String[] args) {
	UserDao dao = new UsersDaoImpl();
	Users u = new Users();
	u.setName("Mike");
	u.setPassword("admin");
	u.setCreateDate(Date.valueOf("2101-2-1"));
	u.setStatus(1);
	dao.saveUsers(u);
	System.out.println(dao.findById(2));
}
}

我們會發現原生的dao方式,存在著程式碼冗餘

二、Mapper代理的開發方式

不需要dao的實現類,只需一個介面

public interface UserMapper {
public void save(Users u);
public List<Users> findAll();
public Users findById(int id);
}

注意:
   namespace:和實體類對應
                  id:和方法名一致
     parameterType:指定的型別和介面中的該方法的引數型別一致
     resultType:和介面中的該方法的返回值型別一致
    

<?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.tf.dao.UserMapper">
    <insert id="save" parameterType="com.tf.domain.Users">
    insert into users(name,password,status,createDate)
     values(#{name},#{password},#{status},#{createDate})
    </insert>
        <select id="findAll" resultType="com.tf.domain.Users">
       select * from users
    </select>
    <select id="findById" parameterType="int" resultType="com.tf.domain.Users">
       select * from users where id=#{id}
    </select>
</mapper>