范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Java基础Mybatis教程(一)

  C
  为什么学Mybatis?
  1. 目前最主流的持久层框架为hibernate与mybatis,而且国内目前情况使用Mybatis的公司比hibernate要多。
  2. Hibernate学习门槛不低,要精通门槛更高。门槛高在怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate缓存与数据加载策略方面需要你的经验和能力都很强才行。国内目前前的情况精通hibernate技术大牛非常少。
  3. sql优化方面,Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。当然了,Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。说得更深入一些,如果有个查询要关联多张表,比如5张表,10张表时,而且,我们要取的字段只是其中几张表的部分字段。这时用hibernate时就会显得非常力不从心。就算用hibernate的sqlquery,后续的维护工作也会让人发狂。JDBC编程回顾与存在的问题分析开发步骤:
  1. 导入数据脚本,在课前资料中有
  2. 创建工程,导入mysql jar包
  3. 编码Jdbc访问数据库的过程:
  1. //加载数据库驱动
  2. //创建数据库连接
  3. //创建statement
  4. //设置sql语句
  5. //设置查询参数
  6. //执行查询,得到ResultSet
  7. //解析结果集ResultSet
  8. //释放资源Jdbc存在的问题:
  1. 频繁创建和打开、关闭数据连接,太消耗资源
  2. Sql语句存在硬编码,不利于维护
  3. Sql参数设置硬编码,不利于维护
  4. 结果集获取与遍历复杂,存在硬编码,不利于维护,期望能够查询后返回一个java对象Mybatis介绍
  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
  Mybatis是面向sql的持久层框架,他封装了jdbc访问数据库的过程,我们开发,只需专注于sql语句本身的拼装,其它复杂的过程全部可以交给mybatis去完成。Mybaits入门需求列表
  根据用户ID查询用户信息
  根据用户名查找用户列表
  添加用户
  修改用户
  删除用户工程搭建
  1. 导入依赖jar包,在课前资源中有
  2. 配置SqlMapConfig.xml,可参考课前资料
  3. 配置log4j.properties,可参考课前资料
  4. 在课前资料复制pojo到工程目录下
  5. 配置sql查询的映射文件,可参考课前资料
  6. 加载映射文件完成需求需求完成步骤
  1. 编写sql语句
  2. 配置user映射文件
  3. 编写测试程序根据用户ID查询用户信息映射文件与sql  SELECT * FROM USER WHERE id = #{id1}  MyBatis访问数据库代码@Test public void testGetUserByid() throws IOException { // 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder(); // 查找配置文件创建输入流 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 加载配置文件,创建SqlSessionFactory对象 SqlSessionFactory	sqlSessionFactory = sfb.build(inputStream); // 创建SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 执行查询,参数一:要查询的statementId ,参数二:sql语句入参 User user = sqlSession.selectOne("user.getUserById", 1); // 输出查询结果 System.out.println(user); // 释放资源 sqlSession.close(); } 抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory创建过程/** * SqlSessionFactory工具类 * * @author Steven * */ public class SqlSessionFactoryUtils { /** * 单例SqlSessionFactory */ private static SqlSessionFactory sqlSessionFactory; static { // 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder(); try { // 查找配置文件创建输入流 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 加载配置文件,创建SqlSessionFactory对象 sqlSessionFactory = sfb.build(inputStream); } catch (IOException e) { e.printStackTrace(); } } /** * 获取单例SqlSessionFactory * @return */ public static SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } } 根据用户名查找用户列表映射文件与sql   SELECT * FROM USER WHERE username LIKE "%${value}%"  MyBatis访问数据库代码@Test public void getUserByName() { SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(); //List users = sqlSession.selectList("user.getUserByName", "%张%"); Listusers = sqlSession.selectList("user.getUserByName", "张"); for (User user : users) { System.out.println(user); } // 释放资源 sqlSession.close(); } 
