发表于: 2018-03-21 23:36:40

1 723


今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin) 

一、改善结构并创建service层代码

1.首先按照师兄意见规范结构,将Mapper规范为Dao,然后删掉不必要的包,最后结构如下

按照正常创建步骤,先是实体类Person,再是PersonMapper.xml里面有详细的增删查改的sql语句以及对应参数类型,再是IPersonDao,里面是与xml中的ID一一对应的java增删查改方法,再是PersonService,里面通过连接mybatis-config.xml创建sessionFactory,再创建session,通过session利用动态代理创建personDao,再通过personDao调用PersonDao中的方法,最后再在主方法中调用service层的方法就可以实现数据库的增删改查等操作了.

2.下面是PersonService具体代码,以及PersonServiceImpl

public interface PersonService {
//增加并查找
   public List<Person> addAndList(Person person, Map map) throws Exception;
//删除并查找
   public List<Person> DeleteAndList(int id,Map map)throws Exception;
//更新并查找
   public List<Person> updateAndList(Person person, Map map) throws Exception;
//查询
   public List<Person> justList(Map map) throws Exception;
//增加
   public void justAdd(Person person)throws Exception;
//删除
   public void justDelete(int id)throws Exception;
//更新
   public void justUpdate(Person person)throws Exception;
}
public class PersonServiceImpl implements PersonService{
public List<Person> addAndList(Person person, Map map) throws Exception{
SqlSession session= getSqlsession();
IPersonDao personDao=session.getMapper(IPersonDao.class);
personDao.addPerson(person);
List<Person> list=personDao.listPerson(map);
session.close();
return list;
}
public List<Person> DeleteAndList(int id,Map map)throws Exception{
SqlSession session= getSqlsession();
IPersonDao personDao=session.getMapper(IPersonDao.class);
personDao.deletePerson(id);
List<Person> list=personDao.listPerson(map);
session.close();
return list;
}
public List<Person> updateAndList(Person person, Map map) throws Exception{
SqlSession session= getSqlsession();
IPersonDao personDao=session.getMapper(IPersonDao.class);
personDao.updatePerson(person);
List<Person> list=personDao.listPerson(map);
session.close();
return list;
}
public List<Person> justList(Map map) throws Exception{
SqlSession session= getSqlsession();
IPersonDao personDao=session.getMapper(IPersonDao.class);
List<Person> list=personDao.listPerson(map);
session.close();
return list;
}
public void justAdd(Person person)throws Exception{
SqlSession session= getSqlsession();
IPersonDao personDao=session.getMapper(IPersonDao.class);
personDao.addPerson(person);
session.close();
}
public void justDelete(int id)throws Exception{
SqlSession session= getSqlsession();
IPersonDao personDao=session.getMapper(IPersonDao.class);
personDao.deletePerson(id);
session.close();
}
public void justUpdate(Person person)throws Exception{
SqlSession session= getSqlsession();
IPersonDao personDao=session.getMapper(IPersonDao.class);
personDao.updatePerson(person);
session.close();
}
//建立一个私有的方法,将原本工具类的连接数据库生成session的方法放到这里,在本类其他方法中调用
   private static SqlSession getSqlsession() throws Exception{
String resource="mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(inputStream) ;
SqlSession session=sessionFactory.openSession(true);//设置为true后就不用手动提交事务了
       return  session;
}
}

可以看到有单纯的增删改查,也有合并两个方法后的增加后返回结果看是否增加成功的诸如此类方法,

然后在Main中建立一个主方法,先增加1000条数据,再模糊查找看是否添加成功

public class Main {
public static void main(String[] args) throws Exception{
//在main方法中插入一千条数据
       PersonService pes=new PersonServiceImpl();
Person p1;
for(int i=0;i<1000;i++){
p1=new Person("zhangsan"+i,25,"201111"+i);
pes.justAdd(p1);
}
//利用模糊搜索查询包含zhangsan99的数据并返回结果
       HashMap<String,Object> parms=new HashMap<>();
parms.put("name","zhangsan99");
List<Person> people=pes.justList(parms);
for(Person p2:people){
System.out.printf("%d\t%s\t%d\t%s%n",p2.getId(),p2.getName(),p2.getAge(),p2.getPersonID());
}
}
}

3.可以看到,数据是插入成功的,并且在Main中没有涉及到底层数据库方面的信息,只是按照Service中设定好的方法调用即可,从而实现了Controller层(即这里的Main)调用Service层,Service层调用Dao层的目的。

但是相比与Test类中的测试,这个还是比较麻烦的,因为在Test中每个单独测试的方法是可以单独运行的,但是Main方法一个类却只能有一个,如果我现在还想测试循环删除1000条数据的话,就得把上面的注释掉或者重新建立一个Main方法。

可以看到在代码中,尤其是Service中,每个方法前面都是重复的,所以可以利用spring中的IOC原理,将Spring融合进来,实现自动生成对象,从而达到缩减代码的功能。

二、Mybatis整合Spring,即Mybatis-Spring

1.Mybatis-Spring可以帮助我们将mybatis代码无缝整合到Spring中,使用这个类库中的类,Spring将会加载必要的Mybatis工厂类和Session类,从而实现上面所说的自动生成对象,减少代码的目的。这个类库也提供简单的方式来注入Mybaitis数据映射器和sqlSession到业务层的Bean中,这正是我们需要的,从上面service层可以看出急需注入sqlSession。同时,它也会处理事务,翻译mybatis的异常到Spring的DataAccessException(数据访问异常)中。最终,它并不会依赖于MyBatis,Spring和Mybatis-Spring来构建应用程序代码。

2.首先在pom.xml中导入Mybatis-Spring的整合包

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>

3.要和Spring一起使用Mybatis,我们需要在spring的配置文件中至少有两个东西:一个sqlSessionFactory和至少一个数据映射器类,即XXMapper.xml.

在 MyBatis-Spring 中,SqlSessionFactoryBean 是用于创建 SqlSessionFactory 的。要 配置这个工厂 bean,放置下面的代码在 Spring 的 XML 配置文件中:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 

  <property name="dataSource" ref="dataSource" />

</bean>

要注意 SqlSessionFactory 需要一个 DataSource(数据源) 。这可以是任意 的 DataSource,配置它就和配置其它 Spring 数据库连接一样。

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>1024</value>
</property>
</bean>

另外两个具体配置如下

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/><!--指定连接数据库的数据源-->
   <property name="mapperLocations" value="classpath:mappers/PersonMappers.xml"/><!--指定mapper文件存放的位置-->
   <property name="typeAliasesPackage" value="com.task.model"/><!--实体类所在的包-->
   <property name="configLocation" value="mybatis-config.xml"/><!--指定mybatis配置文件位置-->

</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.task.dao"/>

</bean>


明天计划的事情:(一定要写非常细致的内容) 

继续研究Mybatis-Spring,争取先把成品写出来再去慢慢理解程序的实现原理
遇到的问题:(遇到什么困难,怎么解决的) 

1.依赖的导入,首先是依赖包不能少,也尽量不要重复,在导入过程中注意它下载导入完毕再退出,否则容易看起来没问题实际上使用起来却不能正确导入
收获:(通过今天的学习,学到了什么知识)

1.学习了service层的具体写法

2.了解了mybatis-Spring模式的配置方法以及作用原理的大概


返回列表 返回列表
评论

    分享到