关于mybatis:MyBatis快速入门

什么是框架?

框架相当于是一个脚手架,外部曾经封装好了很多代码,只须要在其根底上进行开发就能够进步咱们的开发效率。

什么是MyBatis?

  • MyBatis 是一款优良的长久层框架。
  • 它反对自定义 SQL、存储过程以及高级映射。
  • MyBatis 罢黜了简直所有的 JDBC 代码以及设置参数和获取后果集的工作。
  • 官网文档:https://mybatis.org/mybatis-3…

疾速上手

我的mysql版本是5.7

1. 筹备数据

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);


INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

2. 依赖导入

<dependencies>
  
    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.10</version>
    </dependency>

    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.11</version>
    </dependency>


    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
        <scope>provided</scope>
    </dependency>

    <!-- junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
  
</dependencies>

3. JavaBean

用于映射数据库:

  • 类名 = 表名
  • 类成员变量 = 字段
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String email;
}

4. 定义接口

创立 com.nhb.dao.UserDao 接口,并定义接口办法,内容如下:

public interface UserDao {
    List<User> getAll();
}

5. xml映射实现接口

resources 目录下创立 com/nhb/dao/UserDao.xml,实现接口并定义sql,内容如下:

<?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="com.nhb.dao.UserDao">
    
    <select id="getAll" resultType="com.nhb.entity.User">
        SELECT * FROM user
    </select>
    
</mapper>

6. mybatis配置文件

resources 目录下创立 mybatis-config 配置文件,内容如下:

<?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="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://182.61.21.196:3306/demo?useSSL=false"/>
                <property name="username" value="nhb"/>
                <property name="password" value="5740339qq"/>
            </dataSource>
        </environment>
    </environments>

    <!--  关联xml配置的文件  -->
    <mappers>
        <mapper resource="com/nhb/dao/UserDao.xml"/>
    </mappers>
</configuration>

7. 测试单元

test 目录下创立 com/nhb/MyTest.java,内容如下:

public class MyTest {

    private SqlSession sqlSession;

    @Before
    public void init() throws IOException {
        //定义mybatis配置文件门路
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        //传入对应配置文件的输出流,读取配置文件取得SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new
                SqlSessionFactoryBuilder().build(inputStream);

        //通过SqlSessionFactory获取sqlSession对象(了解为数据库连贯)
        sqlSession = sqlSessionFactory.openSession();
    }

    @Test
    public void testUserDao(){
        //通过sqlSession获取Mapper接口的实现类
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> all = userDao.getAll();

        //遍历输入
        for (User user : all) {
            System.out.println(user);
        }
    }

    @After
    public void destroy(){
        //提交事务
        sqlSession.commit();
        //开释资源
        sqlSession.close();
    }
}

高效开发

回绝反复且无意义的货色,晋升开发效率。

  1. IDEA外面设置好 mybatis-configUserDao.xml代码模板。
  2. IDEA装置MyBatisX插件,接口与实体类相互跳转,主动生成实体类,代码生成等。
  3. 能够复制粘贴就别手写,容易出错。

参数获取

单个参数

基本参数

应用 #{} 来取值,写任意名字都能够获取参数,倡议应用接口的参数名来取值。

定义接口办法

User getById(Integer id);

实现接口办法,并定义sql

<select id="getById" resultType="com.nhb.entity.User">
    SELECT * FROM user WHERE id = #{id}
</select>

单元测试

@Test
public void testGetById(){
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    User user = userDao.getById(1);
    System.out.println(user);
}

对象

应用对象中的属性名来获取对应的值

定义接口办法

 User getByBean(User user);

实现接口办法,并定义sql

<select id="getByBean" resultType="com.nhb.entity.User">
    SELECT * FROM user WHERE id = #{id}
          AND name = #{name} AND age = #{age}  AND email = #{email}
</select>

单元测试

@Test
public void testGetByBean(){
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    User newUser = new User(2, "Jack", 20, "test2@baomidou.com");
    User  user = userDao.getByBean(newUser);
    System.out.println(user);
}

多个参数

