这里只是笔记,属性详情,关键还是要多练 ——实例代码
MyBatisDemo
MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单
SQL映射文件的几个顶级元素
name | 详情 |
---|---|
mapper | namespace: 命名空间 |
cache | 配置给定命名空间的缓存 |
cache-ref | 从其他命名空间引用缓存配置 |
resultMap | 用来描述数据库结果集和对象的对应关系 |
sql | 可以重用的SQL块,也可以被其他语句引用 |
insert | 映射插入语句 |
update | 映射更新语句 |
delete | 映射删除语句 |
select | 映射查询语句 |
:--------: | -------------: |
<mapper namespace="命名空间">
id
命名空间中唯一的标识符可随意 但如果是 面向接口编程 方法名与映射文件中的SQL语句id一一对应(要相同);
parameterType
传入SQL语句的参数类型,
基础数据类型: int、String、 Date等只能传入一个,通过 #{随意参数名} 即可获取传入的值; 这里参数名可以随意… 因为参数只有一个无须细分了~
复杂数据类型: Java实体类、Map等通过 #{属性名} 或者 #{map的keyName} 即可获取传入值; Map可用于多个参数;
resultType
SQL语句返回值的类型 与parameterType
类似, 可以是基础或复杂数据类型…
MyBatis中resultType自动映射, 字段名 和 属性名必须一致才可以哦~
注意: 返回结果如果是 实体类类型,尽量类属性名 与数据库列名一致,不然会很麻烦哦~
resultMap
命名引用外部的resultMap
flushCache
将其设置为true,不论语句什么时候被调用,都会导致缓存被清空。默认值:false
useCache
将其设置为true,将会导致本条语句的结果被缓存。默认值:true
timeout
这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)
fetchSize
这是暗示驱动程序每次批量返回的结果行数
…
而可以通过SQL 语句查询,列起别名形式进行, 改正:
resultMap
;id
唯一标识,id 值用于select元素 resuMap的引用;
type
表示resultMap的映射结果;
id
子节点:< id property="属性名“ column=”主键列名“ /> 一般一个resultMap 只有一个表示查询的主键列,提高程序效率;
result:
子节点:用于标识属性,< result property="属性名“ column=”列名“ /> 如果查询时候有些属性应该有值,结果却是 null 就是没有映射上!或 映射级别过低…
assoction
子节点: A表 B表, 两表连接… A类存在B类型对象属性; 就需要使用 assoction 进行映射;
assoction 处理 ”一对一“ 的关联关系; w是人事部 s是技术部…
property:表示在A类中的属性名; javaType : 表示该属性的类名; …
collection
同 assoction 类似, assoction表示 一对一, 而 collection 则表示 一对多;
即:查询人事部的所有员工; Java的部门类中就需要一个用户集合…
关于映射级别
可以在MyBatis-config.xml 中 < setting name=“auto
NONE : 禁止自动映射;
PARTIAL : 默认值,允许自动映射; 但 collection/assoction 子元素中,无法自动映射;——级别不够
FULL :更高级的映射, 允许 collection/assoction 子元素中自动映射;
SQL映射 UserMapper.xml
<resultMap type="User" id="userMap">
<id property="id" column="id" />
<result property="userCode" column="userCode" />
<association property="role" javaType="Role" >
association>
resultMap>
<select id="login" resultMap="userMap" >
SELECT su.*,sr.`roleName` FROM `smbms_user` su ,`smbms_role` sr WHERE su.`userRole` = sr.`id` AND su.`userName`= #{name} AND su.`userPassword` = #{pwd}
select>
Java接口: UserMapper.Java
@Param 注解实现多参数
// 有时候, 参数需要很多可以使用 parameterType 的 Map Java实体类 但还是比较麻烦~ 还可使用Java 注解来解决…
// 只需要在定义接口时候在参数列表,需要的参数使用:@Param(" sql中使用的name ")参数类型 参数名
即可;
public interface UserMapper {
//登录方法,根据用户名/密码用户登录,并显示用户部门名称.. 两表连接.. assoction;
public User login(@Param("name")String name,@Param("pwd")String pwd); //使用了: 注解形式传参;
}
运行类 Run.Java
public User login(String name,String pwd){
SqlSession session = MyBatisUtil.createSqlSession();
UserMapper um = session.getMapper(UserMapper.class);
User u = um.login(name, pwd);
MyBatisUtil.closeSqlSession(session);
return u;
}
RoleMapper.xml
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
<resultMap type="Role" id="RoleMap">
<result property="id" column="id" />
<collection property="users" ofType="User" >
collection>
resultMap>
<select id="cha" resultMap="RoleMap" useCache="true" >
SELECT rs.*,us.`userName` FROM `smbms_role` rs ,`smbms_user` us WHERE rs.`id` = us.`userRole` AND rs.`id`=#{id};
select>
Java接口 RoleMapper.Java
//根据部门id查看部门信息,及该部门的所有员工
public Role cha(@Param("id")int id);
运行类 Run.Java
//根据编号查部门及 部门员工;
public void bmcha(){
SqlSession session = MyBatisUtil.createSqlSession();
RoleMapper rm = session.getMapper(RoleMapper.class);
//一级缓存:缓存数据存储在 sqlSession中;
Role r = rm.cha(1);
System.out.println(r.getRoleName()+"\t"+r.getId());
List<User> u = r.getUsers();
for (User user : u) {
System.out.println(user.getUserName());
}
MyBatisUtil.closeSqlSession(session);
}
SqlSessionFactory.openSession(false); // 参数false表是开启事务控制,不传参数表示默认为true(为自动提交事务)
id
同上
parameterType同上
//一般只有查询,有返回结果… 增 删 改 差不多都一致。。。
SQL映射 UserMapper.xml
<insert id="xz" parameterType="User" >
INSERT into `smbms_user` values
(null,#{userCode},#{userName},#{userPassword},1,'1983-10-10','13688889999','北京市东城区前门东大街9号',2,1,'2020-08-18 09:56:31',NULL,NULL);
insert>
Java接口: UserMapper.Java
public interface UserMapper {
//新增
public int xz(User u);
运行类 Run.Java
public void addxz(){
//新增的User 对象;
User us = new User();
us.setUserCode("WSM");
us.setUserName("wangX");
us.setUserPassword("540707");
SqlSession session = MyBatisUtil.createSqlSession();
int jg = 0;
try {
//采用面向接口方法
//sqlSession.getMapper(接口类.Class); 前提是映射文件命名空间指向接口的地址;
// 且映射文件对应的ID名要 和 接口的方法名相同;
// Mybatis 底层实现了UserMapper接口,并返回了对应实例,方便调用起对应方法;
// 好处,不用在在意 SqlSession 的增删改查的方法: selectone(); insert();...方法了; 可以根据,自定义的方法来实现 "增删改查..操作";
UserMapper um = session.getMapper(UserMapper.class);
//返回影响行数
jg = um.xz(us);
session.commit(); //手动提交事务
// 注意增删改查操作; 需要提交,虽然数据库进行了新增,但是事务还没结束,根据事务原子性; 成功/失败;
} catch (Exception e) {
e.printStackTrace();
session.rollback(); //出现异常,事务回滚;
}finally{
MyBatisUtil.closeSqlSession(session);
if(jg==1){
System.out.println("新增成功");
}else{
System.out.println("新增失败");
}
}
};
SQL映射 UserMapper.xml
<update id="xiugai" >
UPDATE `smbms_user` SET `userName` =#{name} WHERE `id` =#{id}
update>
Java接口: UserMapper.Java
//修改 根据角色ID 修改角色姓名;
public int xiugai(@Param("id")int id,@Param("name")String name);
运行类 Run.Java
public void upd(){
System.out.println("请输入要修改用户id");
int id = input.nextInt();
System.out.println("请输入修改后用户name");
String name = input.next();
SqlSession session = MyBatisUtil.createSqlSession();
try {
UserMapper um = session.getMapper(UserMapper.class);
if(um.xiugai(id, name)==1){
session.commit(); //成功提交事务
System.out.println("成功");
}else{
System.out.println("失败");
}
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally{
MyBatisUtil.closeSqlSession(session);
}
}
SQL映射 UserMapper.xml
<delete id="del" parameterType="int" >
DELETE FROM `smbms_user` WHERE id=#{del}
delete>
Java接口: UserMapper.Java
//删除 根据角色Id 删除;
public int del(int id);
运行类 Run.Java
public void del(){
System.out.println("请输入要删除ID");
int id = input.nextInt();
SqlSession session = MyBatisUtil.createSqlSession();
try {
UserMapper um = session.getMapper(UserMapper.class);
if(um.del(id)==1){
session.commit(); //成功提交事务
System.out.println("成功");
}else{
System.out.println("失败");
}
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally{
MyBatisUtil.closeSqlSession(session);
}
}
这里只是笔记,属性详情,关键还是要多练 ——实例代码
MyBatisDemo
加油!奥利
硕!