最近辞职在家,找工做不是很顺利,就顺便看看技术吧,对hibernate用的较多,mybatis用的少,可是最近彷佛mybatis更流行一下,今天抽空看了一下,其实就是找官方的文档,大牛的博客看看,而后本身组装一下,而后作个笔记。html
mybatis是一个SQL map框架,简单来讲,就是把SQL结果映射为Java对象,这点对于喜欢SQL,注意性能的朋友来讲,比较喜欢,学习曲线平坦。Hibernate相对来讲要难一些,几乎就至关于实现了一个数据库,对数据库的方方面面以及缓存、加载方面都作了封装,直接将表的行和Java作了对应,操做起来很方便,并且也提供了不少默认方法,并且Spring还提供了Respository模式的方法,操做简单的GUID很是方便,代码不多,就可使用了。固然,若是复杂的操做,Hibernate用起来反而不方便,须要写HQL或者SQL,SQL代码仍是分布在代码之中,失去了面向对象的便利以及代码的美感。可能基于这个缘由,mybatis流行起来,程序员能够获得彻底操纵的知足感,这点很重要。顺便说一句,工做流引擎JBPM和Activiti其实是同源的,只是在JBpm4以后,产生了分歧,创始人认为开发人员的便利性最重要,但团队不一样意,创始人只好另起炉灶,开发了Activiti,我的认为,程序员以为不方便,可是性能很高或者说学术水平很高的东西,其实很难流行,除非有一个方便的封装。java
一、环境mysql
Windows 10程序员
JDK 1.8.101web
NetBeans 8.2spring
STS 4.6sql
Mysql 5.6,数据库名为study数据库
二、应用程序模式(main()执行)apache
1)建表SQL 缓存
1 CREATE TABLE `info_user` ( 2 `id` INT(11) NOT NULL AUTO_INCREMENT, 3 `user_name` VARCHAR(50) NULL DEFAULT NULL, 4 `password` VARCHAR(50) NULL DEFAULT NULL, 5 `comment` VARCHAR(500) NULL DEFAULT NULL, 6 PRIMARY KEY (`id`), 7 UNIQUE INDEX `user_name` (`user_name`) 8 ) 9 ;
2)mybatis的配置文件和Hibernate差很少,都是一个主配置文件,关联着若干mapper文件,文件以下
mybatis-config.xml (位于目录com/shiyq/mybatis/)
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/study?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/shiyq/mybatis/mapper/UserDaoMapper.xml"/>
</mappers>
</configuration>
UserDaoMapper.xml (位于目录com/shiyq/mybatis/mapper/)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shiyq.mybatis.config.UserDao">
<select id="countAll" resultType="int">
select count(*) c from info_user;
</select>
<select id="selectAll" resultType="com.shiyq.mybatis.config.User">
select * from info_user order by user_name asc
</select>
<insert id="insert" parameterType="com.shiyq.mybatis.config.User">
insert into info_user(user_name,password,comment) values(#{user_name},#{password},#{comment})
</insert>
<update id="update" parameterType="com.shiyq.mybatis.config.User">
update info_user set user_name=#{user_name},password=#{password},comment=#{comment} where user_name=#{user_name}
</update>
<delete id="delete" parameterType="String">
delete from info_user where user_name=#{user_name}
</delete>
<select id="findByUserName" parameterType="String" resultType="com.shiyq.mybatis.config.User">
select * from info_user where user_name=#{user_name}
</select>
</mapper>
能够看出mybatis-config.xml记录了数据库链接方式,以及mapper文件的列表。
mapper文件也很是简单,须要注意几个关键的地方:
另外须要注意,在netbeans中,这两个配置文件要放在target/classes下面,由于默认状况下src下面的文件不会拷贝到classes下,因此会出现找不到配置文件的错误。
3)Java代码
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.shiyq.mybatis.config;
/**
*
* @author shiyq
*/
public class User {
private int id;
private String user_name;
private String password;
private String comment;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */
package com.shiyq.mybatis.config; import java.util.List; /** * * @author shiyq */
public interface UserDao { public int insert(User user); public int update(User user); public int delete(String user_name); public List<User> selectAll(); public int countAll(); public User findByUserName(String user_name); }
能够看出User是做为返回类型,而UserDao是mapper文件对应的接口文件,能够看出其返回值、参数类型、方法名称是一致的。
4)运行
到此,基本的配置就完成了,咱们能够进行增删改查了,咱们写个测试类,看一下
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */
package com.shiyq.mybatis; import com.shiyq.mybatis.config.User; import com.shiyq.mybatis.config.UserDao; import java.io.Reader; import java.util.Iterator; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * * @author shiyq */
public class MybatisMain { public static void main(String args[])throws Exception { String user_name = "shiyq"+String.valueOf(Math.random()*100000).substring(0,3); String resource = "com/shiyq/mybatis/mybatis-config.xml"; Reader reader = Resources.getResourceAsReader(resource); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(reader); try (SqlSession session = factory.openSession()) { UserDao userDao = session.getMapper(UserDao.class); User user = new User(); user.setUser_name(user_name); user.setPassword("stone123"); user.setComment("备注"); userDao.insert(user); System.out.println("记录条数:"+userDao.countAll()); List<User> users = userDao.selectAll(); Iterator<User> iter = users.iterator(); while(iter.hasNext()){ User u = iter.next(); System.out.println("用户名:"+u.getUser_name()+", 密码:"+u.getPassword()); } user.setComment("comment"); userDao.update(user); //User u = userDao.findByUserName(user_name);
User u = session.selectOne("com.shiyq.mybatis.config.UserDao.findByUserName",user_name); System.out.println("comment is "+u.getComment()); //userDao.delete(user_name);
System.out.println("记录条数:"+userDao.countAll()); session.commit(); } } }
运行结果以下:
记录条数:1
用户名:shiyq509, 密码:stone123
comment is comment
记录条数:1
三、SpringBoot集成mybatis
SpringBoot是相对较新的Spring开发方式,大大减小了配置文件,在开发和部署上的便利性都有很大的提高。
采用STS做为开发工具,File->New->Spring Starter Project,以下图
后面是要预先导入的包,选择SQL下的Mysql、JDBC、MyBatis,而后肯定,生成项目便可。
若是已经有Spring Boot项目,能够在pom.xml增长以下内容
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
spring boot的配置文件是src/main/resources/application.properties,个人配置文件以下
server.port=8080
server.context-path=/study
#log
logging.file=park/log.log
logging.level.org.cqgy=DEBUG
#jdbc
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/study?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
spring.datasource.validation-query=SELECT 1
spring.datasource.test-on-borrow=false
spring.datasource.test-while-idle=true
spring.datasource.time-between-eviction-runs-millis=18800
spring.datasource.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=0)
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=false
spring.jackson.serialization.indent-output=true
server.error.whitelabel.enabled=true
mybatis.config-location=classpath:mybatis/mybatis-config.xml
默认状况下,只须要配置黑体字的部分便可,须要注意的是在web程序的状况下,须要在路径上增长"classpath:",不然还会出现找不到配置文件的现象。
Spring boot状况下,mybatis会使用默认的datasource,自动建立SqlSessionFactory,SqlSession,自动装载Mapper的Java类。
这里仍是使用上面的文件,只不过位置有变化,以下
mybatis-config.xml | src/main/resources/mybatis |
UserDaoMapper.xml | src/main/resources/mybatis/mapper |
User.java | src/main/java/com/shiyq/mybatis/domain |
UserDao.java | src/main/java/com/shiyq/mybatis/dao |
mybatis-config.xml中的映射部分修改以下
<mappers>
<mapper resource="mybatis/mapper/UserDaoMapper.xml"/>
</mappers>
而后写一个Controller做为测试
package com.shiyq.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.shiyq.mybatis.dao.UserDao;
import com.shiyq.mybatis.domain.User;
@Controller
public class UserList {
@Autowired
UserDao userDao;
@RequestMapping("/user/list")
public String userList(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter pt = response.getWriter();
User user1 = new User();
String user_name = "shiyq"+String.valueOf(Math.random()*100000).substring(0,3);
user1.setUser_name(user_name);
user1.setPassword("密码");
user1.setComment("注释,"+user_name);
userDao.insert(user1);
List<User> users = userDao.selectAll();
int i = 0;
pt.println("<pre>");
int count = this.userDao.countAll();
pt.println(count);
for (User user : users) {
System.out.println("用户名:" + user.getUser_name() + ", 密码:" + user.getPassword());
pt.print(++i+", ");
pt.println("用户名:" + user.getUser_name() + ", 密码:" + user.getPassword()+", 注释:"+user.getComment());
}
pt.println("</pre>");
return null;
}
}
运行http://localhost:8080/study/user/list,结果以下
1
1, 用户名:shiyq204, 密码:密码, 注释:注释,shiyq204