ORM介绍
ORM-->Object Relational Mapping:对象关系映射
指的是持久化数据和对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。
MyBatis介绍
原始JDBC的操作问题解决方案
MyBatis介绍:
MyBatis入门程序
1.数据准备(数据库与数据表)
2.导入jar包
3.映射配置文件 StudentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
//名称空间
<mapper namespace = "StudentMapper">
//查询,id唯一标识,resultType将来把查询出来的数据封装到哪里
<select id = "selectAll" resultType="com.itheima.bean.Student">
//SQL语句
SELECT * FROM student
</select>
</mapper>
4.核心配置文件(拿到数据库的连接) MyBatisConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
//核心根标签
<configuration>
//字标签,会自动添加相关信息,default将来采用何种配置,要和下面的id保持对应
<environments default="mysql">
<environment id = "mysql">
//事务的支持,采用JDBC支持的事务
<transactionManager type="JDBC">
</transactionManager>
//数据库连接池
<dataSource type = "POOLED">
//第一个是注册驱动
<property name = "driver" value="com.mysql.jdbc.Driver"/>
//第二个是URL
<property name = "url" value="jdbc:mysql://localhost:3306/连接的数据库"/>
//第三个是用户名
<property name = "username" value="root"/>
//第四个是密码
<property name = "password" value="zjl19790118"/>
</dataSource>
</environment>
</environments>
//将映射配置文件加载进来,引入映射配置文件
<mappers>
<mapper resource="StudentMapper.xml"/>
</mappers>
</configuration>
5.编写测试类完成API的使用
StudentTest01
实现查询全部的功能
public void selectAll() throws Exception{
1.加载核心配置文件,并返回一个inputStream字节输入对象并抛异常
InputStream is = Resources getResourceAsStream("MyBatisConfig.xml");
2.获取SqlSession工厂对象,将得到的输入流对象传进去
SqlSessionFactory sqlSessionFactorynew = SqlSessionFactoryBuilder().build(is);
3.通过SqlSession工厂对象的openSession方法获取SqlSession对象,我们最终就靠sqlSession来操作
SqlSession sqlSession = sqlSessionFactory.openSession();
4.执行映射配置文件中的sql语句,并接受结果.selectList就是查询所有的方法
参数是:映射配置文件中的名称空间.id的名称
这样就能找到映射配置文件中的语句了,并且返回集合
List<Student> list = sqlSession.selectList("StudentMapper.selectAll");
5.处理结果,对集合进行遍历
for(Student stu : list){
System.out.println(stu)
}
6.释放资源
sqlSession.close();
is.close();关闭输入流对象
}
6.使用
MyBatis相关API
Resources:MyBatis提供的,不用也是可以的
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
API小结
映射配置文件
StudentMapper.xml
查询功能:
<mapper namespce="StudentMapper">
<select id = "selectById"
resultType="com..Student"
parameterType="java.lang.Integer">//有参数就得这样写
SELECT * FROM student WHERE id = #{id}
</select>
</mapper>
此时测试类:StudentTest
新增功能
或者也可以不提交事务,而是将openSession设置为true(自动提交事务);查询不会影响真实数据,所以不用管理事务
修改功能
删除功能
核心配置文件
有两个environment id数据库,具体指定使用哪个,根据environments default来指定数据库
数据库连接配置文件引入
将value抽取到properties中,并引入
如何引入?
起别名
每次引入的时候,我都需要把包名给写全,有什么办法可以解决?
只给具体的类取别名
对包下所有的类都取别名
数据类型也有内置的别名
核心配置文件小结
传统方式实现DAO层
持久层:直接对DB操作的语句,查询、修改什么的
持久层实现类
业务层:
业务层的实现类:调用持久层的方法
控制层:当做测试类,调用业务层
为了提高代码的复用率,我们将实现类中的实现代码进行抽取,单独存放在utils工具类中。
工具类:不想被外界直接来创建对象,因为里面的功能提供的都是静态的,所以我们第一件事就是私有构造方法。
utils/MyBatisUtils.java工具类
//1.私有构造方法
private MyBatisUtils(){}
//2.声明工厂对象
private static SqlSessionFactory sqlSessionFactory;
//3.提供静态代码块,读取核心配置文件,并给工厂对象赋值
static{
try{
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch(IOException e){
e.printStackTrace();
}
}
//4.提供静态方法,获取SqlSession对象
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
自动开启事务
}
编写完成后,去实现类StudentMapperImpl.java中
实现selectAll方法
以前的配置就不用再写一遍了,美滋滋
根据单个id,查询
插入语句
更新语句
删除功能
控制层测试
控制层-->业务层-->持久层-->DB数据库
控制层(StudentController)业务:调用了业务层(StudentServiceImpl)里的selectAll方法
业务层业务:调用了持久层(StudentMapperImpl)里的方法
持久层业务:StudentMapperImpl就是我们刚刚实现的方法,直接对标操作数据库
最后梳理完,再回到控制层进行测试,结果可以查询出来
其他测试方法:
LOG4J
使用步骤:
1.导入jar包,然后右键jar包 add as library
2.修改核心配置文件(MyBatisConfig.xml)
<settings>
//固定格式
<setting name="logImpl" value="log4j"/>
</settings>
3.在src下编写LOG4J配置文件
使用LOG4J后执行的效果:
参数传递使用的问题
#{}和${} 两种方式的区别
传递表名:如果用#{}是会报错的,只能使用${}参数传递
如下:
模糊查询
Sql语句的模糊查询:
//查询张姓的学生
select * from student where name like '%张'
MyBatis中的模糊查询
控制层:调用了Service层的
业务层:调用了持久层的
持久层:实现对DB的操作(参数是传递进来的条件)
映射文件的配置(二选一)
如果使用#{},需要进行拼接,因为?占位符会把他当成一个字符串
返回主键自增
当我们添加一条数据后,想获取到主键自增后的数据,用于后续的使用。
需要将以前的映射配置文件修改,获取主键自增
<insert id="insert" parameterType = "student">
//新增的selectKey标签
resultType 返回自增后的id的数据类型为int
keyColumn 想要操作数据表中的哪一列,为id列
keyProperty 我查询出来的自增数据,要封装到哪个类中的成员变量
order after 在执行sql语句之前查询还是之后查询
<selectKey resultType="int" keyColumn="id" keyProperty="id" order="AFTER">
select LAST_INSERT_ID() 数据库自带的函数,查询最后一次添加的数据
</selectKey>
insert into student values(#{id},#{name},#{age})
</insert>
添加之前是null
之前我新增这里写的是null,后来我keyProperty将数据封装到student.id中了,所以后面我这里的null变成了插入进来的6