【MyBatis通俗易懂20190928狂神说】02 CRUD,配置解析,事务,连接池,属性文件,类型别名,设置,映射器,别名,ResultMap

1. CRUD

查询

    //根据id查询用户
    User getUserById(int id);
<!--namespace绑定一个对应的mapper接口-->
<mapper namespace="com.hou.dao.UserMapper">

    <select id="getUserById" resultType="com.hou.pogo.User"
    parameterType="int"> //参数可以去掉
        select * from mybatis.user where id = #{id}
    </select>
</mapper>

模糊查询

    List<User> getUserLike(String value);

    List<User> list = mapper.getUserLike("%o%");
    <select id="getUserLike" resultType="com.hou.pogo.User">
        select * from mybatis.user where name like #{value}
    </select>

        where name like "%"#{value}"%" 说存在SQL注入,测试并不存在。//第二种方式

新增

    //插入用户
    void addUser(User user);
    <!--对象中的属性可以直接取出来-->
    <insert id="addUser" parameterType="com.hou.pogo.User">
        insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd});
    </insert>
    //测试的时候,记得提交事务    
	seqSession.commit();

修改

    //修改用户
    int updateUser(User user);
    <update id="updateUser" parameterType="com.hou.pogo.User">
        update mybatis.user set name=#{name}, pwd=#{pwd} where id =#{id};
    </update>
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.updateUser(new User(4,"hou","123"));

        //提交事务
        sqlSession.commit();

删除

    //删除用户
    int deleteUser(int id);
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id=#{id};
    </delete>
  • 记得提交事务

