----------------------------------MyBatis----------------------------------------
MyBatis是一款优秀的持久层框架,用于简化JDBC开发
持久层:
负责将数据保存到数据库的那一层代码
JavaEE三层架构:表现层、业务层、持久层
框架:
半成品软件,是一套可重用的、通用的、软件基础代码模型
在框架的基础上构件软件编写更加高效规范、通用、可扩展
------------------快速入门
1.创建MAVEN工程 导入相应的依赖 日志文件、测试、数据库、mybatis等依赖
2.创建想要操作的数据库中表的对应类,如salary表对应Salary类(com.itheima.pojo.Salary),类中包含salary表中的元素和Getter、Setter、toString的方法
3.在java目录下的resources目录下创建logback、mybatis-config、XxxMapper(如SalaryMapper)等xml文件
>logback日志文件 百度搜
>mybatis-config(核心配置文件)和XxxMapper在MyBatis官网有
>XxxMapper中编写对应表中的sql语句
4.MybatisDemo
//1.记载mybatis核心配置文件,获取SqlsessionFactory(这三行没有必要记住,MyBatis官网有,用的次数不多,一般只用一遍)
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取Sqlsession对象,用来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql
List<Salary> Salarys = sqlSession.selectList("test.selectAll");
System.out.println(Salarys);
//4.释放资源
sqlSession.close();
----------------Mapper代理开发
1.定义与SQL映射文件同名的Mapper接口,并将Mapper接口和SQL映射文件放在同一目录下
>在resource下创建目录如(com/itheima/mapper) 注意要用/而不是.
2.设置SQL映射文件的namespace属性为Mapper接口全限定名(namespace="com.itheima.mapper.SalaryMapper")
3.在Mapper接口中定义方法,方法名就是SQL映射文件中的sql语句的id,并保持参数类型和返回值类型一致
4.编码
1.通过SqlSession的getMapper方法获取Mapper接口的代理对象
2.调用对应方法完成执行
SalaryMapper mapper = sqlSession.getMapper(SalaryMapper.class);
List<Salary> list = mapper.selectAll();
细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
---------------------------实际操作
//当定义的类中属性名称与数据库中属性名称不同时,会出现值为null的情况
解决方法:
Mapper.xml中添加标签如:
<resultMap id="salaryResultMap" type="Salary">
<result column="数据库中属性名称" property="类中属性名称">
.
.
.
</resultMap>
然后将<select id="selectAll" resultType="Salary">
select * from salary;
</select>
改为<select id="selectAll" resultMap="salaryResultMap">
select * from salary;
</select>
//#{}:会将其替换为?,即参数占位符,为了防止sql注入
${}:拼sql,会存在sql注入问题
使用时机:参数传递的时候用#{};
表名或者列名不固定的情况下用${};
参数类型:parameterType:可以省略
特殊字符处理:
1.转义字符
2.CDATA区:
<![CDATA[
]]> 在这个区域写特殊字符 如小于号<
//SQL语句中设置多个参数三种方式:
1.散装参数:需要使用@Param("SQL中的参数占位符名称")
2.实体类封装参数
*只需要保证SQL中的参数名和实体类属性名对应上,即可设置成功
3.map集合
*只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功
//动态SQL
SQL语句会随着用户的输入或外部条件的变化而变化,我们成为动态SQL
Mybits动态SQL标签
1.<if>:用于判断参数是否有值,使用test属性进行条件判断
*存在问题:第一个条件不需要逻辑运算符
*解决方案:
1)使用恒等式让所有条件格式都一样 where 1=1 and 。。。。
2)<where>标签替换where关键字
例如:
select * from user
<where>
<if test="id!=null">
and id = #{id}
</if>
<if test="username!=null">
and username = #{username}
</if>
<if test="password!=null">
and password = #{password}
</if>
</where>
</select>
2.<foreach>
<select id="findById" parameterType="list" resultType="user">
select * from user
<where>
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id};
</foreach>
</where>
</select>
3.sql片段的抽取
<sql id="selectAll"> select * from user</sql>
<select id="findAll" resultType="user">
<include refid="selectAll"></include>
</select>
从多个条件中选择一个
choose(when,otherwise):选择,类似于switch(case,defult)
//进行增删改操作之后,需要提交事务否则会自动回滚
手动提交:
openSession(false)或openSession()
sqlSession.commit()
自动提交
openSession(true)
//返回添加数据的主键
<insert useGeneratedKeys="true" keyProperty="id">
//核心配置文件深入
1.自定义类型处理器
1.定义转换类继承类BaseTypeHandle<T>
2.覆盖4个为实现的方法,其中setNonNullParameter位java程序设置数据到
数据库的回调方法,getNullableResult为查询时 mysql的字符串类型传换成java的Type类型的方法
3.在MyBatis核心配置文件中进行注册
4.测试转换是否正确
//plugins标签
开发步骤:
1.导入通用PageHelper坐标
2.在mybatis核心配置文件中配置PageHelper插件
3.测试分页数据获取