1. JDBC 使用步骤?
六步: 加载驱动、获取链接、创建声明、执行sql、获取结果集、关闭链接。
加载驱动三种方法:
Class.forName(DRIVER);
System.setProperty(“jdbc.drivers”,DRIVER);
new OracleDriver().connect(URL,prop);
2. JDBC的缺点?
分3点:
·使用时连接,不使用时立即释放--解决:连接池
·硬编码,sql语句硬编码到java代码;preparedStatement设置参数硬编码--解决:将sql语句和占位符 全都放到 配置文件
·硬编码/重复操作,结果集获取表字段硬编码、手动赋值到对象属性-- 解决:将结果集自动映射为对象
3. 什么是Mybatis?
分3点:
·开源的轻量级持久层框架,Apache的一个顶级项目;
·让程序员将主要精力放在sql上,mybatis提供自由灵活对象数据映射。
·将输入参数自动进行输入映射,将查询结果自动映射为Java对象。
4. 简述MaBatis 框架的组成?
分5点:
SqlMapConfig.xml : MyBatis 的全局配置文件,配置数据源、事务等Mybatis运行环境。配置所有映射文件路径。
SqlSessionFactory : 会话工厂,通过
SqlSessionFactoryBuilder.build(Resources.getResourceAsStream(sqlMapConfig.xml));读取配置文件创建会话工厂。
SqlSession : 会话,面向用户(程序员)的接口,用来操作数据库(增删改查)
Executor : 执行器,一个接口(基本执行器,缓存执行器)。SqlSession内部通过它来执行数据库操作的
MappedStatement : 底层封装对象,存储sql语句,封装输入参数,结果类型。所以<select id=”findById”> 中的id 也叫 statement id 。
补充:(备忘笔记)
Mybatis使用基本流程:
写pojo类对应的Mapper接口和Mapper.xml(SQL语句);然后写mybatis-config.xml配置文件(缓存,数据库,以及mapper.xml路径);最后在程序中通过 SqlSessionFactory生成的SqlSession来获取Mapper接口的代理类,操作数据库。
5. 配置文件的写法你还能记得么?
不用记啊,XML基本写法就OK:
<?XML version=”1.0” encoding=”utf-8”?>
<!DOCTYPE configuration PUBLIC “别名” “约束地止”>
SqlMapConfig.xml 约束是 config.dtd
Mapper.xml 约束是 mapper.dtd
示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局配置参数,需要时设置 -->
<!-- <settings> -->
<!-- 延迟加载 -->
<!-- <setting name="lazyloadingEnabled" value="true"></setting> -->
<!-- 将积极加载改为消极加载,即 按需加载 -->
<!-- <setting name="aggressiveLazyLoading" value="false"/> -->
<!-- 开启二级缓存 -->
<!-- <setting name="cacheEnabled" value="true"/> -->
<!-- </settings> -->
<!-- 给 类起别名 -->
<typeAliases>
<package name="com.gc.model"/>
<!-- <typeAlias type="com.briup.pojo.Student" alias="Student" /> -->
</typeAliases>
<!-- 数据库连接配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<!-- <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" /> -->
<property name="driver" value="com.mysql.jdbc.Dirver" />
<property name="url" value="jdbc:mysql://localhost:3306/gcbs" />
<property name="username" value="test" />
<property name="password" value="test" />
</dataSource>
</environment>
</environments>
<!-- mapper.xml 路径配置 -->
<mappers>
<!-- <mapper resource="com/briup/mappers/StudentMapper.xml"/> -->
<!-- 和spring整合后,可以通过 mybatis-spring.jar包中的mapper扫描器 配置 -->
<package name="com.gc.mapper"/>
</mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.gc.mapper.StudentMapper">
<select id="findStudentById" resultType="Student"
parameterType="int">
select * from t_student where id=#{id}
</select>
</mapper>
6. Mybatis 中pojo 的mapper映射文件,写sql语句的输入时 #{value} 和 ${value} 有何区别?
#{ value } :表示占位符,在paramterType为简单类型或String时 可以自定义括号内变量名,如#i{id}也可以。若为插入操作#{ }中写po类的属性名
${value} :表示 拼接字符串,在parameterType为简单 数据类型或者string时 只能用value。
SELECT * FROM T_USER WHERE username LIKE ‘%${value}%’
因为拼接字符串可导致sql注入,所以不推荐用${ }
7. 测试基本流程代码: (补充:这流程是Mybatis不使用Mapper而用原始Dao操作的)
@Test
public void findUserById() throws IOException {
//1. 创建会话工厂,传入sqlMapConfig.xml的配置信息
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3. 通过sqlSession 进行数据库操作
User user = sqlSession.selectOne("usermapper.findUserById", 1);
//StudentMapper sm = (StudentMapper)sqlSession.getBean(StudentMapper.class);
System.out.println(user.getPhone());
sqlSession.close();
}