Mybatis開發dao的方式
阿新 • • 發佈:2019-01-26
一、原始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>