log4j日志文件使用 mybatis入门

Log4j使用:

1.导依赖

2.写配置文件:

参考:log4j_百度百科

3.测试:

myBatis入门:

事前准备:

数据库中的t_brand表:

定义的实体类Brand:

我们采用mapper代理开发来完成案例

要注意接口和xml映射文件所处的目录层级要一样:

配置文件:

<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <properties resource="db.properties"></properties>
    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
            <!-- type的值可以选择  jdbc 使用jdbc事务管理,相当于手动管理事务
                                   Managed 不使用任何事务管理,交给其他的框架比如spring框架进行事务管理
            -->
            <transactionManager type="JDBC" />  <!-- 使用jdbc的事务   提交  和  回滚  (比如,业务逻辑  同时插入数据 ,如果第二个插入失败,需要回滚第第二个插入动作      )     -->
            <!-- type的值可以选择   pooled  采用连接池的方式配置数据源  conn  预先 开几个连接在这里等待,请求 需要的时候,分配连接给它, 不需要就回收,等待其他人的连接
                                   unpooled 不采用连接池方式配置
                                   JNDI    采用JNDI方式实现数据连接池配置
             -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver_name}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${userpwd}" />
            </dataSource>
        </environment>
    </environments>

    <!-- 加载mapper.xml -->
    <mappers>
<!--        <mapper class="com.example.mapper.BrandMapper"/>-->

        <!--        直接配包名-->
        <package name="com.example.mapper"/>
    </mappers>

</configuration>

实体类中的字段数据库中的字段名字不一样,引起相关字段值为null

解决:

起别名:

优化:用sql片段把重复要用的一大段sql封装起来。

再优化(最优的解决方案):使用resultMap  记得修改resultType为resultMap

带参数的条件查询:

SELECT * FROM t_brand WHERE id<?;

两个问题:

①.占位符

两种占位符:

1.#{}  将#{}  替换为 ?

2.${}  拼接sql   会有sql注入问题

推荐第一种

②.特殊字符处理, < 会和标签冲突
1.转义字符    < = &lt;转义字符表大全(转)_转义字符对照表-CSDN博客

2.CDATA

输入CD(大写)  给出提示     在里面写符号自动转义

多条件查询:

1.param注解

2.对象封装,sql中的参数名(#{brandName}) 要和  实体类的成员变量名(brandName)  一样,才能通过get方法获得

3.用Map,sql中的参数名(#{brandName}) 要和 Map中的键名一样 <brandName,brandNameValue>

动态sql

需求1:

用户有时候不会三个条件全选,而是选择其中的两个,一个甚至一个都不选,那么就需要动态sql来完成sql的动态改变了。

原来的sql:

修改后的动态sql:

    <select id="selectBrandsByMultiPara" resultMap="brandResultMap">
        select *
        from t_brand
        <where>
            <if test="status!=null">
                status = #{status}
            </if>
            <if test="companyName!=null and companyName!=''">
                and company_name like #{companyName}
            </if>
            <if test="brandName!=null and brandName!=''">
                and brand_name like #{brandName}
            </if>
        </where>
    </select>

其中的where标签会自动校验里面的条件判断,如果所有条件判断都false, 则返回 where 1=1

防止出现 select * from t_brand where  ;的情况(如下)

需求2:

单条件查询 (用 choose when 标签)

sql:

    <select id="selectBrandBySinglePara" resultMap="brandResultMap">
        select * from t_brand where
        <choose>
            <when test="status!=null">
                status=#{status}
            </when>
            <when test="companyName!=null and companyName!=''">
                companyName like #{companyName}
            </when>
            <when test="brandName!=null and brandName!=''">
                brandName like #{brandName}
            </when>
            <otherwise>
--                 解决一个条件都没有传入的情况
                1=1
            </otherwise>
        </choose>
    </select>

另一种写法:

    <select id="selectBrandBySinglePara" resultMap="brandResultMap">
        select * from t_brand
        <where>
            <choose>
                <when test="status!=null and status!=''">
                    status=#{status}
                </when>
                <when test="companyName!=null and companyName!=''">
                    company_name like #{companyName}
                </when>
                <when test="brandName!=null and brandName!=''">
                    brand_name like #{brandName}
                </when>
            </choose>
        </where>
    </select>

where标签会自动帮我们校验choose里面的条件判断,如果一个都没有,返回where 1=1

注意:

这里的status我用的是int 类型  测试一个参数也不传的情况时,如果用para注解或者对象类型传参的写法,会出现status参数传不进去(int类型不能为null) 和类自动将status设置为0的情况,因此这里用Map来传参     (update那里同理)

测试:

添加:

需求:

添加Brand,id自动生成,添加成功后返回主键(即id)

    <insert id="addBrand" useGeneratedKeys="true" keyProperty="id">
        insert into t_brand (brand_name, company_name, ordered, description, status)
        values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status})
    </insert>

在这个例子中,当执行addBrand操作时,MyBatis会向数据库插入一条新记录。如果数据库成功插入了记录并生成了一个主键值,MyBatis会使用JDBC的getGeneratedKeys方法获取这个主键值,并将其设置到Brand对象的id属性中。这样,你就可以在插入操作后立即访问到这个新生成的主键值,而无需再次查询数据库。

记得开启事务提交:

或者 session.commit(); 手动提交事物

测试:

    @Test
    public void testAddBrand(){
        Brand brand = new Brand();
        brand.setBrandName("悦刻3");
        brand.setCompanyName("尼古丁真");
        brand.setOrdered(66);
        brand.setDescription("电子烟假,尼古丁真");
        brand.setStatus(1);
        brandMapper.addBrand(brand);
        System.out.println(brand.getId());
    }

动态修改:

set标签解决逗号的问题(联想到where标签解决  and 的问题)

    <update id="updateBrand">
        update t_brand
        <set>
            <if test="brandName!=null and brandName!=''">
                brand_name=#{brandName},
            </if>
            <if test="companyName!=null and companyName!=''">
                company_name=#{companyName},
            </if>
            <if test="ordered!=null">
                ordered=#{ordered},
            </if>
            <if test="description!=null and description!=''">
                description=#{description},
            </if>
            <if test="status!=null ">
                status=#{status}
            </if>
        </set>
        where id=#{id}
    </update>

测试:

    @Test
    public void testUpdateBrand(){
        HashMap<Object, Object> map = new HashMap<>();
        map.put("description","电子烟真,尼古丁假");
        map.put("ordered",99);
        map.put("id",4);
        brandMapper.updateBrand(map);
    }

批量删除:

sql:

测试:

一些小问题:

1.在resource下创建目录结构   用  /  分割

2.ctrl+alt+L 在idea中格式化sql   (qq的锁定也是这个,可以在设置中修改)

3.重置数据库的主键自增 

ALTER TABLE t_brand AUTO_INCREMENT = 0;

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值