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