(1)头脑风暴:把我能想到的写下来:
Mybatis:
因为Java是面向对象的语言,而数据库多是面向关系的,存在阻抗不匹配的问题,需要把数据库中的一条条记录映射成面向对象中的类,字段映射成属性。
[在MVC下还需要一个持久层,与DB数据库进行交互。]
Mybatis框架实现了这样的封装,不需要我们手写JDBC,只需要配置SqlConfig.xml,用SqlSessionFactory和SqlSedssion,和mapper,即可执行select、insert、delete、update等操作。
除了在pom.xml中导入相关的sql、Mybatis依赖以外,还需要新建db.properties,(与数据库相关,都需要这个属性文件)
jdbc.driver:com.sql.driver
jdbc.url:3306:
jdbc.username:
jdbc.password:
[改:]
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ming?useSSL=false
jdbc.username=root
jdbc.password=jdpy1229jiajia
还需要两个核心配置文件:sqlSessionConfig.xml,还有一个是usermap.xml。这里的user正是数据库表映射到java中的类。
[改:sqlMapConfig.xml]
[改:]
select * from user where id=#{value}
在sqlSessionConfig.xml中使之能扫描到db.properties,SqlSessionFactory是重量级,每连接一次数据库需要new一个,而SqlSession是轻量级封装,相当于JDBC的Conection。
接下来在usermap.xml,在usermap.xml中,命名空间很重要,是一定要有的。写CRUD操作:
[改:mapper workspace=“test”]
<workspace name="test">
<mapper>mu
<select id="querByID" parameterType="int" reseltType="com.bit.user">
select * from user where id=${value}
</select>
</mapper>
select的parameterType为传入的参数类型,这里查询的ID是int型,对应的引用符号${}
中,如果引用的变量是基本类型,${}
中可以随意命名,如果不是基本类型,${}
中需要是value。(统一起见,不论引用的变量是不是基本类型,都写成${}
)resultType为执行了sql语句后返回的结果类型。这里的"id"需要和数据库中的属性名一致。还有其他几种操作…
在测试类中写:
public class Test
{
private SqlSessionFactory;
public void test1()
{
SqlSessionFactory sqlsessionfactory=new SqlSessionFactory();
SqlSession sqlsession=sqlsessionfactory.openSession();
user user1=sqlsession.selectone("test.queryByID,1");
}
}
[改:见(2)]
selectone中传入的参数是命名空间和paramater的那个int,这样就可以通过Mybatis进行增删改查操作了。
执行模糊查询,第一种方式:
<select id="queryByName" parameterType="String" resultType="com.bit.user">
select * from user where name like #{value}
</select>
sql语句应是:select * from user where name like '%vin%'
在单元测试中写:
user user1=sqlsession.select("test.queryByName,%vin%");
[模糊查询,第二种方式(模糊查询时推荐此方式)]
select * from user where username like '%${value}%';
单元测试中写:
user user1=sqlsession.select("test.queryByName,vin");
以上可知:#{}
与${}
的区别:
#
将传入的数据都当成一个字符串,会对传入的数据自动加上引号;
$
将传入的数据直接显示生成在SQL中。
注意:使用$
占位符可能会导致SQL注射攻击,能用#
的地方就不要使用$
,写order by子句的时候应该用$
而不是#
。
还可以传入对象,MyBatis可以通过该类的get方法自动获取相应属性。
<mapper>
<update id="updateUser" parameterType="com.bit.user" reseltType="com.bit.user">
update user set (${userid},${username});
</update>
</mapper>
[改:]
<update id="updateUser" parameterType="com.bit.po.user">
update user set username=#{userName} where userid=#{userID};
</update>
单元测试中写:
@Test
public void updateUser()
{
SqlSession sqlSession=sqlSessionFactory.openSession();
try{
user user4=new user();
user4.setUserName("HHHH");
user4.setUserID(9);
int flag=sqlSession.update("test.updateUser",user4);
//事务相关,除了查询操作以外,其他执行操作之后需要提交事务。
sqlSession.commit();
System.out.println(flag);
}
要注意${}
中的变量名需要于user类的属性名一致,这样才可去调getter方法。
SpringMVC+JDBC
Dao层:用于与数据库交互,提供接口。JDBC操作写在这里。
[改:JDBC操作是写在tools包下的DbManager类中的,Dao层只是调用dbmanager的执行方法。]
Po层:持久层,将数据库中的字段映射成类 user类。
Service层:处理业务逻辑,提供服务。有接口和其实现类。
Controller层:控制层。
继承controller类并覆写其handleRequest方法,返回ModelAndView模型与视图。
动态代理实现Mybatis:
需要有接口IUserDao,接口中提供queryByID方法,不需要实现类,将之前的usermap.xml改名为IUserDao.xml(必须和接口名一致),和接口放在同一个包下,在sqlmapConfig.xml中设置使扫描这个包。
public interface IUserDao
{public void queryByID(int id);}
在IUserDao.xml中写:
<mapper namespace="com.bit.dao.IUserDao">
<select id="queryByID" paramaterType="int">
select * from user where id=${value};
</select>
这里的namespace要与接口名一致,id必须与方法名一致,paramaterType要与方法的传入参数一致(如果方法有返回值还需要有resultType)
在单元测试中写:
public void test()
{SqlSession sqlSession=sqlSessionFactory.openSession();
//代理对象与被代理对象实现同一接口,所以生成的代理对象也实现了IUserDao这个接口
try
{
IUserDao userDao=sqlSession.getMapper(IUserDao.class);
user user1=userDao.queryUserById(2);
System.out.println(user1);
}
catch (Exception ex)
{ex.printStackTrace();}
finally {
sqlSession.close();
}
}
(2)第一次复习后:
MyBatis:
sqlMapConfig.xml
命名空间是:
<mapper workspace="test">
通过这样的方式读取db.resources:
<properties resources="db.properties">
<property url="#{jdbc.url}">
<......>
[改:]
configuration>
<!--和数据库相关的信息-->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--需要添加核心信息-->
<mappers>
<package name="com.bit.dao"/>
</mappers>
某规则(7):如上,进行包扫描,可以扫描到该包下和接口名字一致的那个IUserDao.xml。
在单元测试中写:
IUserDao iuserdao=sqlsession.getMapper(IUserDao.class);
user user1=iuserdao.queryByID();
动态代理实现Mybatis的七个规则
规则1:workspace与接口名一致,
2:方法名与id名一致
3.方法参数与ParameterType一致
4.方法返回值与ResultType一致
5.接口与xml名字一致
6.接口与xml在同一个包下
7.通过包扫描
(这里的Dao包即Mapper)
InputStream in=Resource.setAsStream("sqlMapConfig,xml");
SqlSessionFactory sqlsessionfactory=new SqlSessionFactoryBuilder.build(in);
SqlSession sqlsession=sqlsessionfactory.opensession();
关于#{},${}
:
select * from user where id=#{value}
#{}
表示占位符,相当于select * from user where id=?
value的值会代替?。
而${}
表示字符串替代。
除了查询操作外其他事务都需要sqlSession.commit(),事务失败了要进行回滚sqlSession.rollback(), 最后还要关闭sqlSession.close()。
SpringMVC+JDBC:(以查询为例)
在po(持久化对象)包中封装数据库映射成的类,需要其toString、getter、setter方法。
在Controller中调用Service的方法,将查询结果通过ModelAndView返回。
在Service中调用Dao的方法。
[在Service层需要接口和实现类]
在Dao(数据访问层)中调用Dbmanager的exequery方法,封装为查询方法。
在tools包下写Dbmanager类,其中包括JDBC所需要的方法:conection,statement,resultset…
(3)补充:
ORM(Object-Relational Mapping) 对象关系映射,是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术。
这篇很好:https://www.cnblogs.com/Kevin-ZhangCG/p/9059303.html
- Web的经典三层架构:
1.表现层:V,C。主要接受用户的请求和把对应的页面响应给用户浏览器。
2.业务逻辑层:M中的Service,与数据库联动,处理增删改查。
3.数据访问层/持久层。M中的Dao,提供接口支持。
不使用Mybatis,我们把持久层就叫Dao,使用了Mybatis,我们把持久层叫做Mapper,