Map作为参数

  • 参数过多,考虑使用Map
    int addUser2(Map<String, Object> map);
    <insert id="addUser2" parameterType="map">
        insert into mybatis.user (id, name, pwd) values (#{id1}, #{name1}, #{pwd1});
    </insert>
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("id1",5);
        map.put("name1","dong");
        map.put("pwd1","12345");
        mapper.addUser2(map);

        //提交事务
        sqlSession.commit();
    User getUserById2(Map<String, Object> map);

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("helloid",5);
        map.put("name","dong");
        User user = mapper.getUserById2(map);
    <select id="getUserById2" parameterType="map"
            resultType="com.hou.pogo.User">
        select * from mybatis.user where id = #{helloid} and name = #{name};
    </select>
  • Map传递参数,直接在sql中取出key即可! 【parameter=“map”】

    • 多个参数用Map , 或者注解!
  • 对象传递参数,直接在sql中取出对象的属性即可! 【parameter=“Object”】

  • 只有一个基本类型参数的情况下,可以直接在sql中取到 【不需要写 parameterType】

2. 配置解析

mybatis-config.xml

configuration(配置)

  • **properties(属性) ***

  • **settings(设置) ***

  • **typeAliases(类型别名) ***

  • typeHandlers(类型处理器)

  • objectFactory(对象工厂)

  • plugins(插件)

  • **environments(环境配置) ***

    • environment(环境变量)
      • transactionManager(事务管理器)
      • dataSource(数据源)
  • databaseIdProvider(数据库厂商标识)

  • mappers(映射器)*

环境配置

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
            </dataSource>
        </environment>
    </environments>
事务管理器
  • JDBC 使用JDBC的提交 和 回滚设置
  • MANAGED managed
    • 从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期
manage
v.
管理,处理;操纵,控制;设法做到,勉力完成;腾出时间参加;凑合着活下去,支撑;调教(人或动物);竟搞得,竟做出
连接池 和 数据源类型

数据库连接池:dbcp,c3p0,druid 德鲁伊(阿里),hikari 默认集成

  • 连接数据库

内建的数据源类型

  • UNPOOLED unpooled 没有连接池
  • POOLED pooled
    • 有连接池,可以自动回收。
    • 应用快速 响应请求。
  • JNDI jndi EJB用的

properties

  • mybatis-config.xml
<configuration>

    <!--引入外部配置文件-->
    <!--<properties resource="db.properties"/>-->

    <properties resource="db.properties">
        <property name="username" value="root"></property>
        <property name="password" value="hdk123"></property> 优先使用外部配置,而不是本地
    </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>
</configuration>
  • db.properties
    • 注意:在 此文件里,不需要转义了
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://111.230.212.103:3306/mybatis?userSSL=true&userUnicode=true&characterEncoding=UTF-8
#username=root
#password=hdk123

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

类型别名

第一种方式

  • mybatis-config.xml 下 configuration

    • properties 下面
    • 别名配置
        <!--可以给实体类起别名-->
        <typeAliases>
            <typeAlias type="com.hou.pogo.User" alias="User"></typeAlias>
        </typeAliases>
    
    • 使用
    <select id="getUserLike" resultType="User">
    

第二种方式

 <typeAliases>
    <package name="com.hou.pogo"></package> //下面的User类,别名为 user,当然 用User也行。
 </typeAliases>

也可以指定一个包,每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,

  • 会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author,;

第一种可以DIY别名,第二种不行,如果非要改,需要在实体上增加注解。

@Alias("author")
public class Author {
}

下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

别名映射的类型
_bytebyte
_char (since 3.5.10)char
_character (since 3.5.10)char
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
char (since 3.5.10)Character
character (since 3.5.10)Character
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
bigintegerBigInteger
objectObject
date[]Date[]
decimal[]BigDecimal[]
bigdecimal[]BigDecimal[]
biginteger[]BigInteger[]
object[]Object[]
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

设置

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

  • lastName在mysql挺好。oracle会全部转为大写。所以 都习惯:last_name
  • jdk7 新增 _ 。如:1_0000 。1万
设置名描述有效值默认值
cacheEnabled全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。true | falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。true | falsefalse
useColumnLabel使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。true | falsetrue
useGeneratedKeys允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。true | falseFalse
mapUnderscoreToCamelCase是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。true | falseFalse
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J | LOG4J(3.5.9 起废弃) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING未设置
<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"/>
</settings>  
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins 插件
    • mybatis-generator-core
    • mybatis-plus
    • 通用mapper

映射器 Mapper扫描包配置

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

  • 就是配置 .xml文件,那配置 接口 和 扫描 也行,因为太强大了。
<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>  // 不支持 模糊扫描
</mappers>
<!-- 使用完全限定资源定位符(URL) --> 别用
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>

<!-- 将包内的映射器接口实现全部注册为映射器,这才是扫描包,模糊扫描 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

使用映射器接口实现类,将包内的映射器接口(上面 倒数2个) 注意点:

  • 接口和他的Mapper配置文件必须同名。UserMapp 接口,必须对应 UserMapp.xml
  • 接口和他的Mapper配置文件必须在同一个包下
registry
n.
注册;登记处;挂号处;船舶的国籍

作用域和生命周期

在这里插入图片描述
声明周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题。

SqlSessionFactoryBuilder:

  • 一旦创建了SqlSessionFactory,就不再需要它了
  • 所以放在:局部变量

SqlSessionFactory:

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

SqlSession:

  • 连接到连接池的一个请求
    • 相当于 每次一个 http请求,就打开,响应后:就关闭。
  • SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
  • 用完之后需要赶紧关闭,否则资源被占用!
    在这里插入图片描述

3. ResultMap 结果集映射

数据库字段名 和 model不一致

1. 起别名

  • 起别名,把返回 和 model属性 一致。
<select id="getUserById" resultType="com.kuang.pojo.User">
    select id,name,pwd as password from USER where id = #{id}
</select>

2. ResultMap

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

<select id="getUserList" resultMap="UserMap">
    select * from USER
</select>
  • resultMap 元素是 MyBatis 中最重要最强大的元素。
  • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
  • ResultMap 的优秀之处——你完全可以不用显式地配置它们。
  • 如果这个世界总是这么简单就好了。
association
n.
协会,社团,联盟;交往,联合;联系,因果关系;联想
初中 | 高中 | CET4 | CET6 | 考研 | IELTS | GMAT
复数 associations
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值