框架:程序的半成品,是某些功能的封装,简化操作,提高开发效率
一.ORM类型框架:
Object Relational Mapping 对象关系映射
原理:把java中的对象(的属性)和数据库中的表(中的列)进行关联映射,简化了JDBC的增删改查操作
二.mybatis框架的搭建
- 1、新建动态web项目,拷贝jar到lib文件夹下
- 2、在项目下 新建资源目录 在新建db.properties文件
编写数据库的连接信息
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/supermarket
user=root
pwd=cuichen975541045
- 3、在resource下,创建mybatis的配置文件
名字任意.xml
mybatis-3-config.dtd dtd 文档类型声明:规定了mybatis的配置文件
里面必须包含哪些标签,标签必须有哪些属性
<?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>
<!-- 1. 引入数据库连接信息的存放文件 -->
<properties resource="database.properties"></properties>
<!-- 2. 给实体类命名别名:可以通过别名来使用类,否则需要使用使用类的完全限定名 -->
<typeAliases>
<!-- 命名别名方式1 -->
<!--
<typeAlias type="cn.qf.smbms.pojo.UserRole" alias="UserRole"/>
-->
<!-- 方式2:告知Mybatis实体类的位置 -->
<package name="cn.qf.smbms.pojo"/>
</typeAliases>
<!-- 3. 配置数据库的连接信息 -->
<environments default="mysqldb">
<environment id="mysqldb">
<!--
配置事物管理机制
JDBC:使用JDBC来管理事务(官方推荐)
MANAGED:由mybatis进行事物管理
-->
<transactionManager type="JDBC">
<!-- 设置是否自动提交事物:true 自动提交事务 false 非自动提交 -->
<property name="autoCommit" value="true"></property>
</transactionManager>
<!-- POOLED:JDBC默认的连接管理 -->
<dataSource type="POOLED">
<!-- 配置mybatis连接数据库信息 -->
<!-- 获取数据库连接信息方式1:通过读取配置文件获取 -->
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${pwd}"/>
</dataSource>
</environment>
</environments>
<!-- 4. 配置dao接口的映射文件位置 -->
<mappers>
<mapper resource="cn/qf/smbms/dao/UserMapper.xml"></mapper>
</mappers>
</configuration>
database.properties
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/supermarket
user=root
pwd=cuichen975541045
configuration配置:
- properties属性
- typeAliases类型命名别名
- environments 环境
- environment 环境变量
1) transactionManager 事务管理器
2) dataSource 数据源- mappers 映射器
-
4、封装mybatis操作数据库的工具类
mybatis的工作原理:
1)、通过mybatis封装的流读取mybatis的xml配置文件
2)、创建SqlSessionFactoryBuilder 对象
生命周期:局部变量级别,创建完对象后就销毁
作用:创建SqlSessionFactory
3)、通过步骤2得到SqlSessionFactory
生命周期:和程序一致,只要程序运行SqlSessionFactory就存在
作用:创建访问数据库的session
4)、通过SqlSessionFactory 得到session对象
作用:通过session来完成数据库的增删改查操作
生命周期:当session的关闭方法调用后,session消失,
【说明】在session关闭之前可以进行多个SQL操作
session是线程级别
package cn.qf.smbms.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private static SqlSessionFactory factory;
//通过静态代码块读取配置文件
static {
try {
//通过流读取配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
factory=new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取session的方法
public static SqlSession getSqlSession() {
return MyBatisUtil.factory.openSession();
}
//关闭session的方法
public static void closeSqlSession(SqlSession session) {
if (session!=null) {
session.close();
}
}
}
-
5、创建实体类
别名注解 属性名最好和列名一致 -
6、编写dao
【说明】 1)、mybatis基于接口编程
2)、mybatis基于SQL 编写实体类和表映射的文件
在映射文件中 通过namespace把映射文件和接口进行关联
dao层
UserDao.java
package cn.qf.smbms.dao;
import cn.qf.smbms.pojo.User;
//编写关于smbms_user表的增删改查方法
public interface UserDao {
//添加方法
public int addUser(User user);
//修改方法
public int updateUser(User user);
//删除方法
public int deleteUser(int id);
}
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">
<mapper namespace="cn.qf.smbms.dao.UserDao">
<!-- 接口中的每一个方法,在此映射文件中,都要有与之关联的sql语句 -->
<!--
id:对应接口中的方法名
patameterType:方法的参数类型
对应insert update delete 的返回值默认是int类型,无需设置
-->
<insert id="addUser" parameterType="User">
<!-- 编写sql语句 -->
insert into smbms_user(userCode,userName,userPassword)
values
(#{userCode},#{userName},#{userPassword})
</insert>
<update id="updateUser" parameterType="User">
update smbms_user set userCode=#{userCode},userName=#{userName}
where id=#{id}
</update>
<delete id="deleteUser" parameterType="Integer">
delete from smbms_user where id=#{id}
</delete>
</mapper>
service层:(一定要加try-catch!!!)
public boolean addUser(User user) {
//调用dao中的方法
//mybatis把dao中的接口及接口的关联文件自动生成实现类,且实现接口中的方法
//1.通过工具类得到sqlsession
SqlSession session=null;
int ret=0;
try {
session = MyBatisUtil.getSqlSession();
//利用反射 调用的是实现类的方法
ret = session.getMapper(UserDao.class).addUser(user);
//提交事务
session.commit();
}catch(Exception ex){
ex.printStackTrace();
//回滚事务
session.rollback();
}finally {
//关闭session
MyBatisUtil.closeSqlSession(session);;
}
if (ret==1) {
return true;
}else {
return false;
}
}
public boolean update(User user) {
SqlSession session = null;
int ret=0;
try {
session = MyBatisUtil.getSqlSession();
ret = session.getMapper(UserDao.class).updateUser(user);
session.commit();
}catch(Exception ex){
ex.printStackTrace();
session.rollback();
}finally {
MyBatisUtil.closeSqlSession(session);
}
if (ret==1) {
return true;
}else {
return false;
}
}
public boolean deleteUser(int id) {
SqlSession session = null;
int ret = 0;
try {
session = MyBatisUtil.getSqlSession();
ret = session.getMapper(UserDao.class).deleteUser(id);
session.commit();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
session.rollback();
} finally {
MyBatisUtil.closeSqlSession(session);
}
if (ret==1) {
return true;
}else {
return false;
}
}