1.JDBC使用步骤?

1.注册和加载驱动

  1. Class.forName("com.mysql.jdbc.Driver");

2.获取连接

  1. String url="jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8";
  2. String userName="root";
  3. String password="root";
  4. Connection connection = DriverManager.getConnection(url, userName, password);

3.获取Statement/PreparedStatement

  1. Statement statement = connection.createStatement();

4.使用Statement/PreparedStatement 对象执行 SQL 语句

  1. String sql = create table user(id int primary key auto_increment,username varchar(20),password varchar(20))
  2. statement.executeUpdate(sql);

5.获取结果集

  1. resultSet = statement.executeQuery("select * from user");

6.关闭连接

  1. statement.close();
  2. connection.close();


2.Mybatis多参数处理方案?

1、将多个参数封装在对应的实体类中

  1. public User selcetByNameAndAge(String name, Integer age){
  2. User user = new User();
  3. user.setName(name);
  4. user.setAge(age);
  5. return userMapper.selectByNameAndAge(user);
  6. }

UserMapper.xml :

  1. <select id="selcetByNameAndAge" parameterType="com.example.springbootdemo.dao.bean.User" resultMap="BaseResultMap">
  2. select
  3. <include refid="Base_Column_List"/>
  4. from user
  5. where name = #{name, jdbcType=VARCHAR} and age = #{age, jdbcType=INTEGER}
  6. </select>

2、用@Param注解修饰参数

  1. public interface UserMapper {
  2. User selcetByNameAndAge(@Param("name") String name, @Param("age") Integer age);
  3. }

UserMapper.xml :

  1. <select id="selcetByNameAndAge" resultMap="BaseResultMap">
  2. select
  3. <include refid="Base_Column_List"/>
  4. from user
  5. where name = #{name, jdbcType=VARCHAR} and age = #{age, jdbcType=INTEGER}
  6. </select>

3、用Map或List封装参数

(1) List封装参数:

  1. public List<User> selectUserByNameList(){
  2. List<String> nameList = new ArrayList<String>();
  3. nameList.add("zhangsan");
  4. nameList.add("lisi");
  5. return userMapper.selectUserByNameList(nameList);
  6. }
  1. List<User> selectUserByNameList(List<String> nameList);

UserMapper.xml :

  1. <select id="selectUserByNameList" resultMap="BaseResultMap">
  2. select
  3. <include refid="Base_Column_List"/>
  4. from user
  5. where name in
  6. <foreach collection="list" item="name" index="index" open="(" close=")" separator=",">
  7. #{name, jdbcType=VARCHAR}
  8. </foreach>
  9. </select>

(2)Map封装参数:

  1. public List<User> selectUserByNameAndAge(){
  2. Map<String, Object> params = new HashMap<String, Object>();
  3. params.put("name", "zhangsan");
  4. params.put("age", 20);
  5. return userMapper.selectUserByNameAndAge(params);
  6. }
  1. List<User> selectUserByNameAndAge(Map<String, Object> map);

UserMapper.xml :

  1. <select id="selectUserByNameAndAge" resultMap="BaseResultMap">
  2. select
  3. <include refid="Base_Column_List"/>
  4. from user
  5. <where>
  6. <if test="name != null and name != ''">
  7. name = #{name, jdbcType=VARCHAR}
  8. </if>
  9. <if test="age != null and age != ''">
  10. and age = #{age, jdbcType=INTEGER}
  11. </if>
  12. </where>
  13. </select>


3.Mybatis的动态SQL和实现批处理?

MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接完整的SQL之后再执行,以达到SQL复用、简化编程的效果。

1 .sql

  1. <mapper namespace="com.qf.mybatis.part2.dynamic.BookDao">
  2. <sql id="BOOK_FIELD">
  3. <!-- 定义SQL片段 -->
  4. SELECT id,name,author,publish,sout
  5. </sql>
  6. <select id="selectBookByCondition" resultType="com.qf.mybatis.part2.dynamiic.Book">
  7. <!-- 通过ID引用SQL片段 -->
  8. <include refid="BOOKS_FIELD" />
  9. FROM t_books
  10. </select>
  11. </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()之后生效
开启全局缓存
是MyBatis中极为重要的调整设置,他们会改变MyBatis的运行行为,其他详细配置可参考官方文档:

  1. <configuration>
  2. <properties .../>
  3. <!-- 注意书写位置 -->
  4. <settings>
  5. <setting name="cacheEnabled" value="true"/> <!-- mybaits-config.xml中开启全局缓存(默认开启) -->
  6. </settings>
  7. <typeAliases></typeAliases>
  8. </configuration>

懒加载

延迟加载就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称为懒加载。
好处:先从单表查询,需要时在从关联表去关联查询,大大提高数据库性能,因为查询单表比关联多张表查询速度要快得多。
坏处:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。例如在查询学生信息时,要包括学生各科成绩。如果用懒加载,会变成,先查询出所有学生id,然后再拿这些id依次去数据库查询成绩,要与数据库发生很多次连接。但我明明可以用联表查询只和数据库打一次交道。