发表于: 2018-03-22 23:14:24
1 633
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
一、Mybatis-Spring整合
1.首先一点,将不相关的不需要的文件删除掉,包括mybaitis-config.xml(其基本配置包括dataSource和Mapper映射地址已经在applicationContext.xml中有了),PersonServiceImpl中的getSqlsession方法(其为静态方法,在加载类时会自动加载,从而与mybatis-config.xml文件从而与加载applicationContext.xml冲突),webapp文件夹(其中的文件没有修改过很多都有错误),pom.xml中的packaging属性修改为jar(原本为war),此属性可以修改为jar,war,pom,apk等,根据实际需求选择。
2.在昨天基础上修改的配置文件和java文件如下
applicationContext.xml,暂时只需要这三个类,其他的先不用考虑
<!-- 连接jdbc数据库所需要的数据信息-->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="1024"/>
</bean>
<!-- sqlSessionFactory类,用于创建sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/><!--指定连接数据库的数据源-->
<property name="mapperLocations" value="classpath:mappers/PersonMappers.xml"/><!--指定mapper文件存放的位置,如果和Dao文件同名同包,可以不写此行-->
<property name="typeAliasesPackage" value="com.task.model"/><!--实体类所在的包-->
</bean>
<!--数据映射器类,将PersonMapper接口加入Spring中,注意只能是接口不能是具体实现类-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.task.dao"/><!--扫描Mapper类所在包-->
</bean>
</beans>
PersonServiceImpl
public class PersonServiceImpl implements PersonService {
//与applicationContext建立连接
private ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
private IPersonDao personDao = ctx.getBean(IPersonDao.class);//获得可以调用Dao层方法的对象
//可以看到相比未整合之前,Impl中具体方法的实现简洁了很多,只需要使用产生的personDao对象执行Mapper.xml中对应的sql语句即可
public List<Person> addAndList(Person person, Map map) {
personDao.addPerson(person);
List<Person> list = personDao.listPerson(map);
return list;
}
对比之前未整合时的获取personDao的方法
String resource="mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(inputStream) ;SqlSession session=sessionFactory.openSession(true);
IPersonDao personDao=session.getMapper(IPersonDao.class);
在原先的 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时 候, 你可以关闭 session。
使用 MyBatis-Spring 之后, 你不再需要直接使用 SqlSessionFactory 了,因为你的 bean 可以通过一个线程安全的 SqlSession 来注入,基于 Spring 的事务配置 来自动提交,回滚,关闭 session。
注意通常不必直接使用 SqlSession。 在大多数情况下 MapperFactoryBean, 将会在 service层bean 中注入所需要的映射器接口,只需使用getBean从中提取即可。
在Main中测试
public class Main {
public static void main(String[] args) {
PersonServiceImpl psi=new PersonServiceImpl();
Person p1=new Person("wangwu",25,"2011115555");
psi.justAdd(p1);
}
}
可以看到插入成功了,然后是在测试类中的增删查改全测试
public class PersonServiceTest {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
IPersonDao personDao = ctx.getBean(IPersonDao.class);
@Test
public void addAndList() {
Person p=new Person("xiaojian",25,"201111");
personDao.addPerson(p);
Map<String,Object> parms=new HashMap<>();
parms.put("name","xiaojian");
List<Person> ps=personDao.listPerson(parms);
for(Person p1:ps){
System.out.printf("%d\t%s\t%d\t%s%n",p1.getId(),p1.getName(),p1.getAge(),p1.getPersonID());
}
}
@Test
public void deleteAndList() {
personDao.deletePerson(1410);
Map<String,Object> parms=new HashMap<>();
parms.put("name","lisi9");
List<Person> ps=personDao.listPerson(parms);
for(Person p1:ps){
System.out.printf("%d\t%s\t%d\t%s%n",p1.getId(),p1.getName(),p1.getAge(),p1.getPersonID());
}
}
@Test
public void updateAndList() {
Person p=new Person(1408,"wangsan",28,"207777");
personDao.updatePerson(p);
Map<String,Object> parms=new HashMap<>();
parms.put("name","wang");
List<Person> ps=personDao.listPerson(parms);
for(Person p1:ps){
System.out.printf("%d\t%s\t%d\t%s%n",p1.getId(),p1.getName(),p1.getAge(),p1.getPersonID());
}
}
@Test
public void justList() {
Map<String,Object> parms=new HashMap<>();
parms.put("name","lisi25");
List<Person> ps=personDao.listPerson(parms);
for(Person p1:ps){
System.out.printf("%d\t%s\t%d\t%s%n",p1.getId(),p1.getName(),p1.getAge(),p1.getPersonID());
}
}
@Test
public void justAdd() {
for(int i=0;i<500;i++){
Person p1=new Person("zhangsan"+i,25,"2015"+i);
personDao.addPerson(p1);
}
}
@Test
public void justDelete() {
for(int i=1544;i<2544;i++){
personDao.deletePerson(i);
}
}
@Test
public void justUpdate() {
for(int i=2545;i<3045;i++){
Person p1=new Person(i,"lisi"+i,28,"2017"+i*2);
personDao.updatePerson(p1);
}
}
}
可以看到虽然都是可以正常运行,但是反馈效果很差,比如删除数据之后,并不知道是否删除成功,所以还需要对其进行修改,使得增删改后可以有一个反馈结果,修改IPersonDao如下
public interface IPersonDao {
Boolean addPerson(Person person); //修改为Boolean类型,则成功后会返回ture,失败则返回false
Boolean deletePerson(int id);
Boolean updatePerson(Person person);
Person getPerson(int id);
List<Person> listPerson(Map map);
List<Person> listPersonById(List list);
}
修改PersonService如下
public interface PersonService {
//增加并查找
List<Person> addAndList(Person person, Map map) throws Exception;
//删除并查找
List<Person> DeleteAndList(int id,Map map)throws Exception;
//更新并查找
List<Person> updateAndList(Person person, Map map) throws Exception;
//查询
List<Person> justList(Map map) throws Exception;
//增加并返回增加后的id确认增加成功
int justAdd(Person person)throws Exception;
//删除并返回结果
Boolean justDelete(int id)throws Exception;
//更新并返回结果
Boolean justUpdate(Person person)throws Exception;
}
修改PersonServiceImpl如下
public class PersonServiceImpl implements PersonService {
private ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
private IPersonDao personDao = ctx.getBean(IPersonDao.class);
//操作并返回此person的id
public int justAdd(Person person) {
personDao.addPerson(person);
return person.getId();
}
//操作并返回是否成功
public Boolean justDelete(int id) {
return personDao.deletePerson(id);
}
//操作并返回是否成功
public Boolean justUpdate(Person person) {
return personDao.updatePerson(person);
}
}
Main中的实例如下
public class Main {
public static void main(String[] args)throws Exception {
//增加信息并返回新增加的id
PersonService ps=new PersonServiceImpl();
Person p1=new Person("wangwu",25,"2011115555");
System.out.println("新添加对象学号为:"+ps.justAdd(p1));
//删除信息并返回操作结果
if(ps.justDelete(3050)){
System.out.println("删除成功");
}else
System.out.println("删除失败");
//更新数据并返回操作结果
Person p2=new Person(1,"chengsan",35,"207778963");
if (ps.justUpdate(p2)){
System.out.println("更新成功");
}else
System.out.println("更新失败");
}
}
结果如下
可以看到,因为删除和修改的id都不存在,如果没有返回结果的话,此时系统不会报错,我们也不知道有没有成功,但是此时却可以知道操作是否有效。
明天计划的事情:(一定要写非常细致的内容)
今天对比了师兄的成型代码,再对比后面的几个任务,发现现在的差距主要在这几方面:
1.统计时间,即creat_at属性缺失
2.没有用到try catch,则在有些可以回滚的错误发生时只会让系统运行失败
3.连接池没有设置
明天主要在这几方面上看
遇到的问题:(遇到什么困难,怎么解决的)
主要是之前的mybatis-spring跑出来一堆报错,在师兄的帮助下各种排查,自己本来的jar文件,文件结构全都换掉了,最后才勉强跑通。。。涉及到看错误信息,控制变量排错
收获:(通过今天的学习,学到了什么知识)
跑通了mybatis-spring,并且稍微修改了结果反馈,对于applicationContext.xml的三个基本属性稍微有点了解了,但是还是不够深入,慢慢加强吧。
评论