MyBatis会把多个参数放入一个Map汇合中,如果只有一个参数的时候不必做什么非凡解决。 多个参数的状况下要加上 @Param 来设置参数名。

定义接口办法

User getByMap(@Param("id") Integer id,@Param("name") String name);

实现接口办法,并定义sql

<select id="getByMap" resultType="com.nhb.entity.User">
    SELECT * FROM user WHERE id = #{id} AND name = #{name}
</select>

单元测试

@Test
public void testGetByMap(){
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    User user = userDao.getByMap(1,"Jone");
    System.out.println(user);
}

占位符的区别

#{} 是预编译解决,会将形参变量的值取出,并主动给其增加引号。

${} 是字符串替换,间接替换掉占位符,应用 ${} 的话会导致 sql 注入。

所以为了避免 SQL 注入,能用 #{} 的不要去用 ${}

外围类

sqlSessionFactory

sqlSessionFactory是一个SqlSession的工厂类,次要用来获取SqlSession对象。

//成员办法

SqlSession openSession();

//获取SqlSession对象,传入的参数示意创立的SqlSession是否主动提交
SqlSession openSession(boolean var1);

sqlSession

SqlSession 实现了 Closeable 接口,代表 SqlSession 是能够敞开的,那也就是说SqlSession 代表一种可敞开的连贯。SqlSession 提供了在数据库执行SQL命令所需的所有办法,它还提供了事务的相干操作。

//成员办法

//获取Mapper对象
<T> T getMapper(Class<T> var1); 

//提交事务
void commit(); 

//事物回滚
void rollback(); 

//开释资源
void close(); 

CRUD操作

定义接口办法

//新增
int save(User user);

//删除
int removeById(Integer id);

//批改
int updateById(User user);

//查问
User getById(Integer id);

实现接口办法,并定义sql

<insert id="save">
    INSERT INTO user VALUE(#{id},#{name},#{age},#{email})
</insert>
  
<delete id="removeById">
    DELETE FROM user WHERE id = #{id}
</delete>

<update id="updateById">
    UPDATE user SET name = #{name}, age = #{age}, email = #{email} WHERE id = #{id}
</update>

<select id="getById" resultType="com.nhb.entity.User">
    SELECT * FROM user WHERE id = #{id}
</select>

单元测试

@Test
public void testSave(){
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    User newUser = new User(6, "鸡你太美", 25, "jige@baomidou.com");
    int result = userDao.save(newUser);
    System.out.println(result);
}

@Test
public void testRemoveById(){
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    int result = userDao.removeById(5);
    System.out.println(result);
}


@Test
public void testUpdateById(){
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    User newUser = new User(6, "鸡哥真爱粉", 21, "jige@www.com");
    int result = userDao.updateById(newUser);
    System.out.println(result);
}


@Test
public void testGetById(){
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    User user = userDao.getById(1);
    System.out.println(user);
}

配置文件

上面举几个简略的配置来演示一下,更多配置查官网文档:https://mybatis.org/mybatis-3…

properties

能够应用 <properties><properties/> 读取 properties 配置文件,应用其中的 resource 属性来设置配置文件的门路。而后应用 ${key} 来获取配置文件中的值。

resources 目录下有 jdbc.properties 文件:

jdbc.url = jdbc:mysql://localhost:3306/demo?useSSL=false
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.username = nhb
jdbc.password = ********

mybatis-config.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="jdbc.properties"/>

    <environments default="development">
        <environment id="development">
            <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>

    <!--  关联xml配置的文件  -->
    <mappers>
        <mapper resource="mapper/UserDao.xml"/>
    </mappers>
</configuration>

settings

能够应用该标签来进行一些设置

<settings>
    <!-- 开启主动驼峰命名映射-->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

environments

配置数据库相干的环境,例如事物管理器,连接池相干参数等。

<!-- 设置默认环境-->
<environments default="development">
    <!-- 设置环境惟一标识符-->
    <environment id="development">
        <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>

mappers

将包内的映射器接口实现全副注册为映射器

留神:定义dao接口所在的包,要求xml文件寄存的门路和dao接口的包名要对应,不然会报错!!

<mappers>
    <package name="com.nhb.dao"/>
</mappers>

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理