MyBatis-CRUD

CRUD

select

select:选择,查询语句。

select标签中,有几个常用的属性:

  • id:对应的namespace中的方法名
  • resultType:sql语句执行的返回值
  • parameterType:参数类型

select标签案例

1、编写接口

User getUserById(int id);

2、编写对应接口的mapper.xml文件中的sql语句

<select id="getUserList" resultType="com.llx.pojo.User">
      select * from user;
</select>

3、编写测试类进行测试

@Test
    public void testGetUserList(){
        // 1. 获取SqlSession 执行sql使用的
        SqlSession session = MyBatisUtils.getSession();

        // 2.通过 session    获得接口
        UserMapper mapper = session.getMapper(UserMapper.class);

        List<User> users = mapper.getUserList();
        for (User user : users) {
            System.out.println(user);
        }
        session.close();
    }

insert

insert:插入语句。

在insert标签中,常用的属性有:

  • id:对应的namespace中的方法名
  • parameterType:参数类型

编写对应Mapper.xml文件中的sql语句:

<!--对象中的属性,可以直接取出来-->
    <insert id="addUser" parameterType="com.llx.pojo.User">
        insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd});
    </insert>

update

update:更新语句。

在update标签中,常用的属性有:

  • id:对应的namespace中的方法名
  • parameterType:参数类型

编写对应的Mapper.xml文件中的sql语句:

<update id="updateUser" parameterType="com.llx.pojo.User">
        update mybatis.user set name=#{name},pwd=#{pwd}  where id = #{id} ;
</update>

delete

delete:删除语句。

在delete标签中,常用的属性有:

  • id:对应的namespace中的方法名
  • parameterType:参数类型

编写对应的Mapper.xml文件中的sql语句:

<delete id="deleteUser" parameterType="int">
        delete from user where id = #{id};
</delete>

需要注意的是:在进行增删改操作的时候,需要提交事务,这样才能将数据持久化到数据库中!

session.commit();

可能会遇到的错误:

  • 在写sql语句的时候,标签不要匹配错,否则程序会报错!
  • resource在绑定mapper的时候,需要使用路径!
  • 程序的配置文件必须要符合规范!
  • 出现NullPointerException,没有注册到资源!
  • 输出的xml文件中存在中文乱码问题!
  • maven的资源没有导出!

map

当遇到实体类或者数据库中的表、字段或者参数过多,或者我们不知道用户会传什么样的值这样的情况时,应当考虑使用Map。

编写接口的方法:

int addUser2(Map<String,Object> map);

编写sql语句:

 <!--对象中的属性,可以直接取出来    传递map的key-->
    <insert id="addUser" parameterType="map">
        insert into mybatis.user (id, pwd) values (#{userid},#{passWord});
    </insert>

编写测试方法:

@Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);


        Map<String, Object> map = new HashMap<String, Object>();

        map.put("userid",5);
        map.put("passWord","2222333");

        mapper.addUser2(map);

        sqlSession.close();
    }
  • 使用Map传递参数,可以直接在sql中取出key即可(key可以随意定义)!
    • 此时的参数类型是:parameterType="map"
  • 使用对象传递参数时,直接在sql中取出对象的属性即可!
    • 此时的参数了类型是:parameterType="Object"
  • 只有一个基本类型参数(参数类型可以不写)的情况下,可以直接在sql中取到!

在有多个参数的情况下使用Map或者注解(@Param)!

模糊查询

在写模糊查询的时候,通配符的使用方式有两种。

1、在执行java代码的时候,传递通配符 % %(这种方式是比较安全的)

List<User> userList = mapper.getUserLike("%李%");

2、在sql拼接中使用通配符 (会存在sql注入)

select * from user where name like "%"#{value}"%"

配置解析

核心配置文件

Mybatis有一个核心配置文件:mybatis-config.xml。Mybatis的配置文件中包含了影响Mybatis行为的设置和属性信息。

具体的配置标签有:

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

environments(环境配置)

Mybatis可以配置成适应多种环境。

但是尽管可以配置多个环境,每个SqlSessionFactory 的实例只能选择一种环境

transactionManager(事务管理器)

