Mybatis
Mybatis介绍:
概念
orm的数据库持久层框架 ,内存中的数据保存到磁盘或者数据库中
ORM概念:
对象关系映射 ,解决面向对象与关系数据库存在的互不匹配的现象的技术
ORM的映射方式
把sql配置再sql文件中,通过不同的sql完成对象实体与数据库关系的相互转换
ORM好处
-
把实体模型和数据库表映射
-
orm框架启动加载映射和数据库配置文件
-
orm对原生的jdbc封装提供了更多的api
-
持久层通过orm提供的便捷的api以对象的方式操作数据库更加便捷
Mybatis操作步骤
-
导入jar包 (mybatis.jar)
-
新建包
实现一个需求:使用mybatis的方式实现CRUD
- 新增dao包/impl(新增接口以及接口实现类),mybatis给我们提供了一个sqlSession(这个sqlSession也类似于我们的jdbc、Dbcp、Druid提供的核心类一样),通过sqlSession去获取到对应的连接。
Mybatis核心配置文件:
src目录下mybatis_configuration.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>
<!--加载jdbc参数的配置文件 -->
<properties resource="jdbc.properties"></properties>
<environments default="dev">
<!--环境参数:可以支持多个环境 eg:开发、本地、云端-->
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!--mybatis有一个非常明显的特点就是将sql文件从代码中分离出去 -->
<!--以下标签就是表示被剥离出代码的sql文件-->
<mappers>
<mapper resource="com/wolfcode/mybatis_test/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
src目录下的jdbc参数的配置文件(jdbc.properties):
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test_1
jdbc.username=root
jdbc.password=123456
怎么通过核心配置文件获取 sqlSession? 建造者模式
MyBatisUtil工具类:
/**
* 提供sqlSesion的方法
* SqlSession来源于SqlSessionFactory
* SqlSessionFactory又是通过SqlSessionFactoryBuilder构建
*/
public class MyBatisUtil {
//先要申明一个SqlSessionFactory
static SqlSessionFactory sqlSessionFactory ;
//通过静态代码块为sqlSessionFactory赋值
static{
try {
//创建一个sqlSessionFactory工具
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//先要加载到我们核心的配置文件 InputStream
InputStream stream = Resources.getResourceAsStream("mybatis_config.xml");
//通过工具构建一个sqlSessionFactory(根据流去构建sqlSessionFactory)
sqlSessionFactory = builder.build(stream);
}catch (Exception e){
e.printStackTrace();
}
}
//获取sqlSession
public static SqlSession getSqlSession(){
// 开启自动提交 也可以在daoImpl中使用 sqlSession.commit()方法进行手动提交
return sqlSessionFactory.openSession(true);
}
}
Dao层:
UserDao接口:
/**
* 用户持久层接口
*/
public interface UserDao {
/**
* 插入用户
* @param user
*/
void insert(T_user user) ;
/**
* 修改用户
* @param user
*/
void update(T_user user) ;
/**
* 删除操作
* @param uid
*/
void delete(Integer uid) ;
/**
*多条记录查询
* @param paramMap
* @return
*/
List<T_user> selectUserList(Map<String,Object> paramMap) ;
/**
* 查询单条查询
* @param uid
* @return
*/
T_user selectSingle(Integer uid);
}
UserDaoImpl:
/**
* 持久层UserDao接口实现类
*/
public class UserDaoImpl implements UserDao {
@Override
public void insert(T_user user) {
//首先获取连接
SqlSession sqlSession = MyBatisUtil.getSqlSession();
// 第一个参数为 命名空间+id(id也就是操作) 第二个参数就是该方法传入的参数即待插入的数据
// 整体代表 指定的xml文件中的sql语句
int insert = sqlSession.insert("com.wolfcode.mybatis_test.dao.UserDao.insert", user);
System.out.println(insert);
sqlSession.commit();
}
@Override
public void update(T_user user) {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
sqlSession.update("com.wolfcode.mybatis_test.dao.UserDao.update",user) ;
}
@Override
public void delete(Integer uid) {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
sqlSession.delete("com.wolfcode.mybatis_test.dao.UserDao.delete",uid);
}
@Override
public List<T_user> selectUserList(Map<String, Object> paramMap) {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
return sqlSession.selectList("com.wolfcode.mybatis_test.dao.UserDao.selectUserList", paramMap);
}
@Override
public T_user selectSingle(Integer uid) {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
return sqlSession.selectOne("com.wolfcode.mybatis_test.dao.UserDao.selectSingle", uid);
}
}
Dao层接口对应的Mapper.xml文件:
UserDao接口对应的UserMappere.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 命名空间 用于将userDao与xml文件进行一个关联 -->
<mapper namespace="com.wolfcode.mybatis_test.dao.UserDao">
<!-- id 对应 UserDao中的方法 -->
<insert id="insert" parameterType="com.wolfcode.mybatis_test.entity.T_user">
insert into t_user values(#{uid},#{uname},#{uphone},#{uidcard},#{rid})
</insert>
<update id="update" parameterType="com.wolfcode.mybatis_test.entity.T_user">
update t_user
-- 动态拼接sql语句 prefix表示前缀 suffixOverrides以什么结尾
<trim prefix="set" suffixOverrides=",">
<if test="uname !=null and uname!=''">
uname=#{uname},
</if>
<if test="uphone !=null and uphone!=''">
uphone=#{uphone},
</if>
<if test="uidcard !=null and uidcard!=''">
uidcard=#{uidcard},
</if>
<if test="rid != null">
rid=#{rid},
</if>
</trim>
-- 如果uid存在 就根据uid更改数据
<if test="uid !=null">
where uid=#{uid}
</if>
</update>
<delete id="delete" parameterType="java.lang.Integer">
delete from t_user where uid=#{uid}
</delete>
<select id="selectSingle" parameterType="java.lang.Integer" resultType="com.wolfcode.mybatis_test.entity.T_user">
select * from t_user where uid=#{uid}
</select>
<select id="selectUserList" parameterType="java.util.Map" resultType="com.wolfcode.mybatis_test.entity.T_user">
select * from t_user
<where>
<if test="uname !=null">
uname=#{uname}
</if>
<if test="uphone !=null">
or uphone=#{uphone}
</if>
</where>
</select>
</mapper>
测试代码:原始的方式进行测试
public class MyTest {
/**
* 多条记录查询
*/
@Test
public void test5_userDao_selectUserList(){
UserDao userDao = new UserDaoImpl();
Map<String,Object> paramMap=new HashMap<String,Object>() ;
//paramMap.put("uname","凯");
paramMap.put("uphone","321");
List<T_user> t_users = userDao.selectUserList(paramMap);
for(T_user user:t_users){
System.out.println(user);
}
}
/**
* 测试单条用户查询
*/
@Test
public void test4_userDao_selectSingle(){
UserDao userDao = new UserDaoImpl();
T_user t_user = userDao.selectSingle(1);
System.out.println(t_user);
}
/**
* 删除测试
*/
@Test
public void test3_userDao_delete(){
UserDao userDao = new UserDaoImpl();
userDao.delete(100);
}
/**
* 测试UserDao更新操作
*/
@Test
public void test2_UserDao_update(){
UserDao userDao = new UserDaoImpl();
T_user t_user = new T_user();
t_user.setUname("凯");
//t_user.setUid(100);
userDao.update(t_user);
}
/**
* 测试UserDao插入
*/
@Test
public void test1_UserDao_insert(){
UserDao userDao= new UserDaoImpl() ;
//创建用户信息
T_user user=new T_user() ;
user.setUid(100);
user.setUname("Jerry");
user.setUphone("18780089624");
user.setUidcard("513701200002020000");
user.setRid(1);
userDao.insert(user);
}
}