-
Mybatis是一个基于java的持久层框架,主要是用来做数据库的访问操作,它通过XML描述符或注解把对象与SQL语句关联起来。
-
Jdbc做数据访问操作的缺点(获取链接、创建statement、设置值、释放资源)
-
代码冗余大,开发效率低下
-
sql命令定义在java程序里,如果sql发生改变会导致代码的重新编译
-
所有O-R mapping的动作都需要手动完成
-
-
Mybatis框架
-
框架:对现有代码的合理封装,便于后续重复调用,提高开发效率。
-
-
-
Mybatis体系结构
-
Mybatis提供了一个映射文件--mapper文件(向Mybatis提出功能要求)
-
interface AccountDao{
public void insertAccount(Account a);
}
----jdbc操作
public class AccountDaoImpl implements AccountDao{
public void insertAccount(Account a){
Connection conn = null;
PreparedStatement pstm = null;
try{
conn = JdbcUtil.getConnection();
String sql = "insert .....";
pstm = conn.prepareStatement(sql);
pstm.setXXX();
pstm.executeUpdate();
}catch(Exception e){
......
}finally{
JdbcUtil.close(null,pstm,null)
}
}
}
----mybatis操作 通过mapper文件完成功能,文件名后缀为xml
<mappper namespace="包名.AccountDao">
<insert id = "DAO中所要实现的方法名(例如insertAccount)" parameterType="方法参数的类型,如果是对象要写全限定名">
<!-- 插入动作时。对象的主键为null,需要查询数据库的序列中得到主键值 -->
<selectKey resultType="java.lang.Integer" keyProperty="对象的id属性名" order="BEFORE">
select account_seq.nextval from dual
</selectKey>
insert sql命令(命令里通过#{对象属性名}获取对象属性)
</insert>
</mapper>
2. MyBatis根据给定的mapper文件自动生成相应的java实现类
搭建mybatis开发环境
-
引入mybatis需要的jar包
-
mybatis3.2.2.jar ojdbc5.jar log4j-1.2.17.jar(打印日志)
-
-
配置文件mybatis-config.xml
3.Mybatis的核心类
SqlSessionFactoryBuilder:负责加载mybatis-config.xml文件内容
SqlSessionFactory:负责构建SqlSession
SqlSession:一次数据库“会话”,包含了多次数据库访问操作,相当于jdbc里的Connection。
开发第一个MyBatis程序
* 0:准备数据库环境(建库,建表)搭建MyBatis开发环境,导入MyBatis相关jar包到项目classpath中,导入mybatis-config.xml配置文件到src下。
* 1:创建一个表Table 所对应的实体Entity
* 2:定义数据库访问层接口DAO
* 3:书写SqlMapper配置文件(本质上实在书写DAO的实现类,所以命名为XXXDAOImpl.xml)
具体内容如上面mybatis操作。
* 4:将Mapper映射文件注册到mybatis-config.xml配置文件中
<mappers>
<mapper resource="此处需要映射文件路径,从src下开始写(例如:dao/PersonDaoImpl.xml)"></mapper>
</mappers>
* 5:Java测试代码
-
创建SqlSessionFactoryBuilder的功能--->负责加载mybatis-config.xml文件
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
2. 调用builder的build方法加载配置文件,同时读到内存中保存在SqlSessionFactory对象中
SqlSessionFactory factory = builder.build(reader);
3. 获取sqlSession对象
SqlSession session = factory.openSession();
4. 调用session的getMapper()可以得到mybatis生成的接口的实现类
XxxDao dao = session.getMapper(XxxDao.class);
5. 将业务提交并关闭session会话
session.close();
Select方法
Dao中查询方法
Mapper配置文件
<select id="方法名" parameter="方法参数的类型" resultType="方法返回值类型,要全类名">
select 表里字段名 as 结果字段名,....from 表名 where 条件
</select>
注意:mybatis会自动将结果集里的数据封装成指定返回值类型的对象。
封装时,将结果里的字段值设置到对象的相应属性里,要求结果字段名和对象的属性名保持一致。
update操作
Dao中方法
public coid updateAccount(Account a);
Mapper中
<update id="updateAccount" parameterType="day1.Account">
update account set name=#{name},password=#{password},balance=#{balance} where carid=#{carid}
</update>
Delete操作
Dao中
public void deleteAccount(Integer cardId);
mapper中
<delete id="deleteAccount" parameterType="java.lang.Integer">
delete from account where cardid=#{cardId}
</delete>
高级查询
-
查询有多个参数
-
mapper文件中不能使用parameterType属性
-
接口的方法声明中,对每个参数使用@Param(value="参数别名")
-
mapper文件中的sql,绑定参数#{参数别名}
-
上图中的@Param(value="a2")相当于@Param("a2")