发表于: 2020-05-02 23:18:31
1 1420
今天完成的事情:
1.分别使用Mybatis的配置文件和Annotation方式去配置数据库
这个任务我真的想了好久,用注解的方式写 DAO 语句我搜资料的时候见到过,但是怎么用注解的方式来插入 db.properties 的信息我是真的没见过,昨天到今天我都在搜索这个问题。
刚刚去一篇篇翻师兄的日报,我发现这这个步骤说的应该就是用注解的方式写 Dao,省略 mapper 映射文件。
项目文件结构:
DiscipleDao.java
package cn.mogeek.dao;
import cn.mogeek.domain.Disciple;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
public interface DiscipleDao {
@Select("select * from registery_info where id = #{id}")
List<Disciple> query(Disciple disciple);
@Insert("INSERT INTO registery_info (qq_num, student_id, student_name, major_subject, graduated_school,\n" +
" brother, come_from, daily_report, slogan, create_time)\n" +
" VALUES (#{qq_num}, #{student_id}, #{student_name}, #{major_subject}, #{graduated_school},\n" +
" #{brother}, #{come_from}, #{daily_report}, #{slogan}, now())")
int insert(Disciple disciple);
@Update("update registery_info set qq_num = #{qq_num}, student_id = #{student_id}, student_name = #{student_name}, " +
"major_subject = #{major_subject}, graduated_school = #{graduated_school}, brother = #{brother}, " +
"come_from = #{come_from}, daily_report = #{daily_report}, slogan = #{slogan} where id = #{id}")
int update(Disciple disciple);
@Delete("delete from registery_info where id = #{id}")
int delete(int id);
}
mybatis 配置文件:
mybatis-config.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>
<properties resource="db.properties"/>
<environments default="mysql_developer">
<environment id="mysql_developer">
<!--<!– mybatis使用jdbc事务管理方式 –>-->
<transactionManager type="jdbc"/>
<!--<!– mybatis使用连接池方式来获取连接 –>-->
<dataSource type="pooled">
<!--<!– 配置与数据库交互的4个必要属性 –>-->
<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>
</configuration>
测试类:
testDao.java
package cn.mogeek.dao;
import cn.mogeek.domain.Disciple;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Test;
import sun.security.util.DisabledAlgorithmConstraints;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.List;
public class testDao {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
sqlSessionFactory.getConfiguration().addMapper(DiscipleDao.class);
}catch (IOException e){
e.printStackTrace();
}
}
@Test
public void testInsert(){
SqlSession sqlSession = sqlSessionFactory.openSession();
Disciple disciple = new Disciple();
disciple.setMajor_subject("无限奥义循环");
disciple.setCome_from("英国");
disciple.setDaily_report("https://baike.baidu.com/item/%E5%A5%87%E5%BC%82%E5%8D%9A%E5%A3%AB/2492942");
disciple.setBrother("古一法师");
disciple.setSlogan("多玛姆,我是来找你谈判的!");
disciple.setGraduated_school("格林威治村");
Disciple temp = null;
try {
temp = (Disciple)disciple.clone();
}catch (CloneNotSupportedException e){
System.out.println(e);
return;
}
try {
DiscipleDao discipleDao = sqlSession.getMapper(DiscipleDao.class);
long num, ass;
for (int i = 1; i <= 10; i ++){
num = System.currentTimeMillis();
temp.setQq_num((int)(num % 100000));
temp.setStudent_id((int)(num % 10000));
temp.setStudent_name("奇异博士-NO:" + i);
ass = discipleDao.insert(temp);
Assert.assertTrue(ass != -1);
}
}finally {
sqlSession.commit();
sqlSession.close();
}
}
public List<Disciple> testQuery(int id){
SqlSession sqlSession = sqlSessionFactory.openSession();
DiscipleDao discipleDao = sqlSession.getMapper(DiscipleDao.class);
List<Disciple> discipleList = discipleDao.query(id);
for (Disciple d :
discipleList) {
System.out.println(d);
}
System.out.println("Count: " + discipleList.size());
return discipleList;
}
@Test
public void testUpdate(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DiscipleDao discipleDao = sqlSession.getMapper(DiscipleDao.class);
int id = 30000493;
Disciple disciple = testQuery(id).get(0);
disciple.setStudent_name("testUpdate");
discipleDao.update(disciple);
sqlSession.commit();
Assert.assertEquals(testQuery(id).get(0).getStudent_name(), disciple.getStudent_name());
sqlSession.close();
}
@Test
public void testDelete(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DiscipleDao discipleDao = sqlSession.getMapper(DiscipleDao.class);
int id = 30000496;
discipleDao.delete(id);
sqlSession.commit();
Assert.assertTrue(testQuery(id).size() == 0);
sqlSession.close();
}
}
测试结果:
增
更,查
删(之前已经测试删过了,这里只是是截个图表明测试成功,所以下面的 total 为零)
明天的计划:
开始深度思考,提交任务一。
遇到的问题:
1.一开始插入失败,发现之前定义数据库学号是 unique 索引,可能是学号与数据库里面的重复了,清空数据库之后插入测试成功
收获:
1.用注解的方式写 dao,这样不用再写一个实现,也不用再写一个 mapper 映射文件,缺点是这种方式不够灵活,sql 非常死板。
评论