发表于: 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不会在父Logger的appender里输出,默认为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
评论