本帖最后由 Tong心未泯 于 2018-3-15 14:32 编辑
第一天主要内容
1、mybatis的介绍
2、Mybatis的入门
使用jdbc操作数据库存在的问题
Mybatis的架构 Mybatis的入门程序 3、Dao的开发方法 a) 原始dao的开发方法
b) 动态代理方式
4、SqlMapConfig.xml文件说明
一 mybatis 简介 jdbc不足 1. *mybatis 是需要程序员编写SQL *mybatis 输入映射:可以将java对象映射到Statement中SQL中的参数 输出映射:可以将SQL执行的结果封装成java对象
2.jdbc
2.1使用JDBC编程总结
2.1.1 步骤:: 创建数据库
创建工程 导入相应jar包
jdbc编程步骤
*加载驱动类
*创建连接
*编写SQ语句
*创建Statement PrepareStatement
*绑定参数
*执行SQL
*executeUpdate,executeQuery ---result *关闭资源
2.1.3开发效率比较 JDBC>mybaits>HIbernate
2.2jdbc不足
*硬编码
*无法将Sql执行结果映射成java对象
*连接频繁打开和关闭( 数据源 dbcp s3p0 bondeCP druid)
二 mybatis原理2.1:mybatis全局配置文件 sqlMapConfig,xml 数据源,事务,多个Mapper,xml(编写SQL,输入映射) [2.2:SQLSessionFactory
2.3:SqlSession -->crud
2.按mybatis原理执行
* 创建sqlMapConfig.xml在这个文件中配置数据源,事务,配置映射文件Mapper.xml
2>* 创建一个映射文件User,xml
*创建一个Pojo User,java
要求Pojo的属性名的名称和要查询出来的结果集中字段的名称保持一致
<mappers>
<mapper resource ="User,xml>
<mappers/>
三 入门 3.1 需求: 根据id查询用户 根据用户模糊查询用户列表
3.2 搭建环境[size=0.875][size=0.875]
[size=0.875][size=0.875]1. *mybatis全局配置文件 sqlMapConfig,xml 数据源,事务,多个Mapper,xml(编写SQL,输入映射)
[size=0.875][size=0.875]2 创建一个映射文件User.xml
namespace :隔离sql
1.1> <select id ="" paramterType="int resultType=">//resultType 指定的是单挑记录所映射的类型 不管查询出来多少条记录 都写单条记录所映射的类型
select * from user where id=#{id}
<select/>
*创建User,java(Pojo)
]要求Pojo中属性的名称要和查询出来结果集中的字段保持一致,方可完成映射
*创建SqlSessionFactory--> SqlSession -->selectOne("user.findUserById,10);
1 .2>根据用户名模糊查询用户列表
<select id="finduserByUsername" parameterType="string" resultType="User 全类名">
select *from user where username like #{username}
select *from user where username like '%${value}%'
</select>
*创建SqlSessionFactory--> SqlSession -->selectOne("user.finduserByUsername,"张");
2>添加用户 OGNL
<insert id="insertUser" paramterType="User全类">
<selectKey order="ATTER" resultType="int" keyProperty="id">
select last_insert_id()
</selelctKey>
insert into user (username,sex...) valuer(#{username},#{sex}...)
</insert>
3>删除
<delete id="deleteUser" parameterType="int">
delets from user where id=#{id}
</delets>
4>修改
< update id="updateUser" parameterType="User全类名">
update user set username =#{username}...
where id= #{id}
</update>
3.创建SQLSessionFactory
第一步 创建一个SQLSessionFactoryBuilder对象
第二步 加载配置文件
第三步 创建SQLSessionFactory 对象
第四步 创建SQLSession对象
第五步 使用SqlSession对象执行查询,得到User对象
第六步 打印结果
第七部 释放资源
1. #{}和${}的区别
#{} 表示占位符,,如果参数有且只有一个,并且适应简单类型#{任意}
${}表示拼接符,如果输入参数有且只有一个,并且是一个简单类型 ${value} 不能防止sql注入
2.paremeterType :指定参数输入参数类型
3.resultType:指定输出参数类型
指定的是一个Pojo,要求查询的结果集中的字段名称和Pojo的属性名称保持一致方可绑定成功
指定是单条记录所映射的类型
四mybaits开发Dao*基于原始开发
interface UserDao{
public User findUserById(Integer id);
]ublic List<User> findUsersByUsername(String username);
}
class UserDaoImpl implements UserDao{
private SqlSessionFactory SqlSession ;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory ):
this.sqlSessionFactory=sqlSessionFactory;
}
public User findUserById(Integer id){
SqlSession sqlSession =SqlSession .openSqlSession();
sqlSession .selectOne(...);
sqlSession .close():
}
public List<User> findUsersByUsername(String username){
SqlSession sqlSession =SqlSession .openSqlSession();
sqlSession .selectList(...);
sqlSession .close():
}
}
:: selectOne selectList
selectOne查询结果包含0-1条
selectList 查询结果包含0-多条
结论:SQlSessionFactory要以单例的形式管理,单例模式(懒汉 饿汗)
SQLSession存在线程安全,最佳实践,要把它作为方法局部变量
new UserDaoImpl(SQLSessionFactory 单例);
*基于Mapper代理的开发方式(重点)
只需要程序员表写Dao接口和Mapper.xml不需要程序员写Dao接口的实现类 由mybatis自动生成接口的代理方式
dk:基于接口做代理,生成的是接口实现类对象
cglib:基于类做代理,生成类的对象.
Dao接口 Mapper,xml
4大规范:Mapper接口=Dao接口
*要求Mapper.xml的 namespace要和Mapper接口的全类保持一致
*要求Mapper.xml的statementid 要和Mapper接口的方法名称保持一致
*要求Mapper,xml的statement输入参数类型parameterType要和Mapper接口的方法中的形式参数的类型保持一致
*要求Mapper.xml的statement的输出参数的类型和Mapper接口方法的返回值类型保持一致.
SqlSession
接口 proxy=sqlSession.getMapper(接口.class)
proxy.方法();
五 高级 5.1 Mybatis和Hibernate的区别(面试***)
1.ORM Hibernate完全的ORM ,不需要程序员编写sql .JPA(接口) spring dat jpa
Mybatis借鉴ORM思想,需要程序员编写sql
2.企业技术选型
Hibernate 适合企业内部项目
Mybatis 适合互联网开发
5.2 SqlMapConfig.xml 详细配置<?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> <!-- 配置属性 先加载内部属性,再加载外部属性,如果有同名属性会覆盖。 --> <properties resource="dp.properties"> <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/> <property name="jdbc.username" value="hello"/> </properties> <!-- 配置pojo别名 --> <typeAliases> <!-- <typeAlias type="com.itheima.pojo.User" alias="user"/> --> <!-- 扫描包的形式创建别名,别名就是类名,不区分大小写 --> <package name="com.itheima.pojo"/> </typeAliases> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC" /> <!-- 数据库连接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 加载mapper文件 --> <mappers> <!-- resource基于classpath查找 --> <!-- <mapper resource="com/itheima/dao/UserMapper.xml"/> --> <!-- 根据接口名称加载mapper文件 要求:1、mapper映射文件和接口在同一个目录下 2、mapper映射文件的名称和接口名称一致。 3、class就是接口的权限定名 --> <!-- <mapper class="com.itheima.dao.UserMapper"/> --> <!-- 使用扫描包的形式加载mapper文件 推介使用--> <package name="com.itheima.dao"/> </mappers> </configuration>
|