Mybatis学习Day1
Mybatis学习Day1
Mybatis框架的认识:
1.MyBatis是一个ORM的数据库持久化框架。
2.以一定的映射方式,把实体模型和数据库关系的映射
映射的原理:
1、以一定的映射方式,把实体模型和数据库关系的映射
2、ORM框架启动时加载这些映射和数据库配置文件
3、ORM通过对最原生jdbc的封装提供更加便利的操作API
4、Dao通过ORM提供的便捷API以对象的方式操作数据库关系。
常见的ORM持久化框架:
1.JPA:本身是一种ORM规范,不是ORM框架.由各大ORM框架提供实现.
2.DataJpa:对jpa的操作进行封装,让我们使用更加简单.
3.mybatis:本是apache的一个开源项目iBatis,提供的持久层框架包括SQL Maps(Mapper)和Dao,允许开发人员直接编写SQL(更好灵活).(Sql操作方式)
mybatis使用:
1.导包
2.配置xml文件:
<configuration>
<properties resource="jdbc.properties"></properties>
<!--environments:多环境 -->
<environments default="development">
<!--environment:单个环境-->
<environment id="development">
<!--transactionManager:事务-->
<transactionManager type="JDBC"/>
<!--dataSource:连接池 数据源 POOLED是Mybatis内置连接池-->
<dataSource type="POOLED">
<!--四大金刚 驱动 地址 用户名 密码-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--引入sql的xml-->
<mapper resource="cn/itsource/dao/ProductMapper.xml"/>
<mapper resource="cn/itsource/dao/EmployeeMapper.xml"/>
</mappers>
</configuration>
使用mybatis对数据库进行crud:
1查询单个数据库信息
1.1首先创建domain层的表并且提供getset方法以及tostring 还有自己在数据库创建表
1.2:一个实体类对应一个xml进行操作
首先进行单查询:xml配置如下
其操作相应的代码:
//解析读取xml配置文件
Reader resource = Resources.getResourceAsReader("Mybatis-config.xml");
//获取核心对象
SqlSessionFactoryBuilder Builder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = Builder.build(resource);
//获取到他的核心对象session
SqlSession sqlSession = build.openSession();
//调用查询方法括号里面填写命名空间的id点下面的sql语句进行查询
Product o = sqlSession.selectOne("cn.itsource.dao.ProductMapper.findone", 1L);
System.out.println(o);
sqlSession.close();
工具类的抽取:一下代码是crud必备的条件 只有获取到了他的核心对象才能调用mybatis对数据库操作的方法
//解析读取xml配置文件
Reader resource = Resources.getResourceAsReader("Mybatis-config.xml");
//获取核心对象
SqlSessionFactoryBuilder Builder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = Builder.build(resource);
//获取到他的核心对象session
SqlSession sqlSession = build.openSession();
定义一个工具类:一定义静态代码块的方式在加载类的时候已经获取到他的核心对象
public class MyBatisUtil {
private static SqlSessionFactory factoryBuilder = null;
static {
try {
factoryBuilder = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("Mybatis-config.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession openSession(){
return factoryBuilder.openSession();
}
}
sqlSessionFactory:重量级对象 一般一个项目创建一个对象就不要再次创建
sqlSession:轻量级对象 用到的时候就去创建
查询多个的配置:
添加属性的配置:
更改属性的配置:
删除的配置:
其对数的操作几乎都一样 就是获取他的核心对象 去调用它的方法 传入命名空间的ID点下面的子标签的ID也就是CRUD 需要什么参数传什么参数就行
xml配置文件标签的意思:
parameterType:接收值的类型
item:别名
open:以什么开头
close:一身结束
separator:一般就上,号 他就回去给你下面的字段用逗号隔开
index:一般没什么用 他的意思就是索引
解决数据跟新丢失问题:
<update id="dynamicUpdate" parameterType="employee">
update employee
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="age!=null">
age=#{age},
</if>
<if test="sex!=null">
sex=#{sex},
</if>
</set>
where id=#{id}
</update>
测试CRUD代码:
@Test
public void testone()throws Exception{
//获取核心对象
SqlSession sqlSession = MyBatisUtil.openSession();
Product o = sqlSession.selectOne("cn.itsource.dao.ProductMapper.findone", 1L);
System.out.println(o);
sqlSession.close();
}
@Test
public void testall()throws Exception{
//解析读取xml配置文件
Reader resource = Resources.getResourceAsReader("Mybatis-config.xml");
//获取核心对象
SqlSessionFactoryBuilder Builder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = Builder.build(resource);
//获取到他的核心对象session
SqlSession sqlSession = build.openSession();
List<Object> objects = sqlSession.selectList("cn.itsource.dao.ProductMapper.findall");
//遍历打印查询的出啦的数据
objects.forEach(e-> System.out.println(e));
sqlSession.close();
}
@Test
public void testsave()throws Exception{
Product product = productDao.findone(22L);
product.setId(null);
product.setProductName("二狗子");
productDao.save(product);
}
@Test
public void testdelete()throws Exception{
productDao.delect(21L);
}
@Test
public void testupdate()throws Exception{
Product product = productDao.findone(22L);
product.setProductName("听闻尚华");
productDao.updelt(product);
}
@Test
public void testfindall()throws Exception{
List<Product> findall = productDao.findall();
findall.forEach(e-> System.out.println(e));
}
多添加 和多修改的配置:
测试代码: