1.JDBC使用步骤?
1.注册和加载驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取连接
String url="jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8";
String userName="root";
String password="root";
Connection connection = DriverManager.getConnection(url, userName, password);
3.获取Statement/PreparedStatement
Statement statement = connection.createStatement();
4.使用Statement/PreparedStatement 对象执行 SQL 语句
String sql = create table user(id int primary key auto_increment,username varchar(20),password varchar(20))
statement.executeUpdate(sql);
5.获取结果集
resultSet = statement.executeQuery("select * from user");
6.关闭连接
statement.close();
connection.close();
2.Mybatis多参数处理方案?
1、将多个参数封装在对应的实体类中
public User selcetByNameAndAge(String name, Integer age){
User user = new User();
user.setName(name);
user.setAge(age);
return userMapper.selectByNameAndAge(user);
}
UserMapper.xml :
<select id="selcetByNameAndAge" parameterType="com.example.springbootdemo.dao.bean.User" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from user
where name = #{name, jdbcType=VARCHAR} and age = #{age, jdbcType=INTEGER}
</select>
2、用@Param注解修饰参数
public interface UserMapper {
User selcetByNameAndAge(@Param("name") String name, @Param("age") Integer age);
}
UserMapper.xml :
<select id="selcetByNameAndAge" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from user
where name = #{name, jdbcType=VARCHAR} and age = #{age, jdbcType=INTEGER}
</select>
3、用Map或List封装参数
(1) List封装参数:
public List<User> selectUserByNameList(){
List<String> nameList = new ArrayList<String>();
nameList.add("zhangsan");
nameList.add("lisi");
return userMapper.selectUserByNameList(nameList);
}
List<User> selectUserByNameList(List<String> nameList);
UserMapper.xml :
<select id="selectUserByNameList" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from user
where name in
<foreach collection="list" item="name" index="index" open="(" close=")" separator=",">
#{name, jdbcType=VARCHAR}
</foreach>
</select>
(2)Map封装参数:
public List<User> selectUserByNameAndAge(){
Map<String, Object> params = new HashMap<String, Object>();
params.put("name", "zhangsan");
params.put("age", 20);
return userMapper.selectUserByNameAndAge(params);
}
List<User> selectUserByNameAndAge(Map<String, Object> map);
UserMapper.xml :
<select id="selectUserByNameAndAge" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from user
<where>
<if test="name != null and name != ''">
name = #{name, jdbcType=VARCHAR}
</if>
<if test="age != null and age != ''">
and age = #{age, jdbcType=INTEGER}
</if>
</where>
</select>
3.Mybatis的动态SQL和实现批处理?
MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接完整的SQL之后再执行,以达到SQL复用、简化编程的效果。
1 .sql
<mapper namespace="com.qf.mybatis.part2.dynamic.BookDao">
<sql id="BOOK_FIELD">
<!-- 定义SQL片段 -->
SELECT id,name,author,publish,sout
</sql>
<select id="selectBookByCondition" resultType="com.qf.mybatis.part2.dynamiic.Book">
<!-- 通过ID引用SQL片段 -->
<include refid="BOOKS_FIELD" />
FROM t_books
</select>
</mapper>
参数 | 描述 | 取值 |
---|---|---|
collection | 容器类型 | list,array,map |
open | 起始符 | ( |
close | 结束符 | ) |
separator | 分隔符 | , |
index | 下标号 | 从0开始,依次递增 |
item | 当前项 | 任意名称(循环中通过 #{任意名称} 表达式访问) |
Mybatis内置执行器类型ExecutorType有3种
分别是
ExecutorType.SIMPLE: 不做特殊处理,为每个语句的执行创建一个新的预处理语句。
ExecutorType.REUSE: 可以复用预处理语句。
ExecutorType.BATCH:可以批量执行所有更新语句
SIMPLE与BATCH(批量)对比
默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;
而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优;但是批量模式无法返回自增主键
4.Mybatis的#和$的区别?
默认使用的是# 格式:#{名称}
#: 获取外界的值
1.默认 因为 这个属性:statementType=”PREPARED”
2.防止SQL注入
$:需要设置,才可以使用
1.需要设置 statementType=”STATEMENT”
2.无法防止SQL注入
3.不仅仅可以注入值,还可以拼接SQL关键字
使用$注意什么?
1.字符串类型,需要手动添加引号
2.日期类型,不接受默认格式,需要转换
3.可以拼接SQL关键字,比如动态表名、排序等这些 动态的SQL结构
什么时候用$?当我们需要传递的不是字段对应的值的时候,应该用$
5.Mybatis的缓存策略和懒加载?
内存中的一块存储空间,服务于某个应用程序,旨在将频繁读取的数据临时保存在内存中,便于二次快速访问
1. 一级缓存
一级缓存是SqlSession级别的缓存,同一个SqlSession的发起多次同构查询,会将数据保存在一级缓存中。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
注意:无需任何配置,默认开启一级缓存
2.二级缓存
SqlSessionFactory级别的缓存,同一个SqlSessionFactory构建的SqlSession发起的多次同构查询,会将数据保存在二级缓存中
注意:在sqlSession.commit()或者sqlSession.close()之后生效
开启全局缓存
<configuration>
<properties .../>
<!-- 注意书写位置 -->
<settings>
<setting name="cacheEnabled" value="true"/> <!-- mybaits-config.xml中开启全局缓存(默认开启) -->
</settings>
<typeAliases></typeAliases>
</configuration>
懒加载
延迟加载就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称为懒加载。
好处:先从单表查询,需要时在从关联表去关联查询,大大提高数据库性能,因为查询单表比关联多张表查询速度要快得多。
坏处:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。例如在查询学生信息时,要包括学生各科成绩。如果用懒加载,会变成,先查询出所有学生id,然后再拿这些id依次去数据库查询成绩,要与数据库发生很多次连接。但我明明可以用联表查询只和数据库打一次交道。