Mybatis默认的事务管理器是 JDBC。

dataSource(数据源)

dataSource默认是 POOLED(池化)。

properties(属性)

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

这些属性都是可以外部配置而且可以动态替换的。我们既可以在典型的java属性文件中进行配置,也可以通过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

然后在核心文件中进行引入:

<!--引入外部配置文件-->
    <properties resource="db.properties">
        <property name="username" value="root"/>
        <property name="pwd" value="11111"/>
    </properties>

引入配置文件后,可以修改property中的value:

<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${pwd}"/>

注意:

  • 可以直接引入外部文件
  • 可以在其中增加一些属性配置
  • 如果两个文件有同一个字段,那么优先使用外部配置文件的

typeAliases(类型别名)

类型别名是为java类型设置一个较短的名字。它存在的意义仅仅是在于 用来减少类完全限定名的冗余。

方式1

给某个包下的具体类起别名:

<typeAliases>
        <typeAlias type="com.llx.pojo.User" alias="User"/>
</typeAliases>

方式2

可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean。例如:扫描实体类的包,它的默认别名就为这个类的 类名,首字母小写!

<typeAliases>
    <package name="com.llx.pojo"/>
</typeAliases>

在实体类比较少的时候,可以使用第一种方式。

如果实体类比较多,使用第二种方式比较好。

第一种方式可以自己定义别名,但是第二种方式不行,如果非要修改就需要在实体类上增加注解。

@Alias("user")
public class User {}

settings(设置)

settings 是Mybatis中非常重要的调整设置,它们会改变Mybatis 的运行时行为。

 <settings>
        <!--下划线命名转驼峰命名-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--指定Mybatis所用日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
 </settings>

mappers(映射器)

MapperRegistry:注册绑定我们的Mapper文件。

绑定方式有三种:

方式1 推荐使用的方式

使用 resource,其后跟的是xml文件的具体路径。

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

方式2

使用 class 文件绑定注册。

<mappers>
    <mapper class="com.llx.mapper.UserMapper"/>
</mappers>

方式3

使用扫描包进行注册。name 后面跟到包名即可。

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

注意:

  • 接口和其Mapper配置文件必须同名
  • 接口和其Mapper配置文件必须在同一个包下

生命周期和作用域

一个程序的完整执行过程,可以表示如下:

生命周期和作用域是至关重要的,因为错误的使用会导致严重的并发问题。

SqlSessionFactoryBuilder:

  • SqlSessionFactoryBuilder一旦被创建,就不需要它了。
  • SqlSessionFactoryBuilder是一个局部变量。

SqlSessionFactory:

  • SqlSessionFactory,可以理解为 数据库连接池。
  • SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例。
  • SqlSessionFactory的最佳作用域是应用作用域。
  • 最简单的就是使用单例模式或者静态单例模式。

SqlSession:

  • SqlSession是连接到连接池的一个请求。
  • SqlSession的实例不是线程安全的,因此不能够被共享,所以它的最佳作用域是请求或者方法作用域。
  • SqlSession用完之后需要关闭,否则会占用资源。

SqlSessionFactory在程序运行过程中,只可创建一次。SqlSession和Mappr可以创建多个,一个SqlSession可以有多个Mapper。

属性名和字段名不一致

当数据库中的字段名和实体类中的属性名不一致的时候,执行sql语句的时候会得到意料之外的结果。

解决属性名和字段名不一致的方法有两种。

方式1 起别名

起别名。

<select id="getUserById" resultType="com.llx.pojo.User">
    select id,name,pwd as password from mybatis.user where id = #{id}
</select>

方式2 使用resultMap

resultMap,结果集映射。

<!--结果集映射-->
<resultMap id="UserMap" type="User">
    <!--column数据库中的字段,property实体类中的属性-->
    <result column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="pwd" property="password"/>
</resultMap>

<select id="getUserById" resultMap="UserMap">
    select * from mybatis.user where id = #{id}
</select>

resultMap 元素是Mybatis中最重要的最强大的元素。

resultMap的设计思想是,对于简单的语句不需要配置显式的结果映射,对于复杂一点的语句只需要描述它们的关系即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章