A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Mybatis介绍
  • MyBatis本是apache的一个开源项目,前身叫iBatis,后来迁移到google code后改名mybatis
  • MyBatis是一个持久层框架,对jdbc的操作数据库的过程进行封装
Mybatis入门程序mybatis下载
  • mybaits的代码由github.com管理
  • 下载地址:https://github.com/mybatis/mybatis-3/releases
    • mybatis-3.2.7.jar----->mybatis的核心包
    • lib文件夹------------->mybatis的依赖包所在
    • mybatis-3.2.7.pdf----->mybatis使用手册
  • 使用时把核心包和依赖包都拷贝到lib中,同时加上数据库驱动包
业务需求
  • 根据用户id查询一个用户
  • 根据用户名称模糊查询用户列表
  • 添加用户
  • 更新用户
  • 删除用户
环境搭建
  • 创建java工程
  • 加入jar包
    • 加入mybatis核心包、依赖包、数据驱动包
    • builtpath(java工程需要手动builtpath)
  • 加入配置文件
    • 创建资源文件夹config,加入log4j.properties和sqlMapConfig.xml配置文件
    [AppleScript] 纯文本查看 复制代码
    "log4j.properties"
    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n


[XML] 纯文本查看 复制代码
"sqlMapConfig.xm"
<?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>
    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
</configuration>


  • SqlMapConfig.xml是mybatis核心配置文件,配置文件内容为数据源、事务管理
创建pojo
  • pojo类作为mybatis进行sql映射使用,po类通常与数据库表对应
sql映射文件
  • 在config下的sqlmap目录下创建sql映射文件User.xml
[XML] 纯文本查看 复制代码
<?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
</mapper>


加载映射文件
  • mybatis框架需要加载Mapper.xml映射文件
  • 将users.xml添加在SqlMapConfig.xml
[XML] 纯文本查看 复制代码
<mappers>
    <mapper resource="sqlmap/User.xml" />
</mappers>


创建测试类测试程序


[XML] 纯文本查看 复制代码
<!--
    #{}    select * from user where id = ?    占位符  ? ==  '五'
    ${}    select * from user where username like '%五%'   字符串拼接  
    select * from user where username like "%${value}%"  用$的时候参数只能为value,不防止sql注入
-->



[Java] 纯文本查看 复制代码
public class MyBatisDemo1 {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void testJunit() throws IOException {
        String resource = "SqlMapConfig.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        //InputStream is = this.getClass().getClassLoader().getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    }
    @Test
    public void findUserById() {//实现根据id查询用户
        SqlSession session = sqlSessionFactory.openSession();
        User user = session.selectOne("test.selectUserById",10);
        System.out.println(user);
        session.close();
    }
    @Test
    public void findUserByUserName() {//实现根据用户名模糊查询用户
        SqlSession session = sqlSessionFactory.openSession();
        List<User> selectList = session.selectList("test.selectUserByUserName", "王");
        for (User user : selectList) {
            System.out.println(user);			
        }
        session.close();
    }
    @Test
    public void insertNewUser() {//实现添加用户
        SqlSession session = sqlSessionFactory.openSession();
        User user = new User("二狗", "男", new Date(), "二狗街道");
        int row = session.insert("test.insertNewUser", user);
        System.out.println(user.getId());
        "需要进行事务提交"
        session.commit();
        session.close();
    }
    @Test
    public void updateUser() {//修改用户
        SqlSession session = sqlSessionFactory.openSession();
        User user = new User(29,"二狗", "女", new Date(), "二狗新街");
        int row = session.insert("test.updateUser", user);
        System.out.println(row);
        session.commit();
        session.close();
    }
    @Test
    public void delUser() {//删除用户
        SqlSession session = sqlSessionFactory.openSession();
        int row = session.insert("test.delUser", 29);
        System.out.println(row);
        session.commit();
        session.close();
    }
}



[XML] 纯文本查看 复制代码
<mapper namespace="test">
    <select id="selectUserById" parameterType="Integer" resultType="com.itcast.mybatis.domian.User">
        SELECT * FROM user where id = #{id}
    </select>
    <select id="selectUserByUserName" parameterType="String" resultType="com.itcast.mybatis.domian.User">
        SELECT * FROM user where username like "%"#{username}"%";
    </select>
    <insert id="insertNewUser" parameterType="com.itcast.mybatis.domian.User">
        <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="Integer">
            SELECT LAST_INSERT_ID(); 
        </selectKey>
        insert into user (username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>
    <update id="delUser" parameterType="Integer">
        delete from user where id = #{id}
    </update>
</mapper>




Mybatis与Hibernate的区别(面试)
  • Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句
    • mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象
  • Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。
    • 但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大
  • Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。
    • 但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行
  • 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好
Dao开发方法
  • 使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法
1.原始Dao
[Java] 纯文本查看 复制代码
"原始Dao开发,接口+实现类"
public class UserDaoImpl implements UserDao {
    @Autoware
    private SqlSessionFactory sqlSessionFactory;
    "通过用户ID查询一个用户"
    public User selectUserById(Integer id){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession.selectOne("test.findUserById", id);
    }
}

2.Mapper动态代理
  • Mapper接口开发需要遵循以下规范:
    • Mapper.xml文件中的namespace与mapper接口的类路径相同
    • Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
    • Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
    • Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

[Java] 纯文本查看 复制代码
"Mapper动态代理开发,就定义接口,不用实现类"
public interface UserMapper {
    public User findUserById(Integer id);
}

[Java] 纯文本查看 复制代码
@Autoware
private SqlSessionFactory sqlSessionFactory;
public void testMapper() throws Exception {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    System.out.println(userMapper.findUserById(10));
    sqlSession.commit();
    sqlSession.close();
}

SqlMapConfig.xml配置文件
  • properties(属性)
  • settings(全局配置参数)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境集合属性对象)
    • environment(环境子属性对象)
      • transactionManager(事务管理)
      • dataSource(数据源)

  • mappers(映射器)
properties
[XML] 纯文本查看 复制代码
<properties resource="db.properties">
    <!-- 在properties内部用property定义属性 -->
    <!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 -->
    <property name="jdbc.username" value="root123" />
    <property name="jdbc.password" value="root123" />
</properties>
<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>

typeAliases(类型别名)
[XML] 纯文本查看 复制代码
<typeAliases>
    <!-- 单个别名定义 -->
    <typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />
    <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
    <package name="cn.itcast.mybatis.pojo" />
    <package name="其它包" />
</typeAliases>


  • 在mapper.xml配置文件中,就可以使用设置的别名了,别名大小写不敏感
mappers
  • class : 此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中
  • package : 此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中
  • 项目中用package
[XML] 纯文本查看 复制代码
<mappers>
    <mapper resource="sqlmap/User.xml" class="" url=""/>
    <mapper class="com.itheima.mybatis.mapper.UserMapper" />
    "此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中"
    <package name="com.itheima.mybatis.mapper"/>
    "此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中"
    <mapper url="决定地址,不实用" />
</mappers>








0 个回复

您需要登录后才可以回帖 登录 | 加入黑马