添加用户映射文件与sql INSERT INTO USER (`username`, `birthday`, `sex`, `address`) VALUES (#{username}, #{birthday}, #{sex}, #{address}); MyBatis访问数据库代码@Test public void testInsertUser() throws IOException { // 创建SqlSession对象 SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(); User user = new User(); user.setUsername("张飞"); user.setAddress("深圳市黑马"); user.setBirthday(new Date()); user.setSex("1"); // 执行插入 sqlSession.insert("user.insertUser", user); // 提交事务 sqlSession.commit(); // 释放资源 sqlSession.close(); } Mysql自增返回 INSERT INTO USER (`username`, `birthday`, `sex`, `address`, `uuid2`) VALUES (#{username}, #{birthday}, #{sex}, #{address}, #{uuid2}); Mysql的uuid返回主键   注:在使用uuid之前数据库user表要先加上uuid2字段、user的pojo也要加上相应属性 SELECT UUID() INSERT INTO USER (`username`, `birthday`, `sex`, `address`, `uuid2`) VALUES (#{username}, #{birthday}, #{sex}, #{address}, #{uuid2}); 修改用户   "updateUser" parameterType="com.itheima.mybatis.pojo.User">   UPDATE USER SET username = #{username} WHERE id = #{id}   删除用户   "deleteUser" parameterType="int">   DELETE FROM `user` WHERE `id` = #{id1}   Mybatis入门小结与Mybatis架构图   Mybatis Dao开发方式Dao需求   根据用户ID查询用户信息   根据用户名查找用户列表   添加用户原始Dao开发方法使用原有的user映射文件,不需修改   新建个UserDao接口public interface UserDao { /**根据用户ID查询用户信息 * @param id * @return */ User getUserById(Integer id); /** * 根据用户名查找用户列表 * @param name * @return */ List getUserByUserName(String name); /** * 添加用户 * @param user */ void insertUser(User user); } 新建个UserDaoImpl接口实现类public class UserDaoImpl implements UserDao { @Override public User getUserById(Integer id) { SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(); User user = sqlSession.selectOne("user.getUserById", id); sqlSession.close(); return user; } @Override public List getUserByUserName(String name) { SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(); Listlist = sqlSession.selectList("user.getUserByName", name); sqlSession.close(); return list; } @Override public void insertUser(User user) { SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(); sqlSession.insert("user.insertUser", user); sqlSession.commit(); sqlSession.close(); } } 使用dao测试   public class UserDaoTest { @Test public void testGetUserById() { UserDao userDao = new UserDaoImpl(); User user = userDao.getUserById(30); System.out.println(user); } @Test public void testGetUserByUserName() { UserDao userDao = new UserDaoImpl(); List list = userDao.getUserByUserName("张"); for (User user : list) { System.out.println(user); } } @Test public void testInsertUser() { UserDao userDao = new UserDaoImpl(); User user = new User(); user.setUsername("张飞3"); user.setAddress("深圳市黑马"); user.setBirthday(new Date()); user.setSex("1"); userDao.insertUser(user); } } 官方推荐,接口动态代理动态代理dao开发规则   1. namespace必需是接口的全路径名   2. 接口的方法名必需与映射文件的sql id一致   3. 接口的输入参数必需与映射文件的parameterType类型一致   4. 接口的返回类型必须与映射文件的resultType类型一致动态代理dao开发步骤   1. 创建UserMapper.xml映射文件(把原来的user.xml复制按开发规则要求修改一下)   2. 创建UserMapper接口(把原来的UserDao.java复制按开发规则要求修改一下)   3. 加载UserMapper.xml   4. 测试动态代理Dao   public class UserMapperTest { @Test public void testGetUserById() { // 加载配置得到SqlSession SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(); // 获取代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 查询数据 User user = userMapper.getUserById(30); System.out.println(user); // 关闭资源 sqlSession.close(); } @Test public void testGetUserByUserName() { SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(); // 获取代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 查询数据 List list = userMapper.getUserByName("张"); for (User user : list) { System.out.println(user); } // 关闭资源 sqlSession.close(); } @Test public void testInsertUser() { SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("张飞飞"); user.setAddress("深圳市黑马"); user.setBirthday(new Date()); user.setSex("1"); userMapper.insertUser(user); // 提交事务 sqlSession.commit(); // 关闭资源 sqlSession.close(); } } SqlMapConf.xml配置   properties属性核心文件配置 jdbc.propertiesjdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8 jdbc.username=root jdbc.password=root typeAliases   mybatis默认支持java基本数据类型的别名识别详细参考教案。   自定义别名 mappers
新款Switch将在近期发布,屏幕与性能是升级重点彭博社消息,任天堂(Nintendo)新一代NintendoSwitch(以下简称Switch)将会在未来几周内发布,并在9月或10月份发售。另外,娱乐软件协会在此前表示,E3电子618最值得购买的三款小屏旗舰当我拿到苹果12mini的时候,非常的震惊。133克,2200的电池,比苹果8小一大截,电池却比它大了近500毫安时。这是一个很大的进步,再加上1080p的OLED屏幕,像素密度4如何在618买到最值得买的手机?购机攻略不如这个骚操作又到了一年一度的618电商狂欢节,看着各种各样新机带着黑科技吊炸天,很多小伙伴一定想乘此机会换一个手机,那么怎么才能愉快的剁手呢?一般人会去逛贴吧知乎论坛看看购机攻略,然后再电商平魅族拥抱华为鸿蒙?网友以为要发大招,谁知是在耍流氓几天之前,在华为表示6月2日将正式发布鸿蒙系统后,欢迎友商共建生态之后,魅族就接住了华为抛过来的橄榄枝,表示要拥抱鸿蒙,新品5月31日发布,成功引来消费者的关注与大量支持。昨天魅族新配色新版本到手价1299起iQOOZ3成618超值之选作为iQOO此前发布的一款主流价位热门机型,iQOOZ3是其产品序列中大运存大内存入门性能级产品优选。时值618年中购物狂欢季,iQOOZ3也带来了夏日限定幻银配色和更高规格的12光明正大摸鱼?电脑端微信可以看朋友圈了网友这不和QQ一个样吗?继3月份mac版本微信支持看朋友圈之后,windows端的更新也要来了。WeChat3。3。0。55的公测版本上线。这个功能还真的是非常好用的!以前上班不敢交易额秒破5亿,看小米如何在首日,掀翻整个618随着时间的过去,这618的大战的硝烟,也是已经燃起了。这不,在今晚0点,618年中大促的开幕式就已经正式开启了。相信屏幕前应该有不少朋友,都和笔者我一样,就守着这618,准备给自己全球肉类巨头遭黑客攻击,多地停产证券时报客户端证券时报客户端6月1日消息,黑客又盯上了新猎物。成功勒索美国最大燃油管道运营商Colonial后,黑客又攻击了全球最大的肉类供应商JBS。当地时间5月31日,JBS向朵唯被罚就结束了?快手已经停止朵唯准入其实平台处理得很好,现在做主播卖货的平台有很多,如果一个平台想保持优势的话,必然得有秩序,尽可能地不出现假货。要不然直播就会像之前网上电视购物一样,被假冒产品塞满。快手对朵唯事件的华为跌倒,为何其他品牌手机也没有办法收割市场?骑过马的谁还愿意去骑驴。因为基本功不扎实,实力不够。郭德纲说过就算我死了,你乜卖不出票去!因为还有我这样的,我家买了3个P10PLUS,还有nova,及荣耀,我自己这部p10PLU比特币多少人民币,比特币值得入手吗?比特币多少人民币?我们可以从欧易OKEx提供的价格曲线图来获得这个信息。现在单枚比特币价格是在38147美元,折合人民币是在245841元。相比前一段时间比特币价格的六万美元高位,
独家揭秘河南移动副总经理余谦当地网络信号好有他一份功劳运营商财经吴碧慧文一直以来河南移动都发展得不错,而除了公司总经理外,还有一位资历很深的副总经理余谦值得关注,他也是河南移动网络建设等方面的掌舵人,此次运营商财经网试图揭秘。余谦升任高通芯片漏洞出现可能影响全球30的Android手机据安全研究人员称,一个新的高通芯片漏洞可能会影响全球30的Android手机。随着5G调制解调器数据服务中发现的漏洞,黑客可以远程瞄准Android用户,在手机的调制解调器中注入恶华为鸿蒙系统适配高通平台,小米OV是否跟进?网友可能是魅族华为鸿蒙系统公测版正在火热升级中,官方宣布在6月初推出稳定版本,各类对比AndroidiOS流畅度的视频不断流出,颇有出道即C位的味道。从目前升级鸿蒙系统公测版用户反馈看,流畅度和又涨价了特斯拉Model3Y部分车型上调500美元近日,我们从特斯拉美国官网获悉,特斯拉Model3和ModelY的部分车型又一次进行了价格上涨,涨价幅度为500美元。具体来看,Model3标准续航后驱升级版上涨至3。949万美元小米一加三星当家旗舰怎么选?优劣势都在这里了买手机说难不难,说简单也不简单。其实最重要的,一是要确定自己的预算价位,是要3000元左右还是五六千元的各家顶级旗舰二是确认自己需求,是强调整体表现还是某一方面的功能特长,比如拍照苹果的IOS,谷歌的安卓,华为的鸿蒙,谁将是未来的操作系统之王我是百科阅览,一个喜欢说闲话的人,闲话的内容不垂直不专注,跨领域跨类目。所有内容都是原创,敬请阅读,但是你若抄袭我的内容,肯定维权到底!今天聊聊华为即将面世的手机操作系统鸿蒙。最近苹果汽车iCar渲染图内置iOS系统,支持无人驾驶可续航600公里各大手机厂商都已经开始跨界,纷纷从手机制造行业进军汽车制造行业。华为和小米是手机厂商跨界造车的代表,其中华为在汽车制造方面的表现尤为耀眼。而作为第一个被传出要制造汽车消息的苹果,虽小米平板5系统界面曝光,将推出三款机型,有望采用120W快充去年的疫情导致平板市场再次被激活,这也是让不少厂商的平板销量大涨。根据StrategyAnalytics的数据显示,今年第一季度,安卓平板出货量为2380万台,同比增32,市场占有4月份中端手机性能排行榜荣耀30上榜近日,根据多家科技媒体的消息,国内手机评测机构安兔兔公布了2021年4月份的Android手机性能榜,这也是安兔兔V9大版本之后首个性能榜。按照介绍,安兔兔V9公测版发布已有月余,新能源汽车下乡启动,推荐三款纯电动代步车,2万多好看又好开今年一月份,五菱宏光MINIEV以3。7万辆的销量勇夺全球电动车销量冠军,上市200天大卖30万辆。近期上市的马卡龙版在24小时内预定量突破1万辆。五菱宏光MINIEV的火爆充分说最便宜的小米手机到底能用吗?2013年小米推出了第一代红米手机,性能好,功能搭载MIUI,价格亲民,帮助不少人完成了功能机向智能机换代的同时,也带动了整个市场的竞争和发展。我的第一部智能机红米1S就是那个时候