【Mybatis】Mybatis基础(上)

目录

1、简介

1.1、什么是Mybatis

1.2、为什么需要mybatis

2、第一个mybatis程序

2.1、搭建数据库

2.2、新建项目 

2.3、创建一个子模块

2.4、编写代码

2.5、测试

3、CRUD(增查改删)

3.1、namepace

3.2、select

3.3、insert

3.4、update

3.5、delete

3.6、注意事项!

4、使用map(增查改删)

4.1、insert

4.2、select

4.3、update

4.4、delete

5、模糊查询

6、配置解析

6.1、核心配置文件

6.2、环境配置(environments)

6.3、属性(properties)

6.4、类型别名(typeAliases)

6.5、设置(Settings)

6.6、其他配置

6.7、映射器(mappers)


1、简介

1.1、什么是Mybatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

简而言之就是更加方便地使用数据库。

建议边看官方配置文件边学习:mybatis – MyBatis 3 | 简介

1.2、为什么需要mybatis

MyBatis则简化了传统JDBC方法,解决了:①频繁链接和释放数据库的浪费、②SQL语句与代码的高耦合、③参数传递麻烦、④结果解析麻烦。

2、第一个mybatis程序

思路:搭建环境--->导入Mybatis-->编写代码-->测试

项目结构图:

2.1、搭建数据库

