发表于: 2018-03-22 21:55:05

1 574


今天完成的事情:

根据验收标准,整理了一下代码,实现spring+mybatis的整合,

分为注解方式和配置文件方式

1,配置文件方式

建表

项目结构


UserDao

@Repository
public interface UserDao {
User getUserById(int id);
   User getUserByName(String name);
   User getUserByNumber(int number);
   int addUser(List<User> userList);
   int updateUser(User user);
   int deleteUser(int id);
   List<User> getAllUser();
}

映射文件userMapper.xml

<mapper namespace="com.ycc.dao.UserDao">
   <select id="getUserById" parameterType="int" resultType="User">
       select * from task1 where id=#{id}
   </select>
   <select id="getUserByName" parameterType="String" resultType="User">
       select * from task1 where stu_name=#{stu_name}
   </select>
   <select id="getUserByNumber" parameterType="int" resultType="User">
       select * from task1 where number=#{number}
   </select>
   <insert id="addUser" parameterType="java.util.List">
       insert into task1 values
      <foreach collection="list" item="item" separator="," index="index">
           (#{item.id},#{item.stu_name},#{item.number},#{item.qq},#{item.type},
            #{item.university},#{item.time},#{item.link},#{item.pledge},#{item.senior},
             #{item.locality},#{item.create_at},#{item.update_at})
      </foreach>
   </insert>
   <update id="updateUser" parameterType="User">
       update task1 set stu_name=#{stu_name},number=#{number},qq=#{qq},type=#{type},university=#{university},
       time=#{time},link=#{link},pledge=#{pledge},senior=#{senior},locality=#{locality},update_at=#{update_at} where id=#{id}
   </update>
   <delete id="deleteUser" parameterType="int">
       delete from task1 where id=#{id}
   </delete>
   <select id="getAllUser" resultType="User">
       select * from task1
   </select>
</mapper>

实体类User,就是各个字段名的映射属性,以及setter和getter,toString方法。

然后是最重要的Spring配置文件spring.xml

<context:property-placeholder location="config.properties" ignore-unresolvable="true"/>
<context:component-scan base-package="com.ycc.dao"/>
<!--<context:annotation-config />-->

<import resource="c3p0.xml"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="dataSource" ref="dataSource"/>
   <!--注册mybatis映射文件-->
   <property name="mapperLocations" value="classpath*:com/ycc/mapper/userMapper.xml"/>
   <property name="configLocation" value="classpath:sqlMapConfig.xml"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
   <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<!--注册接口类的bean,使得程序中可以用注解方式获取 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   <property name="basePackage" value="com.ycc.dao" />
</bean>

其中配置了c3p0连接池,以及加载了设置别名的配置文件sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC
       "-//mybatis.org//DTD Config 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <typeAliases>
       <typeAlias type="com.ycc.model.User" alias="User" />
   </typeAliases>
</configuration>

使用了log4j日志

log4j.rootLogger=info,console,dailyFile,rollingFile,logFile
###表示Logger不会在父Loggerappender里输出,默认为true
log4j.additivity.org.apache=true

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=INFO
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %m%n

log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
###日志是否追加,false:会生成日志文件把老的覆盖掉
log4j.appender.logFile.Append=true
log4j.appender.logFile.File=/usr/local/data/jnshu-home/task1_finally/logs/DEBUGlog.log
#log4j.appender.logFile.File=A:/HTML/LOGS/DEBUGlog.log
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %m%n

log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Encoding=UTF-8
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=/usr/local/data/jnshu-home/task1_finally/logs/DEBUGlog2.log
#log4j.appender.rollingFile.File=A:/HTML/LOGS/DEBUGlog2.log
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %m%n

log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Encoding=UTF-8
log4j.appender.dailyFile.Threshold=INFO
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=/usr/local/data/jnshu-home/task1_finally/logs/INFOlog.log
#log4j.appender.dailyFile.File=A:/HTML/LOGS/INFOlog.LOG
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %m%n


测试类

根据学员id返回

@Test
public void getUserById() throws Exception {
User user =userDao.getUserById(2);
   logger.info("用户:{}",user);
}

根据学员名字返回

@Test
public void getUserByName() throws Exception {
try {
User user = userDao.getUserByName("李四");
       logger.info("根据名字查找:{}",user);
   } catch (Exception e) {
e.printStackTrace();
   }
}



添加数据返回ID

@Test
public void addUser() throws Exception {
int retResult=0;
   User user = new User();
   try {
List<User> userList = new ArrayList<>();
       user.setId(3);
       user.setStu_name("李四");
       user.setNumber(123);
       user.setQq(323213);
       user.setType("后端");
       user.setUniversity("家里蹲大学");
       user.setLink("www.nihao.com");
       user.setPledge("无敌");
       user.setSenior("随便");
       user.setLocality("知乎");
       user.setCreate_at(System.currentTimeMillis());
       user.setUpdate_at(System.currentTimeMillis());
       userList.add(user);
       retResult=userDao.addUser(userList);
   } catch (Exception e) {
e.printStackTrace();
   }finally {
if (retResult ==1) {
logger.info("添加用户,ID为:{}", user.getId());
       } else {
logger.info("添加失败");
       }
}
}

更新数据返回TRUE/FALSE

 @Test
   public void updateUser() throws Exception {
int retResult=0;
       try {
User user = new User();
           user.setId(1);
           user.setStu_name("da");
           user.setNumber(123);
           user.setQq(323213);
           user.setType("后端");
           user.setUniversity("家里蹲大学");
           user.setTime(System.currentTimeMillis());
           user.setLink("www.nihao.com");
           user.setPledge("无敌");
           user.setSenior("随便");
           user.setLocality("知乎");
           user.setUpdate_at(System.currentTimeMillis());
           retResult=userDao.updateUser(user);
//        assertTrue("更新数据{}",ret==1);
       } catch (Exception e) {
e.printStackTrace();
       } finally {
if (retResult == 1) {
logger.info("更新数据:{}", true);
           } else {
logger.info("更新数据:{}",false);
           }}}


删除数据返回true/false

@Test
public void deleteUser() throws Exception {
int retResult=0;
   try {
retResult=userDao.deleteUser(2);
   } catch (Exception e) {
e.printStackTrace();
   } finally {
if (retResult == 1) {
logger.info("删除数据:{}", true);
       } else {
logger.info("删除数据:{}",false);
       }}


获取所有学员

@Test
public void getAllUser() throws Exception {
try {
List<User> userList=userDao.getAllUser();
       for (User user : userList) {
logger.info("所有用户:{}",user);
       }
} catch (Exception e) {
e.printStackTrace();
   }
}

2,注解方式

项目结构可以看到,仅仅是去掉了userMapper.xml配置文件,变成了userMapper映射接口

@Component
public interface UserMapperI {
@Insert("insert into task1 values\n" +
"            (#{id},#{stu_name},#{number},#{qq},#{type},\n" +
"            #{university},#{time},#{link},#{pledge},#{senior},\n" +
"            #{locality},#{create_at},#{update_at})")
int addUser(List<User> userList);

   @Delete("delete from task1 where id=#{id}")
int deleteUser(int id);

   @Update("update task1 stu_name=#{stu_name},number=#{number},qq=#{qq},type=#{type},university=#{university},\n" +
"        time=#{time},link=#{link},pledge=#{pledge},senior=#{senior},locality=#{locality},update_at=#{update_at}  where id=#{id}")
int updateUser(User user);

   @Select("select * from task1 where id=#{id}")
User getUserById(int id);

   @Select("select * from task1 where stu_name=#{stu_name}")
User getUserByName(String stu_name);

   @Select("select * from task1 where number=#{number}")
User getUserByNumber(int number);

   @Select("select * from task1")
List<User> getAllUser();
}

spring配置文件

<context:property-placeholder location="config.properties" ignore-unresolvable="true"/>
<context:component-scan base-package="com.ycc.mapper"/>

<import resource="c3p0.xml"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
   <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   <property name="basePackage" value="com.ycc.mapper" />
</bean>



明天计划的事情:

提交任务,学习任务二


遇到的问题:

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

之前没有理解MapperScannerConfigurer这个类,

网上的说法是MapperScannerConfigurer是spring和mybatis整合的mybatis-spring jar包中提供的一个类。

想要了解该类的作用,就得先了解MapperFactoryBean。

MapperFactoryBean的出现为了代替手工使用SqlSessionDaoSupport或SqlSessionTemplate编写数据访问对象(DAO)的代码,使用动态代理实现。

当发现要使用多个MapperFactoryBean的时候,一个一个定义肯定非常麻烦,于是mybatis-spring提供了MapperScannerConfigurer这个类,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。

然而 ,我还是没看的懂。。。


收获:

学习了spring+mybatis


进度:

任务一30

任务开始时间:3.10

预计demo时间:3.23

是否延期:否

禅道地址:http://task.ptteng.com/zentao/project-task-562.html



返回列表 返回列表
评论

    分享到