–1、介绍
-1、框架(Framwork)是一个提供了可重要的公共结构的半成品
-2、mybatis介绍:mybatis前身是ibatis,是Apache旗下的一个开源项目 之前学的Apache旗下的tomcat
-3、mybatis作用:对jdbc进行封装,简化了jdbc的代码,实现通过ROM来完成对数据库的操作
-4、ORM:对象关系映射 对象指的是java实体类创建的对 关系指的是关系型数据库 映射指的是实体类中的属性和数据库表中的字段的映射
查询功能:不需要用ResultSet来处理结果集 而且mybatis框架帮我们做好他们之间对应关系
-5、官网:
1.mybatis官网:http://mybatis.org
2.Gutgyb官网:https://github.com/mybatis
–2、MyBatis的优缺点
-1、优点:
与jdbc相比,减少了50%以上的代码量
最简单的持久化框架,小巧并简单易学
SQL代码从程序代码中彻底分离,可重用
通过XML标签,支持编写动态SQL
通过映射标签,支持对象与数据库的ORM字段映射
-2、缺点: M
SQL语句编写工作量大,对开发人员有一定要求
数据库移植性差(不同数据库之间的切换,因为不同的接口,他们的SQL语法有些不同)
MyBatis专注于SQL本身,是一个只够灵活的DAO层解决方案,适用于性能要求较高或者需求多变的互联网项目
–3、mybatis开发环境搭建 连接数据库,对数据进行操作 对jdbc进行进行封装
-1、创建web项目
-2、在 WebRoot——>WEB-INF——>lib 中导入mybatis的依赖jar包和mysql的驱动依赖jar包,并build path一下
mybatis-3.2.2.jar
mysql-connector-java-5.1.0-bin.jar
-3、创建一个util工具包 来创建连接数据库使用的SqlSession会话
代码:
//创建sqlsessionfactory 在创建sqlsession
public static SqlSessionFactory factory;//跟application作用范围一样 整个程序
//静态代码块 只执行一次
static{
System.out.println("===== static factory ======");
try {
//读取全局配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//创建session工厂
factory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取session
* @return
*/
public static SqlSession createSqlSession(){
return factory.openSession();
}
/**
* 关闭session
* @param session
*/
public static void closeSqlSession(SqlSession session){
if (null!=session) {
session.close();
}
}
-4、在src中创建mybatis的全局配置文件mybatis-config.xml
配置连接数据库的信息
代码:
<?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"></transactionManager>
<!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/petdatabase"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com.accp.dao/UserMapper.xml"/>
</mappers>
</configuration>
-5、创建entity包来存放实体类 来创建一张表写入属性并生成setter/getter方法和tostring方法
-6、dao层接口及实现类 sql映射文件
UserMapper.java接口
代码:
public List<User> findAll();
UserMapper.xml创建
代码:
<?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">
<!-- namespace:命名空间 用来指定接口文件 -->
<mapper namespace="com.accp.dao.UserMapper">
<!-- 查询所有用户信息 -->
<select id="findAll" resultType="com.accp.entity.User">
select * from `user`
</select>
</mapper>
UserMapperImpl.java创建
如果是增加要写提交事假 把数据保存到数据库 在异常里写入回滚
//提交事务
session.commit();
//回滚
session.rollback();
代码:
SqlSession session;//相当于jdbc中的connection
@Override
public List<User> findAll() {
// TODO Auto-generated method stub
//获取session对象
try {
session = MybatisUtil.createSqlSession();
List<User> list = session.getMapper(UserMapper.class).findAll();
return list;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}finally{
MybatisUtil.closeSqlSession(session);
}
}
-7、把sql映射文件配置到mybatis的全局配置文件
-8、编写测试类进行测试
–4、mybatis工作原理
1、先读取全局配置文件mybatis-config.xml
2、由SqlSessionFactoryBuilder类的build方法来创建SqlSessionFactory(session工厂)
3、有SqlSessionFactory来创建SqlSession(sql会话 来执行sql语句)
4、session会话会根据Mapper.xml(sql映射文件)调用相应的sql语句
–5、介绍
-1、MyBatis真正强大之处就在于SQL映射文件,也是它的魅力所在。
–6、SQL映射文件的几个顶级元素配置:
-1、mapper:映射文件的更元素节点,只有一个属性namespace(命名空间),其作用如下:
1.用于区分不同的mapper,全局唯一
2.绑定DAO接口,即面向接口编程。当namespace绑定某一接口之后,可以不用写该接口的实现类,mybatis会通过接口的完整限定名查找到对应的mapper配置来执行SQL语句。因此namespace的命名必须要跟接口同名。
-2、cache:配置给定命名空间的缓存。
-3、cache-ref:从其他命名空间引用缓存配置
-4、resultMap:用来描述数据库结果集和对象的对应关系
-5、sql:可以重用的SQL块,也可以被其他语句引用。
-6、insert:映射插入语句
-7、update:映射更新语句
-8、delete:映射删除语句
-9、select:映射查询语句
–7、resultMap应用场景:
1.实体类中的属性和数据库表字段名不一致 使用resultMap自己去写映射关系
2.复杂联合查询
–8、select标签中的resultMap和resultType两个属性只能用一个
-1、什么时候使用resultType:
1.当查询结果符合值是基本数据类型 比如 int String Date等
2.当返回数据类型是跟实体类进行映射 然后字段名和属性名一致, 前提mybatis全局配置文件开启自动映射
-2、什么时候使用resultMap:
1.mybatis全局配置文件关闭了自动映射
2.字段名和属性名不一致
3.需要在resultMap标签来自映射关系
–9、在mybatis映射文件中书写sql where语句经常会用到大于小于号,如果直接用大于小于号就会报错
-1、解决办法1:
xml特殊字符可以适用转义字符代替
< < 小于号
> > 大于号
& & 和
' ’ 单引号
" " 双引号
-2、解决办法2:
适用 <![CDATA[ ]]>节,将sql包括起来,在两者之间嵌入不想被解析程序解析的原始数据,解析器不对CDATA区中的内容进行解析,而是将这些数据原封不动地交给下游程序处理。
例如: SELECT * FROM studentinfo WHERE
<![CDATA[ sage > #{startAge} and sage < #{endAge} ]]>
–10、使用@Param注解实现多参数入参
例:
public int updatePwd(@Param(“id”)Integer id,@Param(“pwd”)String pwd);
–11、${参数名} #{参数名} 区别:
$:字符串替换 一般用来传递表名或者字段名 直接拼接到sql语句当中
#:参数值替换 用来传递参数值 通过?占位符来进行参数替换