文章目录
业界对Bean的一些概念说法
pojo:不按mvc分层,只是java bean有一些属性,还有get set方法
domain:不按mvc分层,只是java bean有一些属性,还有get set方法
po:用在持久层,还可以再增加或者修改的时候,从页面直接传入action中,它里面的java bean 类名等于表名,
属性名等于表的字段名,还有对应的get set方法
vo: view object表现层对象,主要用于在高级查询中从页面接收传过来的各种参数.好处是扩展性强
bo: 用在servie层,现在企业基本不用.
这些po,vo, bo,pojo可以用在各种层面吗
可以,也就是po用在表现层,vo用在持久层不报错,因为都是普通的java bean没有语法错误.
但是在企业最好不要混着用,因为这些都是设计的原则,混着用比较乱.不利于代码维护.
自学方法论: 1理论 -> 2实践 -> 3理论 -> 4实践 反复迭代三遍
mybatis是一个持久层框架, 作用是跟数据库交互完成增删改查,底层对jdbc进行了封装。
jdbc编程(连接MySQL DB)
1、注册驱动: Class.forName(“com.mysql.jdbc.Driver”);
2、打开连接:DriverManager.getConnection(url,username,password);
3、创建语句:connection.createStatement();
4、执行SQL得到ResultSet或者执行增删改操作:statement.executeQuery(sql语句);
5、关闭DB相关资源;
传统的JDBC方式存在一些弊端:
- 1):工作量比较大。我们需要先建立链接,然后处理JDBC底层业务,处理数据类型。我们还需要处理Connection对象,Statement对象和Result对象去拿数据,并关闭它们。
- 2):我们要对JDBC编程处理的异常进行捕获处理并正确的关闭资源。
- 3):问题1:频繁创建和释放资源,没有达到资源重用的目的。
- 4):问题2:SQL语句在代码里写死了,硬编码不利于维护,传参也是硬编码不利于维护。
- 5):问题3:解析结果集也硬编码了,不利于维护。
mybatis 封装jdbc
1、SqlSessionFactoryBuilder(构造器)根据配置信息或者代码构建SqlSessionFactory。
2、SqlSessionFactory(工程接口)依靠工程生成SqlSession,如:spring整合mybatis的SqlSessionFactoryBean配置其DataSource和mybatis相关配置就可以生成SqlSession。
3、SqlSession(会话):既可以发送sql去执行并且返回结果,也可以获取Mapper接口。
4、SqlMapper:是由一个java接口和xml文件(或注解)构成,需要给出对应的sql和映射规则。sql是由Mapper发送出去,并且返回结果。
从上面的流程图可以看出MyBatis和JDBC的执行是相似的。Mybatis的实现原理就是对JDBC进行了封装,将相应的接口留给了开发者。开发者在配置文件中填写自己的数据库类型,数据库,数据表,用户名,密码,相应的SQL语句即可,省去了创建连接,创建Statement对象和ResultSet对象,大大的提高了代码复用性。MyBatis相对于JDBC执行的速度相对较慢,因为JDBC更接近底层。
注意:输出结果类型中没有List类型,如果是返回多个结果时,比如select * from user,返回对个user时,参数结果类型是User,会自动封装到List< User>里。
实现对DB的CRUD:
- 原生Dao实现(需要接口+实现类)
通过SqlSessionFactoryBuilder 构建SqlSessionFactory,通过SqlSessionFactory打开sqlSession会话,通过直接调用sqlSession的CRUD的api操作DB,比如:sqlSession.selectOne(sqlId,参数列表);
/**
* 作用:在测试方法前执行这个方法
* @throws Exception
*/
@Before
public void setUp() throws Exception{
String resource = "SqlMapConfig.xml";
//通过流将核心配置文件读取进来
InputStream inputStream = Resources.getResourceAsStream(resource);
//通过核心配置文件输入流来创建会话工厂
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception{
//将初始化好的工厂注入到实现类中
UserDao userDao = new UserDaoImpl(factory);
User user = userDao.findUserById(1);
System.out.println(user);
}
// dao的实现:
private SqlSessionFactory sqlSessionFactory;
// 通过构造方法注入sqlSessionFactory
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(Integer id) {
/**
* sqlSesion是线程不安全的,所以它的最佳使用范围在方法体内
*/
SqlSession openSession = sqlSessionFactory.openSession();
User user = openSession.selectOne("test.findUserById", id);
return user;
}
- 动态代理方式实现(只需要接口,xml是实现)
mapper接口代理实现编写规则:- xml映射文件中namespace要等于mapper接口的全路径名称
- xml映射文件中sql语句的id要等于mapper接口的方法名称
- xml映射文件中传入参数类型要等于mapper接口方法的传入参数类型
- xml映射文件中返回结果集类型要等于mapper接口方法的返回值类型
通过SqlSessionFactoryBuilder 构建SqlSessionFactory,通过SqlSessionFactory打开sqlSession会话,通过sqlSession.getMapper(UserMapper.class)的方式,获取Mapper接口的动态代理对象,通过动态代理对象完成对DB的CRUD操作。
@Test
public void testFindUserById() throws Exception{
SqlSession openSession = factory.openSession();
//通过getMapper方法来实例化接口,如果spring整合了mybatis,那么直接通过IoC容器,注入一个mapper接口即可以获得该mapper代理对象。
UserMapper mapper = openSession.getMapper(UserMapper.class);
// mapper是动态代理对象,这种方式是通过代理方式来完成对DB的CRUD操作
User user = mapper.findUserById(1);
System.out.println(user);
}
mybatis中的#{},${}
- #{}占位符:占位
如果传入的是基本类型,那么#{}中的变量名称可以随意写
如果传入的参数是pojo类型,那么#{}中的变量名称必须是pojo中的属性.属性.属性… -
拼
接
符
:
字
符
串
原
样
拼
接
如
果
传
入
的
是
基
本
类
型
,
那
么
{}拼接符:字符串原样拼接 如果传入的是基本类型,那么
拼接符:字符串原样拼接如果传入的是基本类型,那么{}中的变量名必须是value
如果传入的参数是pojo类型,那么${}中的变量名称必须是pojo中的属性.属性.属性…
注意:使用拼接符有可能造成sql注入,在页面输入的时候可以加入校验,不可输入sql关键字,不可输入空格
映射文件:
- 1)传入参数类型通过parameterType属性指定
- 2)返回结果集类型通过resultType属性指定
hibernate和mybatis区别:
- hibernate:它是一个标准的orm框架,对jdbc重量级封装,学习成本高.
优点:高度封装,使用起来不用写sql,开发的时候,会减低开发周期.
缺点:sql语句无法优化
应用场景:oa(办公自动化系统), erp(企业的流程系统)等,还有一些政府项目,
总的来说在用户量不大,并发量小的时候使用. - mybatis:它不是一个orm框架, 它是对jdbc的轻量级封装, 学习成本低,比较简单。
优点:学习成本低, sql语句可以优化, 执行效率高,速度快
缺点:编码量较大,会拖慢开发周期
应用场景: 互联网项目,比如电商,p2p等
总的来说用于用户量较大,并发高的项目.
总结
-
输入映射(就是映射文件中可以传入哪些参数类型)
1)基本类型以及String类型
2)pojo类型、Vo类型
3)map -
输出映射(返回的结果集可以有哪些类型)
1)基本类型以及String类型
2)pojo类型、Vo类型
3)map
4)resultType没有List类型,但是如果是多个会自动封装到List里返回。 -
动态sql:动态的拼接sql语句,因为sql中where条件有可能多也有可能少
1)where:可以自动添加where关键字,还可以去掉第一个条件的and关键字
2)if:判断传入的参数是否为空
3)foreach:循环遍历传入的集合参数
4)sql:封装查询条件,以达到重用的目的 -
对单个对象的映射关系:
1)自动关联(偷懒的办法):可以自定义一个大而全的pojo类,然后自动映射其实是根据数据库总的字段名称和
pojo中的属性名称对应.
2)手动关联: 需要指定数据库中表的字段名称和java的pojo类中的属性名称的对应关系.
使用association标签 -
对集合对象的映射关系
只能使用手动映射:指定表中字段名称和pojo中属性名称的对应关系
使用collection标签 -
spring和mybatis整合
整合后SqlSession会话、SqlSessionFactory工厂都归spring管理
1)原生Dao实现:
需要在spring配置文件中指定dao实现类
dao实现类需要继承SqlSessionDaoSupport超类,在spring容器中注入SqlSessionFactoryBean,可以方便的获取到SqlSession会话
在dao实现类中不要手动关闭会话,不要自己提交事务.
2)Mapper接口代理实现:
在spring配置文件中可以使用包扫描的方式,一次性的将所有mapper加载 -
逆向工程:自动生成Pojo类,还可以自动生成Mapper接口和映射文件
注意:生成的方式是追加而不是覆盖,所以不可以重复生成,重复生成的文件有问题.
如果想重复生成将原来生成的文件删除