这不是原创,借鉴尚硅谷的,不是原创
一、核心配置文件详解
① <properties resource="jdbc.properties"/> 这个标签用于引入properties配置文件
②<typeAliases>
<package name="com.atguigu.mybatis.pojo"/>
<!-- 这个表示这个包下面的所有类将自动拥有别名 -->
</typeAliases>
这个标签用于设置类型别名,里面的package表示以包为单位,这个包下面的所有表将自动拥有这个别名
③ <environments default="development">
<environment id="development">
<dataSource type="POOLED">
<!-- -->
<!-- 配置驱动-->
<property name="driver" value="${jdbc.driver}"/>
<!--配置路径 端口号后面的表示操作数据库的名称-->
<property name="url" value="${jdbc.url}"/>
<!-- 用户名-->
<property name="username" value="${jdbc.username}"/>
<!-- 注意MySQL的密码设置 密码-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments> 用于配置连接数据库的具体环境
④<mappers>
<!-- <mapper resource="mappers/UserMapper.xml"/>-->
<!-- 这是以包的方式引入映射文件,必须满足两个条件:-->
<package name="com.atguigu.mybatis.mapper"/>
</mappers> 引入映射文件
注意:映射文件之间存在双一致原则,即:
1.Mapper接口和映射文件所在的包必须保持一致
2.Mapper接口的名字和映射文件的名字必须保持一致
如下图所示:
二、Mybatis实现快速的增删改查操作:
注意:再Mybatis中一张表对应一个实体类对象,对应一个Mapper接口,对应一个配置文件(这里进一步体现前面的双一致原则)。同时一条增删改查操作对应一个Mapper接口的抽象方法,也就对应配置文件中的一条标签设置
增删改较为固定,接口返回值是受影响的行数,下面演示按照id增加的操作:
首先创建UserMapper接口对象,为接口添加抽象方法:
int insertUser();
其次,在配置文件中,添加标签
<!-- int insertUser();方法名要和sql语句的id保持一致-->
<insert id="insertUser">
insert into t_user values(null,"admin",'123456','男','123456@qq.com')
</insert>
这样就完成添加操作了。
对于查询操作,多上一个resultMap和resultType即多一个结果返回集,即要在标签中设置这两个属性中的一个。
比如
<select id="getUserById" resultType="com.atguigu.mybatis.pojo.User">
select *from t_user where id=2
</select>
resultType中要写查询结果的全类名,注意,此时标签typeAliases就起作用了,为这个包设置了别名。
三、获取参数的两种方式
先说结论,获取参数有两种方式${}和#{}
${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号
原则上先使用#{},但是有特殊情况只可以使用${}
①对于单个字面量,可以使用#{}或者${}都可以,但是${}要手动设置单引号。
如下面所示:
<select id="getUserByUserName" resultType="User">
<!-- 要通过接口,获取得到username中的这个参数-->
select *from t_user where username='${uesername}'
</select>
注意:当参数只有一个时,可以时任意字符。
②多个字面量类型
若mapper接口中的方法参数为多个时 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以 param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的值,此时也可以通过@Param()注解,来设置键,会替换arg0,arg1.
如:
User getUserById(@Param("id") Integer id);
<!-- User getUserById(@Param("id") Integer id);-->
<select id="getUserById" resultType="user">
select * from t_user where id=#{id}
</select>
③实体类参数
若mapper接口中的方法参数为实体类对象时 此时可以使用${}和#{},
通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号
比如:
void insertUser(User user);
<insert id="insertUser">
insert into t_user value(null,#{username},#{password},#{gender},#{email})
</insert>
总的来说MyBatis获取实体类参数的两种方式,分别是通过字面量获取参数(这时通过@Param()注解),或者通过访问实体类对象中的属性名获取属性值。
四、运用Mybatis实现各种各样的查询(只介绍一种了)
①查询结果为Map构成的集合
第一种方式:通过将查询的结果放入到一个List集合当中
<select id="getUserById" resultType="user">
select * from t_user where id=#{id}
</select>
List<Map<String,Object>> getAllUserToMap();
第二种方式:通过注解的方式进行
@MapKey("id")
Map<String,Object> getAllUserMap();//将查询出来的id作为值,将查询出来的对象作为值进行保存
五、特殊的SQL的查询(一下几种查询,优先使用${}字符串拼接的方式进行)
①模糊查询(就记忆这个东西)
select *from t_user where username like "%"#{mohu}"%"
或者
select *from t_user where username like '%'${mohu}'%'
//这其实很好理解,就是对字符串进行拼接
List<User> getUserByLike(@Param("mohu") String mohu);
②批量删除(说白了就是有in这个参数)
void deleteMoreUser(@Param("ids") String ids);
<delete id="deleteMoreUser">
<!-- 这里不可以用#{}因为底层会加上''-->
delete from t_user where id in(${ids})
</delete>
//输入参数的时候,要输入字符串1,2表示删除1和2两个字符串
③动态设置表名,之所以这边不用#{},是因为查询表明的时候不可以用'表名'来进行表示
比如:
<select id="getUserList" resultType="User">
select *from ${tableName}
</select>
List<User> getUserList(@Param("tableName") String tableName);
④添加用户信息,并且获得自增的主键
void insertUser(User user);
useGeneratedKeys表示当前添加功能使用了自增的主键
keyProperty将自增的主键为实体类参数的主键进行赋值(由于增删改返回的值都是相同,因此我们将哪个获取的主键赋值给哪个变量)
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null,#{username},#{password},#{gender},#{email})
</insert>