JDBC 的优缺点
优点:
1 直观,好理解
缺点:
1 创建了很多对象 Connection ,Statement,Resultset
2 Sql不够灵活,太过于死板
3 Sql语句和业务逻辑代码混在一起
Mybatis框架:
什么是Mybatis : 是一个持久层框架 ,原名叫ibatis Mybatis可以操作数据库,对数据进行增删查改
看作是高级的JDBC ,解决了JDBC 的缺点;
Mybatis能做什么?
1) 注册驱动
2) 创建jdvc中的对象 Connection ,Statement,Result;
3) 执行sql语句,得到结果及
4) 吧结果集转换成java对象,同时吧Java对象放入集合中
5) 关闭资源
6) 实现了java和sql代码之间的解耦合;
核心配置文件:
约束文件
<?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>//配置
<environments default="mysql">//环境配置
<environment id="development">
<settings> //设置
//设置日志 name:使用哪种日志方式 value:可选mybatis自带值
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<transactionManager type="JDBC"/>//事务
//数据源
<dataSource type="POOLED">
//驱动
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>//地址
<property name="username" value="${username}"/>//用户名
<property name="password" value="${password}"/>//密码
</dataSource>
</environment>
</environments>
//找到其他mapper文件的位置 其他的sql语句
<mappers>
//maper resource 指定mapper文件的路径 如果有多个可以使用包扫描
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
Mybatis映射文件:
//约束文件
<?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="org.mybatis.example.BlogMapper"> //namespace 命名空间和接口的全限定名称要一致
//id 方法名 resultType 封装的实体类型要和数据库的字段名一致
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
public static void main(String[] args) {
1) //定义主配置文件的位置信息
String xxx="xxx.xml"
2) //读取mybatis配置文件信息
InputStream resourceAsStream = Resources.getResourceAsStream("xxx");
3) //创建SqlSessionFactorBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
4) //通过SqlSessionFactorBuilder的build方法来加载输入流 获取SqlSessionFactory类
SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
5) //通过openSessionFactor的openSession方法获取SqlSession
SqlSession sqlSession = build.openSession("默认false手动提交");
6) //SqlSession中有非常多的方法 增删查改 事务提交 事务回滚 等..
//推荐getMapper()返回接口的实例掉用其方法
//如果是传统dao方式 sqlSession.select(接口全限定名称.方法名);
sqlSession.getMapper("参数是接口的Class对象");
}
重要对象:
1 SqlSessionFactory:重量级对象,创建时会耗费非常多的资源和时间,在项目中有一个即可
SqlSessionFactory:是一个工厂接口,作用就是创建SqlSession
SqlSessionFactory:接口方法:
OpenSession() 获取一个SqlSession默认是手动提交事务
OpenSession(bolean) 参数是否手动提交
true:创建一个自动提交的SqlSession对象
false:等同于没有参数的OpenSession()
2 SqlSession:对象
SqlSession是通过SqlSessionFactory来获取的 SqlSession他本身是一个接口
DefaultSeqSession是实现类
SqlSession他提供了大量的执行Sql语句的方法
SqlSession 不是线程安全的对象使用步骤
1 在方法内部,执行sql语句前,先获取SqlSession对象
2 调用sqlsession对象的方法 执行sql语句
3 关闭Sqlsession对象
Mybatis代理:
mybatis 创建dao接口的实现类,完成sql语句的操作 mybatis创建一个对象来代替dao的实现功能
使用mybatis代理的要求:
1 . mapper文件中的namespace必须写接口的全限定名称
2 . maper文件中的标签id必须是接口方法的名称
使用代理方式就是调用getMapper("接口的class对象")方法
传参方式
1.ParameterType:
表示参数的类型,指定接口的形参数据类型,这是给mybatis使用的
mybatis再给sql语句赋值时使用(相当于:PreparedStatement.setxxx(位置,值))形参如果是简单数据类型和(String)不用写
2. 如果有多个简单类型的参数:
@Param:命名参数,在方法形参前面使用,这可用在mapper文件中;
3. 可以使用java对象进行赋值
4. 按位置进行传参使用#{arg(下标)} (不建议)
5.可以通过Map集合的key对应的value给sql赋值 (不建议)
占位符:
#{}特点:
1)使用的是PrepareStatement对象,执行sql语句,效率高
2)使用PrepareStatement对象可以避免sql注入问题,sql语句更加安全;
3)常常作为列的值来使用的位于等号的右侧,他的位置和值的数据类型有关;
${}特点:
1)使用的是Statement对象,执行sql语句,执行效率低
2)${}占位符的值使用字符串进行拼接的,有sql注入的风险,代码存在安全问题
3)数据原样使用,不区分数据类型
4)常用作表明或者列明,能保证数据安全的情况下使用