Mybatis学习一

来源:互联网 发布:mac 搜狗五笔不能用 编辑:程序博客网 时间:2024/06/03 03:46

1、MyBatis介绍

MyBatis 本是apache的一个开源项目iBatis,它是一个基于java的持久层框架。
MyBatis支持普通SQL查询,存储过程和高级映射的持久层框架,使用比较简单,使用XML或者注解配置和原始映射,将接口和java的POJO(Plain Old Java Objects)映射成数据库中的记录。

2、MyBatis的环境搭建

java环境
eclipse
mysql
mybatis运行环境(jar包)

这里写图片描述

3、框架流程

这里写图片描述

1、SqlMapConfig.xml

SqlMapConfig.xml是mybatis的全局配置文件,配置数据库,数据源,事务mybatis运行环境。

2、SqlSessionFactory

根据配置文件SqlMapConfig.xml创建工厂

3、SqlSesssion

通过工厂来创建SqlSession会话,在这里操作数据库,完成SQL的增,删,改,查

4、Executor

执行SqlSession语句,操作数据库执行。

5、mapped statement

对操作数据库存储封装(sql语句,输入参数,输出结果等)

4、入门示例

1、SqlMapConfig.xml文件的配置

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties resource="db.properties">        <!--properties中还可以配置一些属性名和属性值 -->        <!-- <property name="jdbc.driver" value=""/> -->    </properties>    <environments default="development">        <environment id="development">        <!-- 使用jdbc事务管理,事务控制由mybatis-->            <transactionManager type="JDBC" />        <!-- 数据库连接池,由mybatis管理-->            <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>    <!-- 加载 映射文件 -->    <mappers>        <mapper resource="sqlmap/User.xml"/>    </mappers></configuration>

数据库文件配置

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/studentjdbc.username=rootjdbc.password=123456

2、POJO类

简单的JavaBean类

package com.example.po;public class User {    private String name;    private int age;    private String cls;    private int id;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getCls() {        return cls;    }    public void setCls(String cls) {        this.cls = cls;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    @Override    public String toString() {        return "User [name=" + name + ", age=" + age + ", cls=" + cls + ", id="                + id + "]";    }}

3、映射文件User.xml文件

在映射文件中写SQL语句
参数
id:标识映射文件的sql标识
parameterType:参数类型
resultType:返回值类型

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间--><mapper namespace="test">    <select id="findUserById" parameterType="int" resultType="com.example.po.User">        SELECT * FROM USER WHERE id=#{value}    </select></mapper>

4、在SqlMapConfig.xml中加载映射文件

<mappers>        <mapper resource="sqlmap/User.xml"/>    </mappers>

5、单元测试

package mybatis.jdbc;import java.io.IOException;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;import com.example.po.User;public class JdbcTest {    @Test    public void findUserByIdTest() throws IOException {        // mybatis配置文件        String resource = "SqlMapConfig.xml";        // 得到配置文件流        InputStream inputStream = Resources.getResourceAsStream(resource);        // 创建会话工厂,传入mybatis的配置文件信息        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()                .build(inputStream);        // 通过工厂得到SqlSession        SqlSession sqlSession = sqlSessionFactory.openSession();        // 通过SqlSession操作数据库        // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id        // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数        // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象        // selectOne查询出一条记录        User user = sqlSession.selectOne("test.findUserById", 1);        System.out.println(user);        // 释放资源        sqlSession.close();    }}

5、细节

1、参数

parameterType:输入的参数类型
resultType指定输出结果的类型

2、#{}和¥{}

#{}是一个点位符,接收的参数可以是简单类型,pojo,hashmap,
${}表示一个拼接的符号,会引起sql注入,因此不建议使用。

3、selectOne和selectList

selectOne查询一条记录进行映射。如果使用selectOne实现,也可以使用selectList实现(list中只有一条记录)

selectList表示查询列表进映射。如果有多条的话,使用selectOne则会报错。

6、传统Dao开发遇到的问题

1、dao接口实现类方法中存在大量的重复代码
2、存在很多 硬编码,不等于维护和修改
3、调用sqlsession方法时传入的变量,使用泛型,如果出错,编译时候也不会报,不利于开发。
解决办法mapper代理方法

7、mapper代理方法

1、定义接口

package com.example.mapper;import com.example.po.User;public interface UserMapper {    public User findUserById(int id) throws Exception;}

2、UserMapper.xml映射文件

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.UserMapper">    <select id="findUserById" parameterType="int" resultType="com.example.po.User">        SELECT        * FROM USER WHERE id=#{value}    </select></mapper>

3、SqlMapConfig.xml文件中配置

<!-- 加载 映射文件 -->    <mappers>        <mapper resource="sqlmap/User.xml" />        <package name="com.example.mapper"/>    </mappers>

4、测试用例

public class UserMapperTest {    private SqlSessionFactory sqlSessionFactory;    // 此方法是在执行testFindUserById之前执行    @Before    public void setUp() throws Exception {        // 创建sqlSessionFactory        // mybatis配置文件        String resource = "SqlMapConfig.xml";        // 得到配置文件流        InputStream inputStream = Resources.getResourceAsStream(resource);        // 创建会话工厂,传入mybatis的配置文件信息        sqlSessionFactory = new SqlSessionFactoryBuilder()                .build(inputStream);    }    //用户信息的综合 查询    @Test    public void testFindUserById() throws Exception {        SqlSession sqlSession = sqlSessionFactory.openSession();        //创建UserMapper对象,mybatis自动生成mapper代理对象        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);        //调用userMapper的方法        User user = userMapper.findUserById(1);        System.out.println(user);    }}

8、Sql片段

为什么使用sql片段
1、在进行Sql查询的时候,可能都要进行一些统一的操作。比如判断用户是否输入内容,如果没有内容,则不进行后续sql查询
2、一些比较常用的sql语句抽取出来,组成sql片段。
示例如下:
这里写图片描述

2 0
原创粉丝点击