Mybatis-02

一、

1、使用Map作为参数类型

当实体类或数据库表中的字段或参数过多时,如果要向表中插入添加或其他操作时使用实体类对象会比较繁琐,因为对象的参数太多。先理解这样一个设计方式,不正规但实用。

 //向角色表中新增一个角色名--接口
int addUser2(Map<String,Object> map);
<!--Mapper.xml-->
<insert id="addUser2" parameterType="map">
        insert into smbms_role (id,roleName) values (#{roleId},#{roleName})
</insert>
//测试    
@Test
    public void addUser2() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("roleId",1);
        map.put("roleName","仓库管理");
        mapper.addUser2(map);
        sqlSession.close();
}

Map传递参数,直接在sql中取出key即可。  parameterType = "map"

对象传递参数,直接在sql中取出对象属性即可。   parameterType = "Object"

只有一个基本类型参数的情况下,可以直接在sql中取到。不写参数类型也可以

多个参数用Map,或者注解。

注意:当前配置文件中 parameterType 参数类型是map    sql语句中的参数要和map中的key对应

2、模糊查询怎么写

在Java代码执行的时候,传递通配符%%

List<User> user2 = mapper.getUser2("%li%");

在sql拼接中使用通配符  防止sql注入

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

3、环境配置

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

不过要记住:尽管可以配置多个环境,但每个sqlsessionFactory实例只能选择一种环境

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

还有一个事务管理器,现在已经不用了,但是面试问有几个事务管理器要知道有两个,另一个叫Managed

 4、优化配置文件

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:8080/mybatis?serverTimezone=UTC&amp;userSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8
username=root
password=123456
<!--如果外部文件包含所有配置那就这样直接引入就行了--> 
<properties resource="db.properties"/>
<!--如果外部文件没有包含所有配置--> 
<properties resource="db.properties">
        <property name="username" value="lcz"/>
        <property name="password" value="123456"/>
</properties>

可以引入外部文件  用<properties>标签代表外部配置文件

可以在其中增加一些属性配置

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

5、类型别名

类型别名是为Java类型设置一个短的名字

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

两种起别名的方式:

1、指定类的全路径,设置一个别名

2、也可以指定一个报名,mybatis会在报名下面自动搜索需要的JavaBean,扫面实体类的包,他的默认别名就是这个类的类名,首字母小写。

<typeAliases>
        <typeAlias type="space.urbeautiful.pojo.User" alias="User"/>
</typeAliases>
<typeAliases>
        <package name="space.urbeautiful.pojo"/>
</typeAliases>
<select id="getUser" resultType="User">
       select * from mybatis.user
</select>

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

如果实体类十分多,建议使用第二种

第一种方式可以自定义别名,第二种只能是类的名称(小写大写都可以,但是官方建议使用小写),但是当实体类有注解的话,那么就在实体类上写注解名

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

6、映射器

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

方式一:推荐使用这样注册mapper

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

方式二:使用class文件绑定注册

    <!--为每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
    <mappers>
        <mapper class="space.urbeautiful.dao.UserMapper"/>
    </mappers>

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

接口和他的Mapper配置文件必须在同一个包下,不然就会报错  未知注册

方式三:使用扫描包进行注入绑定

   <!--为每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
    <mappers>
        <package name="space.urbeautiful.dao"/> 
    </mappers>

注意点和方式二一样,都需要同名同包

二、声明周期和作用域

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

SqlSessionFactoryBuilder:

一旦创建了SqlSessionFactory就不需要它了。   作用域放在局部变量中。

SqlSeesionFactory:

说白了就是可以想象为:数据库连接池

SqlSeesionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。浪费资源

SqlSession:

连接到连接池的一个请求

SqlSessioon的实例不是线程安全的,因此不能被共享,所以他的最佳作用域是请求或方法的作用域。

用完之后需要赶紧关闭,否则资源被占用

 三、resultMap

 resultMap元素是Mybatis中最重要的元素

resultMap的设计思想是,对于简单的语句根本不需要配置显示的结果映射,而对于复杂一点的语句只需要描述他们的关系就行了

四、日志工厂

1、默认的日志工厂STDOUT_LOGGING

 利用日志工厂后的控制台输出

原文地址:https://www.cnblogs.com/jzspace/p/13174677.html