SpringMVC-day06

已有 77 次阅读2017-4-16 18:19 |个人分类:mybatis的学习|系统分类:学习纪录

今天是mybatis学习的第四天,今天的学习过程中总结了对于添加用户的操作,删除用户的操作,修改用户的操作,以及对于mybatis原生的dao层的开发,以及使用mapper配置文件的开发,也了解了mybatis和hibernate的区别以及作用的范围,对于mybatis这个框架的理解更深一步了。
具体的笔记如下:
3.7添加用户
 3.7.1映射文件 
 在User.xml中配置添加用户的statement 
<!-- 添加用户,指定输入的参数类型,pojo 在#{}中指定pojo的属性名接收到pojo对象的属性值通过OGNL获取对象的属性值--> 
<insert id = "insertUser" parameterType="com.Sopp.mybatis.pojo.User"> 
 insert into user(id,username,birthday,address) value(#{id},#{username},#{birthday},#{address}) 
</insert> 
3.7.2程序代码 
 @Test public void insertUser() throws IOException{ 
  //定义SQLMap的配置文件 
 String resource = "SqlMapConfig.xml"; 
 //得到配置文件流
 InputStream inputStream = Resources.getResourceAsStream(resource);
 //第一步,创建会话工厂。 
 //在这个build里面要创建配置信息 
 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
 //通过工厂得到
SQLSession SqlSession sqlSession = sqlSessionFactory.openSession(); 
 //通过SQLSession来操作数据库 
 /** * 第一个参数:是statement,是映射文件中是statement的id。等于命名空间.statement的id 
 * 第二个参数:输入参数,指定和映射文件中所匹配的parameterType类型的参数
 * 最终的结果就是与你映射文件中所匹配的resultType的类型的对象 
 */ 
 //查出一条记录 
 //插入用户对象 
 User user = new User(); user.setUsername("李哥"); 
 user.setBirthday(new Date()); 
 user.setAddress("四川成都市高新区中和镇黄金时代5幢2单元403"); 
 user.setSex("1"); 
 sqlSession.insert("user.insertUser", user); 
 System.out.println(user);
 //这里需要执行提交事务事件 
 sqlSession.commit(); 
 //这里需要释放资源 sqlSession.close(); } 
 3.7.3主键的返回 
  3.7.3.1自增的主键的返回 
 在执行insert之前来自动的生成一个主键 
 通过一个MySQL的函数能够获取到刚刚提交的自增主键 LAST_INSERT_ID();
使用这条语句需要配合刚才使用的插入语句来使用,
在insert之后来调用这个函数 代码: 
 <!-- insert插入数据的组件返回到我的User对象里面 select LAST_INSERT_ID():得到刚刚插入的insert的主键,
 只适用于自增组件 keyColumn:将我们查询到的主键值,
设置到我们的parameterType指定的那个对象里面的指定的属性 order:LAST_INSERT_ID()执行顺序,相对insert语句来说他的执行顺序--> 
 <selectKey keyColumn="id" order = "AFTER"> 
 select LAST_INSERT_ID(); 
 </selectKey> 
 修改inserUser的定义 
 3.7.3.2非自增主键的返回 
使用MySQL的uuid来生成我们的主键,
需要修改表的属性为String,长度设置为35位 
先通过uuid来查询出来你的主键,
然后将主键输入到sql中 执行uuid的顺序相对于insert语句来说是之前 
 3.7总结,
 #{}表示一个占位符号 ${}表示一个拼接符号,但是会引起sq注入,所以不建议使用${}6 selectOne表示查询出一条记录进行映射,如果使用selectOne可以实现selectList也可以实现(List中只有一个对象) selectList表示查询出一个列表(多条记录)进行映射,如果使用selectList查询多条记录,不能使用selectOne 
 3.8删除用户
 3.8.1 映射文件 <!-- 删除,根据id进行删除,这里需要输入id --> <delete id = "deleteUser" parameterType="java.lang.String"> delete from user where id=#{id} </delete> 3.9更新用户 
 3.9.1 映射文件 <!-- 修改,ID进行搜索,这里需要输入id 还需要更新的内容 使用这个parameterType更新对象,包含了id和内容,但是id必须存在 #{id}:从输入的user对象中获取id值--> <update id = "updateUser" parameterType="com.Sopp.mybatis.pojo.User"> update user set username=#{name},birthday = #{birthday},sex=#{sex},address=#{address} where id=#{id} </update> 
 3.10注意: 
 在没有让mybatis和SpringMVC进行整合的时候,方法内部必须要提交事务否则会操作无效果。但是测试代码不会报错 #{}中的内容如果是对象,如果是对象中的属性,那么就必须在对象中能够找到对应的属性名称。如果是简单类型,就可以随便书写 ${} 
 3.11mybatis和hibernate的本质区别和应用场景 
 hibernate:他是一个标准的orm框架(对象关系映射),入门的门槛比较高,不需要程序员书写sql,sql自动生成 对sql语句进行优化修改,非常困难 应用场景:适用于需求变化不多的中小型的项目,后台管理系统,ERP,orm,oa。。。 mybatis:专注于sql本身,使用mybatis就非常方便修改优化,需要程序员自行编写sql语句,mybatis是一个不完整的orm框架,虽然程序员自己书写sql,但是程序员自己也可以实现映射,输入映射,输出映射 应用场景:可以使用中小型项目,主要适用于,需求变化较多的项目,比如,互联网项目(淘宝,天猫变化比较快的互联网项目), 企业在进行选框架的时候,要按照低成本高回报作为技术选型的原则,适用于项目本身的技术,根据项目组的技术力量进行抉择。 
 4.mybatis开发dao的方法 拿到工厂,得到SQLSession
 4.1 SQLSession的使用范围 通过SQLFactory创建SQLSession
 4.1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建SqlSessionFactory,把它当做一个工具类即可,不需要使用单例模式来进行管理 在需要使用这个的时候,只是需要new一次即可 
 4.1.2 SqlSessionFactory 通过SqlSessionFactory创建SqlSession,使用单例模式SqlSessionFactory(工厂一旦撞见,一直使用一个实例,就不再销毁,)。 将来和SpringMVC整合过后,使用单利模式管理SqlSessionFactory 
 4.1.3 SqlSession 是一个面向用户(程序员)的接口, 在SQLSession中提供了许多操作数据库的接口,selectone(返回单个对象)、selectList(返回多个对象) SQLSession是线程不安全的,在SQLSession实现类中,除了存在接口中的方法,还存在数据域的属性。会导致多个对象进行访问,可能会出现访问冲突 SQLSession最佳的应用场合就是在方法体内,就相当于是局部变量,多个线程访问方法的时候,都会存在不同的内存区域,这样就不会导致数据访问冲突。 
 4.2 原始dao开发方法(程序员需要些dao的接口,和dao的实现类) 
 4.2.1实现思路 程序员需要书写dao接口和dao实现类 需要向dao实现类总注入statement,在方法中通过SqlSessionFactory创建SQLSession 
 4.2.2 dao接口 UserDao 
 4.2.3 dao接口实现类 UserDaoImpl 
 4.2.4 总结原始dao开发方式的问题 
 1.dao接口实现类中存在大量的模板方法,设想能否将这些方法提取出来,大大减轻程序员工作量 
 2.调用SQLSession的方法的时候,将statement的id硬编码了 
 3.调用SQLSession方法时,传入变量,由于SQLSession方法使用泛型,即使变量类型传入错误,但是编译阶段不报错,不利于程序员开发的 
 4.3 mapper代理方式(程序员只需要书写mapper接口(相当于接口的书写))
 4.3.1 思路 
 1.需要编写mapper.xml映射文件 
 2.需要编写mapper接口,需要遵循一些开发规范,mybatis可以自动的将生成mapper接口实现类的代理对象 
 开发规范: 
 1.在mapper.xml的namespace的名字要等于mapper接口地址 
 2.mapper.java和mapper.xml中statement的id一致 
 3.mapper.java接口中的方法输入参数类型和mapper.xml中statment的parameterType指定的类型一致 
 4.mapper.java接口中的方法返回参数类型和mapper.xml中statment的resultType指定的类型一致 
 总结: 以上的开发规范,主要是对以下的代码进行规范 
 SqlSession sqlSession = sqlSessionFactory.openSession(); 
 <程序员书写的代码的地方> 
 sqlSession.close(); 
 4.3.2 Mapper.java 
 public interface UserMapper { //根据id来查询用户的信息 public User findUserById(String id) throws IOException; } 
 4.3.3 Mapper.xml 
 和User.xml是一样的,不同的是,遵循了上面的开发规范 在弄好了mapper.xml过后,需要在mybatis的配置文件中加载,否则mybatis框架不知道这个是一个mapper代理 
 4.3.4 
 4.3.5 代理对象内部,调用selectONe或者selectList 如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库,不能使用selectList 如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库,不能使用selectOne, 
 4.3.6 mapper方法参数的个数只能有一个是否影响系统开发 mapper方法参数只有一个是否影响系统的扩展维护 在系统框架中,dao层的代码,一定是功用的,被业务层功用的 即使mapper接口只有一个参数,也可以变相的让他支持所有接口,可以使用包装类型pojo满足不同的业务的方法的需求 注意:持久层中方法的参数可以用包装类型,map。。service方法不要使用包装类型(不利于业务层的可扩展性或者是维护)。
 

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

Copyright;  ©2015-2017  知了堂学习社区  Powered by  知了堂Edu!     ( 蜀ICP备16011312号-1 )