Mybatis02-CRUD操作及配置解析

CURD操作

xml配置

  • 在前文中,已经分析了Mybatis如何简单的连接数据库并根据配置进进行操作,后面进行CRUD操作的简单使用极其优化。
  • xml文件
<mapper namespace="com.byx.dao.UserDao">
    <select id="getUserList" resultType="com.byx.pojo.User">
        select * from mybatis.user
    </select>

    <select id="getUserById" parameterType="int" resultType="com.byx.pojo.User">
        select * from user where id = #{id}
    </select>

    <!--values直接填入id,name,pwd,自动的取出传入参数User的id,name,pwd  -->
    <insert id="addUser" parameterType="com.byx.pojo.User">
        insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>
    
    <update id="updateUser" parameterType="com.byx.pojo.User">
        update user set name = #{name},pwd=#{pwd} where id=#{id};
    </update>

    <delete id="deleteUserById" parameterType="int">
        delete from user where id=#{id};
    </delete>
</mapper>
  • 如上,对xml文件进行增删改配置。

    • 在addUser方法中,传入为User对象,在sql语句中values()中各参数填入User的属性,就可直接取到传入User的值。
  • 存在问题:若一个对象的属性过多,而操作只需要对个别属性进行操作。但是构造对象时,若对象的属性不能为空,那么一般情况还是构造了一个包含所有属性的对象,这样做可能没有必要。

  • 解决方法:通过map来传入参数,直接在sql中取出Key即可

  • 代码示例:

    xml改进对比:addUser传入为User,addUser2传入为map
    
	<!--values直接填入id,name,pwd,自动的取出传入参数User的id,name,pwd  -->
    
    <insert id="addUser" parameterType="com.byx.pojo.User">
        insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>

    <insert id="addUser2" parameterType="map">
        insert into user (id,name,pwd) values (#{userId},#{userName},#{userPwd})
    </insert>	
	javaTest改进对比
	@Test
 	public void addTest(){
        int number = userDao.updateUser(new User(4, "呵呵", "222"));
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void addTest2(){
        Map<String, Object> map = new HashMap<>();
        map.put("userId",4);
        map.put("userName","卡卡");
        map.put("userPwd", 123);
        userDao.addUser2(map);
        sqlSession.commit();
        sqlSession.close();
    }
如上述所示,两种方式都进行数据的增加。
  • 总结:
    • map传递参数,直接在sql中取出即可
    • 对象传递参数,直接在sql中取对象的属性即可
    • 只有一个基本类型参数,可以直接在sql中取到
    • 多个参数用Map,或者注解。

模糊查询如何实现?

  • java代码执行的时候,传通配符
   List<User> userList = userDao.getUserLick("%李%")
  • 在sql中使用通配符
	select * from user where name like "%"#{value}"%"

配置解析

  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。其中需要掌握的为红色框圈中的部分,其余了解即可
    配置文档的结构

属性(properties)

  • 可以通过properties属性来实现引入配置文件。
  • 在核心配置文件中使用properties标签来引入。注意:标签顺序不能随便写入,必须按照规定的顺序来写。
    <properties resource="db.properties"/>
  • 直接引入外部配置文件db.properties

类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如在方法中,返回值类型为xx.xx.xx.xx,此名称太过于繁琐,可以起别名。
  • 方式1:通过tyoeAlies
    • mybaties-config.xml与UserMpper.xml
 <!--可以给实体类起别名-->
    <typeAliases>
        <typeAlias type="com.byx.pojo.User" alias="User"/>
    </typeAliases>

	<select id="getUserList" resultType="User">
        select * from mybatis.user
    </select>
可以看出起了别名之后,返回值类型可以用别名来替代。
  • 方法2:通过package。指定一个报名,Mybatis会在包名下搜索需要的javaBean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。若有注解,则别名为其注解值(如下所示)。
 <!--可以给实体类起别名-->
    <typeAliases>
        <package name="com.byx.pojo"/>
    </typeAliases>

	<select id="getUserList" resultType="user">
        select * from mybatis.user
    </select>
@Alias("\user")
public class User{
    ...
}
通过这样的方式,也可实现别名。

映射器(mappers)

  • MpperRegistry:注册绑定我们的Mapper文件
  • 方式1:推荐使用
<mappers>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
</mappers>
  • 方式2:
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
  • 方式2注意点:
    • 接口和他的Mapper配置文件必须同名
    • 接口和他的Mapper配置文件必须在同一个包下
  • others可以看官方文档。

生命周期和作用域

  • SqlSessionFactoryBuilder:作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
  • SqlSessionFactory:一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。因此SqlSessionFactory 的最佳作用域是应用作用域。
  • SqlSession:如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。所以SqlSession 的最佳的作用域是请求或方法作用域
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值