目录
mybatis环境搭建
mybatis的CRUD操作
mybatis反向工程
一.mybatis环境搭建
所需jar包:mybatis-3.2.2.jar和mysql-connection-java-5.1.29.jar
1.建立项目所需的数据库:
DROP DATABASE IF EXISTE `mybatis`;
CREATE DATABASE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(40) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.建立项目并导入jar包:项目除了mybatis没有用其它框架,用原生的servlet来写吧。
3.配置mybatis.cfg.xml
3.1这里先配置mysql.properties,将和数据连接有关的数据放进去,增加代码重用性。
3.2mybatis.cfg.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="mysql.properties"></properties>
<!-- 配置mybatis运行环境 -->
<environments default="cybatis">
<environment id="cybatis">
<!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
<transactionManager type="JDBC" />
<!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- UNPOOLED 表示不支持数据源连接池 -->
<!-- JNDI 表示支持外部数据源连接池 -->
<dataSource type="POOLED">
<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>
<mappers>
<!-- 告知映射文件方式1,一个一个的配置
<mapper resource="com/cy/mybatis/mapper/UserMapper.xml"/>-->
<!-- 告知映射文件方式2,自动扫描包内的Mapper接口与配置文件 -->
<package name="com/xxx/mapper"/>
</mappers>
</configuration>
4.配置DBTool工具类:用来加载配置文件,得到sessionFactory,开启session
package com.xxx.tool;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class DBTool {
public static SqlSessionFactory sessionFactory;
static{
try {
//使用MyBatis提供的Resources类加载mybatis的配置文件
Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
//构建sqlSession的工厂
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
//创建能执行映射文件中sql的sqlSession
public static SqlSession getSession(){
return sessionFactory.openSession();
}
}
二.mybatis的CRUD
完成了上面的配置,其实mybatis环境已经搭建好了,接下是使用的方法,也就是增删改查。(我就只介绍insert吧,其它只是sql语句不一样)
1.编写UserDTO.java,UserDTO是对数据的封装。它实现Serializable接口,且要重写toString方法,字段最好与数据库表中字段保持一致
Serializable表示这个类可以被序列化,告诉JVM这个类可以进行持久化操作
重写toString为了更好的输出到控制台方便调试,具体参考《阿里巴巴Java开发手册》
package com.xxx.bean;
import java.io.Serializable;
public class UserDTO implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private String username;
private String password;
@Override
public String toString() {
return "id = " +id+ " username = " + username + " password = " + password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2.然后在UserMapper中写出具体的方法名和sql语句。
这里的方法不需要我们来写,所以写成了接口。
sql语句可以写到xml配置文件中,或者直接用注解写在方法上面。
写到xml配置文件中可控性更好,功能更强大一些,反向工程生成的也是配置文件,但是繁琐,网上的教程很多。
这里我用简洁很多的注解方式。
package com.xxx.mapper;
import org.apache.ibatis.annotations.Insert;
import com.xxx.bean.UserDTO;
public interface UserMapper {
/**
* 新增用户
* @param user
* @return
* @throws Exception
*/
@Insert("Insert into user (username,password) values(#{username},#{password})")
int saveUser(UserDTO user) throws Exception;
}
这里是单参的形式,多参数要加点其它注解。例如
/**
* 根据旧密码更新 密码
* @param user
* @return
* @throws Exception
*/
@Update("update user set password=#{pwd} where username=#{user.username} and password=#{user.password}")
//在方法的参数前添加@Param('参数名')
boolean updateUserPwd(@Param("pwd")String pwd,@Param("user")UserDTO user) throws Exception;
3.在SaveUserServlet中调用UserMapper中的方法。
package com.xxx.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import com.xxx.bean.UserDTO;
import com.xxx.mapper.UserMapper;
import com.xxx.tool.DBTool;
public class SaveUserServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取jsp中提交的参数
String username=req.getParameter("username");
String password=req.getParameter("password");
//封装数据
UserDTO user = new UserDTO();
user.setUsername(username);
user.setPassword(password);
//从DBTool工具类中获取session
SqlSession session = DBTool.getSession();
//通过session的getMapper方法实例化UserMapper接口
UserMapper mapper = session.getMapper(UserMapper.class);
//调用saveUser方法,将user持久化
try {
boolean result = mapper.saveUser(user);
//手动提交事务
session.commit();
//如果持久化成功,返回user类到jsp中显示出来
if (result){
req.setAttribute("info",user);
}else {
req.setAttribute("info","持久化失败");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
//回滚
session.rollback();
}
//session不是线程安全的,使用完后要关闭
session.close();
//跳转到index.jsp
req.getRequestDispatcher("/index.jsp").forward(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req,resp);
}
}
然后配置web.xml(前面忘记了…)
<servlet>
<servlet-name>save</servlet-name>
<servlet-class>com.xxx.servlet.SaveUserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>save</servlet-name>
<url-pattern>/saveUser</url-pattern>
</servlet-mapping>
4.register.jsp中的注册表单和index.jsp中显示返回的info
<!-- register.jsp -->
<body>
<form action="saveUser" method="post">
UserName:<input type="text" name="username"><br/>
PassWord:<input type="password" name="password"><br/>
<input type="submit" value="注册">
</form>
</body>
<!-- index.jsp -->
<body>
${requestScope.info}
</body>
5.测试一下
输入用户名和密码
跳转成功
果然数据库里也有了
其它的操作就是改改sql语句和方法名,就不多写了。
三.mybatis的反向工程
反向工程工具包:https://pan.baidu.com/s/1slRM4yh
mybatis有很多方法,我这里用的是generator工具
generator使用很简单,只需要修改配置文件之后用cmd运行一行代码就可以了。这些在百度云的工具包中都有。
1.修改配置文件,使generator能找到需要自动生成的数据库表和存放位置。
这些在配置文件的注解中有很详细的说明。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 数据库驱动包位置 --><!-- 需修改 -->
<classPathEntry location="C:\Users\Administrator\Desktop\Word\Tool\generator\mysql-connector-java-5.1.22-bin.jar" />
<!-- <classPathEntry location="C:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar" /> -->
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 数据库链接URL、用户名、密码 --><!-- 需修改 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3308/mybatis" userId="root" password="123456">
<!--<jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@localhost:1521:orcl" userId="msa" password="msa">-->
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成模型的包名和位置 --><!-- 需修改 -->
<javaModelGenerator targetPackage="cwj.bean" targetProject="C:\Users\Administrator\Desktop\Word\Tool\generator\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成的映射文件包名和位置 --><!-- 需修改 -->
<sqlMapGenerator targetPackage="cwj.mapper" targetProject="C:\Users\Administrator\Desktop\Word\Tool\generator\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成DAO的包名和位置 --><!-- 需修改 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="cwj.dao" targetProject="C:\Users\Administrator\Desktop\Word\Tool\generator\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 要生成那些表(更改tableName和domainObjectName就可以) -->
<!-- <table tableName="tbug" domainObjectName="Bug" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />-->
<!-- <table tableName="tmenu" domainObjectName="Menu" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />-->
<!-- <table tableName="tonline" domainObjectName="Online" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />-->
<!-- 需修改 -->
<table tableName="user" domainObjectName="UserDTO" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
</context>
</generatorConfiguration>
2.然后再cmd中找到generator的位置
运行生成语句中的代码
generator就会帮你自动生成文件在你选择的目录中
最后复制到你的工程中就行了。