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.转义字符 < = <转义字符表大全(转)_转义字符对照表-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;