用mybatis编写DAO
1、创建项目。将上次用JDBC写的项目迁移到mybatis。目录结构有所变化:
DAO改称Mapper,DTO改称POJO。不需要写Impl实现类了,新增了mapper.xml负责具体实现SQL语句,增加mybatis-config.xml负责连接数据源和统筹一切事务。
------------------------------------------------------
2、导入库文件:除了mysql-connector.jar,还增加了mybatis.jar。
3、数据库还是一样。
-----------------------------------------------------------------
4、编写student 对象,为了简单只给个id和name。
----------------------------------------------------------------------
5、接着可以编写dao接口,接口的内容还是一样,只是改称mapper.java了,
----------------------------------------------------
6、编写Impl,不是Impl.java了,而是mapper.xml文件。就是mybatis中的映射器。
----------------------------------------------------------------------------------
7、为了方便,把数据库连接的一些信息定义成变量单独存在一个jdbc.properties文件里,后面会用到。
-------------------
8、mybatis-config.xml
8.1、定义变量:(这里相当于告诉mybatis去找jdbc.properties文件,里面有变量定义。)
8.2、定义每个bean的别名,否则每个bean都要写全名。这里用到了自动识别,如果有很多bean的时候就很方便。
8.3、配置environments。
一个environments里可以有多个environment,id是自己定义的名字。default=“”需要指定默认用哪个。
(1)配置transactionManager:数据库事务管理方式,3种方式,这里选择POOLED。关闭自动提交,即允许程序调用commit提交或者rollback回滚。
(2)配置datasource:数据源,即数据库连接的信息,用刚刚定义过的变量赋值。
(3)指定mybatis映射器为刚才的mapper接口和mapper.xml,这里也用了自动识别。
4、最后来测试一下。编写main。
(1)首先构建SQLSessionFactory工厂接口(利用mybatis-config.xml和mybatis的SQLSessionFactoryBuilder接口)
(2)然后依靠SQLSessionFactory生成并使用SQLSession。相当于jdbc里的connection,用完后要关闭。就像一个公司的前台客服或接待,我只需告诉她我要什么,过段时间她会把结果给我,但具体做事的不是她。用法如下。
SqlSession sqlSession = null;
sqlSession = sqlSessionFactory.openSession();
... ...
sqlSession.commit();
sqlSession.close();
(3)实现mapper。mybatis用动态代理实现了这个mapper接口...暂且知道是这么用的就行。
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
(4)测试代码
Student student1 = new Student();//创建对象
student1.setStu_name(NAME);//给对象name属性赋值,NAME这里是我定义的字符串常量。
studentMapper.insert(student1);//插入了1条记录
List<Student> students_found = new ArrayList<>();//建一个容器来存放查询结果,方便查询多条记录。
students_found = studentMapper.listAll();//列出所有记录
if (students_found != null){
System.out.println("查找成功:"+ students_found.toString());//将查询结果打印出来
}
(5)测试结果:插入了2条记录并打印。
遇到的问题:
mybatis处理结果集、模糊查询,解决方法:配置resultMap,即可以用POJO存储结果集;
遇到关于id的类型long和int的问题无法编译通过,解决办法:暂时把代码中的long都改成int;
笔记:
1、很多框架可以代替原始JDBC方式编程,提升效率,利于解耦。
2、持久化类:用来实现业务问题实体的类,可被保存到数据库中。
3、CRUD:create、retrieve(检索)、update、delete。
4、DAO:提供CRUD操作,包含接口、实现等。
5、datasource:用于代替drivermanager来获取数据库连接。
6、事务(transaction):代表一次原子操作。
7、sqlsessionfectory:表示单个数据库的映射关系,是编译后的内存镜像。
8、basedao:将所有DAO组件共同拥有的方法,(一般是增删查改)抽出来,供其它dao组件扩展(继承)。