使用maven构建好工程。写好实体类。写好配置文件。创建好数据库表。简单插入两条数据。这里不会介绍mybatis的环境搭建。
先看数据表:
CREATE TABLE `article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`content` text COLLATE utf8_bin,
`author` int(11) DEFAULT NULL,
`is_modify` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (author) REFERENCES author (id)
)
CREATE TABLE `author` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8_bin NOT NULL,
`nickname` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
)
用author这个外键关联,存储了文章对应的authorId。
我们看一下实体类:(目前只有2个,article and author)
@Data public class Article { private int id; private String title; private String content; private Author author; private boolean isModify; //对应的数据库类型是tinyint,0代表false,1代表true }
@Data public class Author { private int id; private String username; private String nickname; }
这里提一下我用到了一款插件lombok,具体的请百度。加上@data注解他自动会为你的实体类生成get,set,toString等方法。当然还有很多其他用法。
另外为了方便的测试,写了一个生产sqlsession的工具类:
public class Util { private static SqlSession sqlSession = init(); public static Object getSession(Class clazz) { return sqlSession.getMapper(clazz); } //读取配置文件 private static SqlSession init(){ Reader reader = null; try { reader = Resources.getResourceAsReader("conf.xml"); } catch (IOException e) { e.printStackTrace(); } SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); return sessionFactory.openSession(true); } public static void close() { sqlSession.close(); } }
这样测试类写起来就可以非常简洁了:
public class MybatisTest { public static ArticleMapper articleMapper; @Before public void before() { articleMapper = (ArticleMapper) Util.getSession(ArticleMapper.class); } @After public void after() { Util.close(); } @Test public void baseTest() { articleMapper.{code....} } }
写好对应的ArticleMapper接口类。
好了,进入正题。先看单表查询:
例如:我想查到数据库所有的文章的信息:
@Select(value = "select article.id,article.title,article.author,article.content,article.is_modify as isModify from article") public List<Article> articles();
这里可以注意到:article.is_modify as isModify,为什么要这样呢?这是为了解决数据库字段名和实体类不一致而采取的措施,不然是不能正确映射的。
当然还有一种解决办法,那就是在配置文件里解决了,利用resultMap的映射。这个后面会提到。
例如:我想查到文章数量:
@Select(value = "select count(1) from article") public int countOfArticle();
这里这个返回值类型,你换成String,List<String>都行,甚至你换成List<Author>都不会报错,只是count填充不进去,输出为null。
单表查询其实没什么好说的。。。
接下来看联表查询吧,首先我想要记一下:mysql的联表查询,介绍一下我觉得用的最多的2种:inner join,left join。
妈的不想写了,未完待续......