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元。相比前一段时间比特币价格的六万美元高位,