CREATE TABLE `user` (    `id` int(11) NOT NULL,    `name` varchar(255) DEFAULT NULL,    `pwd` varchar(255) DEFAULT NULL,    PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2、新建项目 

1.新建一个普通的maven项目

2.删除src目录(父工程)

3.导入依赖

<!--导入依赖-->
<dependencies>
    <!--mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    <!--Junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

2.3、创建一个子模块

  • 编写mybatis的核心配置文件

<?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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>
  • 编写mybatis工具类

//SqlSessionFactory --> SqlSession
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static{
        try {
            //使用mybatis第一步:获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream;
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    //有了sqlSessionFactory就可以获取sqlSession的实例
    //sqlSession完全包含了面向数据库执行SQL命令所需的方法
    public static SqlSession getsqlSession(){
        return sqlSessionFactory.openSession();
    }
}

2.4、编写代码

  • 实体类

public class User {
    private int id;
    private String name;
    private String pwd;
​
    public User() {
    }
    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
​
    public String getPwd() {
        return pwd;
    }
​
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    @Override
    public String toString() {
        return "User{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", pwd='" + pwd + '\'' +
            '}';
    }
}
  • Dao接口

public interface UserDao {
    List<User> getUserList();
}
  • 接口实现类(由原来的UserDaoImpl转变为一个Mapper配置文件)

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.wen.Dao.UserDao">
    <!--这是一个查询语句-->
    <select id="getUserList" resultType="com.wen.pojo.User">
        select * from mybatis.user
    </select>
</mapper>

2.5、测试

Junit测试:

@Test
public void test(){
    //第一步:获取sqlSession对象
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    try{
        //第二步:执行SQL
        //方法一:最新的
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userList = mapper.getUserList();
        //方法二:不推荐
        //List<User> userList = sqlSession.selectList("com.wen.Dao.UserDao.getUserList");
​
        for (User user : userList) {
            System.out.println(user.toString());
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    finally {
        //第四步:关闭sqlSession
        sqlSession.close();
    }
}

注意事项:

在运行过程中可能会有的问题:

  • 配置文件没有注册:

<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
<mappers>
    <mapper resource="com/wen/Dao/UserMapper.xml"/>
</mappers>
</configuration>

  • maven导出资源问题:

<!--在build中配置resources,来防止资源导出失败的问题-->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

3、CRUD(增查改删)

3.1、namepace

namepace中的包名要和Dao/Mapper接口的包名一致。

3.2、select

选择、查询语句

  • id:就是对应的namespace中的方法名

  • resultType:SQL语句执行的返回值

  • parameterType:参数类型

1.编写UserMapper接口

//查询全部用户
List<User> getUserList();
//根据ID查询用户
User getUserById(int id);

2.编写对应的mapper中的SQL语句

<!--这是一个查询语句-->
<select id="getUserList" resultType="com.wen.pojo.User">
    select * from mybatis.user
</select>
​
<select id="getUserById" parameterType="int" resultType="com.wen.pojo.User">
    select * from mybatis.user where id = #{id}
</select>

3.测试

@Test
public void test(){
    //第一步:获取sqlSession对象
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    try{
        //第二步:执行SQL
        //方法一:最新的
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        //方法二:不推荐
        //List<User> userList = sqlSession.selectList("com.wen.Dao.UserMapper.getUserList");
​
        for (User user : userList) {
            System.out.println(user.toString());
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    finally {
        //第四步:关闭sqlSession
        sqlSession.close();
    }
}
​
@Test
public void getUserById(){
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.getUserById(1);
    System.out.println(user);
}

3.3、insert

1.编写UserMapper接口

//插入一个用户
int addUser(User user);

2.编写对应的mapper中的SQL语句

<!--插入语句-->
<insert id="addUser" parameterType="com.wen.pojo.User">
    insert into mybatis.user (id,name,pwd) values(#{id},#{name},#{pwd});
</insert>

3.测试

@Test
//增删改需要提交事务
public void addUser(){
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int rs = mapper.addUser(new User(4, "第四", "123456"));
    if (rs > 0){
        System.out.println("插入成功");
    }
    //提交事务
    sqlSession.commit();
    sqlSession.close();
}

3.4、update

1.编写UserMapper接口

//修改用户
int updateUser(User user);

2.编写对应的mapper中的SQL语句

<!--修改语句-->
<update id="updateUser" parameterType="com.wen.pojo.User">
    update mybatis.user set name = #{name},pwd = #{pwd} where id = #{id}
</update>

3.测试

@Test
public void updateUser(){
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int rs = mapper.updateUser(new User(4, "小四", "123"));
    sqlSession.commit();
    sqlSession.close();
}

3.5、delete

1.编写UserMapper接口

//删除用户
int deleteUser(int id);

2.编写对应的mapper中的SQL语句

<!--删除语句-->
<delete id="deleteUser" parameterType="int">
    delete from mybatis.user where id = #{id}
</delete>

3.测试

@Test
public void deleteUser(){
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int rs = mapper.deleteUser(4);
    sqlSession.commit();
    sqlSession.close();
}

3.6、注意事项!

  • 增删改需要提交事务,否则无法修改

4、使用map(增查改删)

实体类或数据库中的表,字段,参数过多,应考虑使用Map。

  • Map传递参数,直接在SQL中取出key即可

  • 对象传递参数,直接在SQL中取出对象属性即可

  • 只有一个基本类型参数的情况下,可以直接在SQL中取到

  • 多个参数用map,或者注解!

4.1、insert

//使用Map方法来添加
int addUser_map(Map<String,Object> map);
<!--插入语句,使用map,传递map中的key-->
<insert id="addUser_map" parameterType="map">
    insert into mybatis.user (id,name,pwd) values(#{userid},#{username},#{userpwd});
</insert>
@Test
//通过map来添加
public void addUser_map(){
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("userid",4);
    map.put("username","老四");
    map.put("userpwd","741");
    mapper.addUser_map(map);
    //提交事务
    sqlSession.commit();
    sqlSession.close();
}

4.2、select

//使用map查询用户
User getUserById_map(Map<String,Object> map);
<select id="getUserById_map" parameterType="map" resultType="com.wen.pojo.User">
    select * from mybatis.user where id = #{userid} and name = #{username}
</select>
//通过map查询
@Test
public void getUserById_map(){
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("username","老四");
    map.put("userid",4);
    System.out.println(mapper.getUserById_map(map));
    sqlSession.close();
}

4.3、update

//通过map修改用户
int updateUser_map(Map<String,Object> map);
<!--通过map修改语句-->
<update id="updateUser_map" parameterType="map">
    update mybatis.user set name = #{username},pwd = #{userpwd} where id = #{userid}
</update>
//通过map修改
@Test
public void updateUser_map(){
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("username","李四");
    map.put("userpwd","423");
    map.put("userid",4);
    mapper.updateUser_map(map);
    sqlSession.commit();
    sqlSession.close();
}

4.4、delete

//通过map删除用户
int deleteUser_map(Map<String,Object> map);
<!--通过map删除语句-->
<delete id="deleteUser_map" parameterType="map">
    delete from mybatis.user where id = #{userid}
</delete>
//通过map删除
@Test
public void deleteUser_map(){
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("userid",4);
    mapper.deleteUser_map(map);
    sqlSession.commit();
    sqlSession.close();
}

5、模糊查询

  • java代码执行的时候,传递通配符% %

List<User> userList = mapper.getUserLike("%老%");
  • 在SQL拼接中使用通配符

 select * from mybatis.user where name like "%"#{value}"%"
//模糊查询
List<User> getUserLike(String value);
<!--模糊查询-->
<select id="getUserLike" resultType="com.wen.pojo.User">
    select * from mybatis.user where name like "%"#{value}"%"
</select>
//模糊查询
@Test
public void getUserLike(){
    SqlSession sqlSession = MybatisUtils.getsqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> userList = mapper.getUserLike("老");
    //List<User> userList = mapper.getUserLike("%老%");
    System.out.println(userList);
    sqlSession.close();
}

注意:SQL注入

<!--
    select * from mybatis.user where id = ?
    select * from mybatis.user where id = 1 or 1=1
-->

6、配置解析

6.1、核心配置文件

  • mybatis-config.xml

  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

6.2、环境配置(environments)

mybatis可以配置成适应多种环境

注意:虽然可以配置多个环境,但每个SqlSesssionFactory实例只能选择一种环境

提升:学会配置多套运行环境

Mybatis默认的事务管理器:JDBC,连接池:POOLED

6.3、属性(properties)

可以通过properties属性来实现引用配置文件

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.properties】

注意易错事项:

编写配置文件:db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456

在在mybatis-config.xml 核心配置文件中引入

<!--引入外部配置文件-->
<properties resource="db.properties"/>
<!--直接增加一些配置属性-->
<!--
    <properties resource="db.properties">
    <property name="username" value="root"/>
    </properties>
-->
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments>

注意:

  • 可以直接引入外部文件

  • 可以直接增加一些配置属性

  • 如果两个文件有同一个字段,优先使用外部配置文件的内容

6.4、类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字。它仅用于 XML 配置,意在降低冗余的全限定类名书写。

  • 存在的意义仅在于用来减少类完全限定名的冗余

在mybatis-config.xml中添加以下代码:

<!--可以给实体类起别名-->
<typeAliases>
    <typeAlias type="com.wen.pojo.User" alias="user"/>
</typeAliases>

也可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean,比如:

扫描实体类的包,它的默认别名就位这个类的【类名】,建议首字母小写!!

<!--可以给实体类起别名-->
<typeAliases>
    <package name="com.wen.pojo"/>
</typeAliases>

注意:

  • 在实体类比较少的情况下,建议使用第一种方式【DIY别名】

  • 实体类很多的情况下,建议使用第二种方式【自动扫描】

  • 第一种可以DIY别名,第二种不行,但可以通过在实体类上增加注解

//实体类
@Alias("hello")
public class User {.....}

【易错点】:在使用注解时,UserMapper.xml里的每个参数都要用注解里的参数,否则会出现注解没有生效的情况!!!详情看:mybatis框架Alias注解异常解决方法_weixin_45474989的博客-CSDN博客

例图:

正确的

错误的

 

6.5、设置(Settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。

  • logImpl(日志实现)

  • lazyLoadingEnavled(懒加载)

  • cacheEnabled(缓存开启关闭)

 

一个配置完整的Settings元素的实例:

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

6.6、其他配置

6.7、映射器(mappers)

MapperRegistry:注册绑定mapper文件

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。

在mybatis-config.xml中添加以下代码:

方式一【推荐使用】:

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mappers>
        <mapper resource="com/wen/Dao/UserMapper.xml"/>
    </mappers>
</mappers>

方式二:

<!-- 使用完全限定资源定位符(URL) -->
<mappers>
    <mapper url="file:/E:/JavaEE/Demos/Mybatis/Mybatis-Study/Mybatis-02/src/main/java/com/wen/Dao/UserMapper.xml"/>
</mappers>

方式三:

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
    <mapper class="com.wen.Dao.UserMapper"/>
</mappers>

注意:

  • 接口和他的Mapper配置文件必须同名!

  • 接口和他的Mapper配置文件必须在同一个包下!

方式四:

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
    <package name="com.wen.Dao"/>
</mappers>

注意:

  • 接口和他的Mapper配置文件必须同名!

  • 接口和他的Mapper配置文件必须在同一个包下!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code_Xiaotian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值