一、原始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&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>