什么是mybatis : mybatis的前身是ibatis, 是一款有apache开源组织开发的一款Java持久层框架产品。未来会替换JDBC的操作数据库,简化JDBC操作数据库的复杂性。
二 Mybatis的特点:
2.1 简单: 大大的简化了JDBC操作数据库的复杂性,使用Mybatis开发操作数据库的代码,基本上看不到任何JDBC的原生复杂的代码。 学习上手简单, 正因文学习成本低,所以很多人都在使用Mybatis。
2.2 灵活: Mybatis开发操作数据库,将sql语句书写在配置文件中, 便于对sql语句的调优和项目的维护。
单独整理 详见其他文章 dao层实现 由mybatis 配置文件完成
mybatis的核心API:
API名称作用Resources用于读取和解析mybatis-config.xml全局配置文件。SqlSessionFactory主要作用就是用于创建SqlSession的SqlSession1. SqlSession类似于JDBC开发中Connection对象的作用,一个SqlSession中封装了一个Connection对象,所以mybtais开发的时候使用SqlSession对象控制事务。2由于mybatis是采用mapper文件作为代理DAO接口的实现,所以我们需要使用SqlSession去获取最终的DAO实现类对象,然后调用DAO的方法。PS: Mybatis框架的事务是自动回滚处理 ,所以在执行完写(增 删 改)操作后,必须手动提交事务。
mybatis中接口参数绑定机制 查询的内容比较多 有关知识点略多也比较重要 1. 接口方法一个参数 : mapper文件中#{}取值语法里面,写什么都可以。 <select id="selectByBookId" resultMap="bookMap"> select * from D_BOOK where BOOK_ID=#{bid} </select> //与之对应的dao接口 方法名和 配置文件中对应标签的id 对应保持一致 DBook selectByBookId(@Param(value="bid") Integer bid); 2.接口方法多个参数: 2.1 注解方式绑定: 专门用于条件查询。可读性高 PS: @Param注解的value属性可以省略。 //查询 <update id="updateState" > update D_USER set STATE=1 where EMAIL=#{email} </update> //删除 <delete id="deleteOne"> delete d_user where id=#{id} </delete> //插入 如果不需要提前获取对应的id值 <insert id="insertUser"> insert into d_user values (duser_seq.nextval,#{nickname},#{password},#{email},#{state}) </insert> //如果需要提前获取对应的id值 就不能用序列自增 可以使用<selectKey>标签 //在执行添加语句之前先生成一个序列号 并赋值到参数对象中对应主键属性上 //keyProperty 指定当前查询返回值的主键值封装到实体类对应的哪个属性上 //其他的 望文生义大概也能猜的到 <insert id="addOrder" > <selectKey resultType="int" keyProperty="id" order="BEFORE"> select ORDER_SEQ.nextval from dual </selectKey> insert into D_ORDER values (#{id},#{goodPrice},sysdate,0,#{addrId},#{userId}) </insert>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2b1jzrWQ-1599122431840)(file:///C:/Users/86150/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]
封装的 Mybatis工具类 public class MybatisUtil{ static SqlSessionFactory factory=null; //静态代码块 在类加载时执行一次 static { InputStream in =null; try { //读取核心配置文件 in = Resources.getResourceAsStream("mybatis-config.xml"); factory =new SqlSessionFactoryBuilder().build(in); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("初始化失败"); }finally{ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } private static ThreadLocal<SqlSession>tol=new ThreadLocal<SqlSession>(); //获取 sqlsession public static SqlSession openSession(){ SqlSession sqlSession = tol.get(); if (sqlSession==null) { sqlSession = factory.openSession(); tol.set(sqlSession); } return sqlSession; } //提交事务 public static void commit(){ SqlSession sqlSession=tol.get(); if (sqlSession!=null) { sqlSession.commit(); } } //事务回滚 public static void rollback(){ SqlSession sqlSession=tol.get(); if (sqlSession!=null) { sqlSession.rollback(); } } //关闭资源 public static void close(){ SqlSession sqlSession=tol.get(); if (sqlSession!=null) { sqlSession.close(); tol.remove(); } } }mapper文件中的另一种取值语法
${}取值方式的使用 相当于 之前jdbc 学习中的字符串拼接 存在sql 注入的风险
#{} 相当于 原来的占位符赋值1.给实体类起别名 (避免每次都写很长的结构)
① 第一种方式 给指定类起别名
<typeAliases> <typeAlias type="包名.类名" alias="别名"/> </typeAliases>2 第二种方式 给指定包下的所有实体类其别名 别名 默认 为类名
<typeAliases> <package name="包名"/> </typeAliases>mybatis默认结果集封装规则: mybatis默认会将数据库查询返回结果集中的字段名, 对应封装到实体类属性名一致的属性上。
当查询返回结果集中的字段名与实体属性名不一致的解决
2.1 第一种方案: 给查询结果的字段起个别名,与对应实体类属性名一致。
2.2 第二种方案: 使用mybatis的resultMap自定义结果集映射关系。
<resultMap id="addressMap" type="Address"> //column 与sql语句查询结果的字段名一致 property 与类的属性对应 <id column="id" property="id"/>//主键 <result column="name" property="name"/>//普通字段 <result column="address" property="address"/> <result column="lxfs" property="lxfs"/> <result column="status" property="status"/> <result column="destatu" property="destatu"/> </resultMap> //对应类 部分代码 public class Address implements Serializable{ private Integer id; private Integer userId; private String name; private String address; private String lxfs; private Integer status; 。。。。。。。。 } // mapper文件中 <select id="selectAll" resultMap="addressMap"> select * from address where destatu=0 and USERID=#{userId} </select>多对一 实体类中定义关联属性 mapper文件中 通过标签进行关系映射 注意标签属性的对应关系
一对多 使用 对应的 ofType 是泛型中的类
1.SQL片段 : 我们可以将多个SQL语句涉及到重复使用的信息,定义为一个SQL片段,提高代码的复用性。
假设表有多个字段 id nickname score sex <sql id="student_column"> id, nickname name ,score sex </sql> <select id ="方法名" reslutMap=""> select <include refid="student_column"/> from 表名 </select>\2. where动态SQL子句 使用
3 foreach 实现批量删除
简单的做了一个内容上的回顾 不足之处多多包涵 方便自己回头看看 相关内容一些写的也没有很详细 可以百度一下 注:案例中 数据库 使用的Oracle