黑马程序员技术交流社区

标题: mybatis(入门一) [打印本页]

作者: Tong心未泯    时间: 2018-3-15 14:22
标题: mybatis(入门一)
本帖最后由 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>










欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2