准备工作:mybatis的jar包,数据库的驱动包,日志log4j和单元测试的包
开发模式:(1)基于原始dao开发,需要编写dao接口和dao接口的实现类
(2)基于mapper开发,只需编写dao接口,但是需要遵守一定规范(映射文件的命名空间为dao接口全限定名,接口中的方法,参数类型和返回类型和映射文件中statement语句输入参数和输出参数相对应,注意返回结果为集合比较特殊)
框架的结构:(1)SqlMapConfig.xml(Mybatis的全局配置文件,配置数据源、事务、缓存等mybatis运行环境),配置映射文件UserMapper.xml,xxxMapper.xml
(2)SqlSessionFactory(会话工厂)用来创建SqlSession
(3)SqlSession (会话)操作数据库(curd)操作
(4)Executor(执行器)Sqlsession内部通过执行器来操作数据库
(5)mapped statement(底层封装对象) 对操作数据库存储封装,包括sql语句,输入参数、输出结果类型
工程结构如下:
两种方式我都写了,所以这里会有连个xml映射文件,并且会有dao和mapper的包,实际开发选择其中一种(推荐mapper)
首先这里给出db.properties和log4j.properties这两个文件
db.properties
jdbc.driver =com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=admin
log4j.properties
# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
这里需要注意一下,在我们开发过程,要使用debug模式
sqlmapconfig.xml主要放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>
<!-- 加载数据库的配置文件 -->
<properties resource="db.properties">
<!-- 这中间还可以配置一些其他的属性,加载时先加载然后再加载外部的配置 -->
</properties>
<!-- 配置数据库环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<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>
<mapper resource="sqlmap/User.xml"/>
<mapper resource="sqlmap/UserMapper.xml"/>
<!-- 使用批量导入的方式,需要注意使用mapper代理,并且xml文件和mapper接口放在同一目录中-->
</mappers>
</configuration>
接下来是映射文件,user.xml和usermapper.xml两者的区别仅仅在于命名空间的不同
user.xml
<?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代理方式很重要 -->
<mapper namespace="test">
<select id="selectUserById" parameterType="int" resultType="com.zcj.po.User">
select * from userinfo where id=#{id}
</select>
</mapper>
usermapper.xml
<?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代理方式很重要 -->
<mapper namespace="com.zcj.mapper.UserMapper">
<select id="selectUserById" parameterType="int" resultType="com.zcj.po.User">
select * from userinfo where id=#{id}
</select>
</mapper>
接下来就是dao实现方式
UserDao.java
package com.zcj.dao;
import com.zcj.po.User;
public interface UserDao {
public User selectUserById(int id);
}
UserDaoImpl.java
package com.zcj.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.zcj.po.User;
public class UserDaoImp implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImp(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory=sqlSessionFactory;
}
public User selectUserById(int id) {
// TODO Auto-generated method stub
SqlSession sqlSession= sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.selectUserById",id);
return user;
}
}
第二种方式,使用mapper,方法的编写就要受到一定的限制
UserMapper.java
package com.zcj.mapper;
import com.zcj.po.User;
public interface UserMapper {
public User selectUserById(int id);
}
到这一步就编写完了,下面是单元测试,都需要首先得到SqlsessionFactory
mapper方式的测试:
package com.zcj.mapper;
import java.io.InputStream;
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.Before;
import org.junit.Test;
import com.zcj.po.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
String resource ="mybatis/SqlMapConfig.xml";
InputStream inputStream =Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testSelectUserById() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user=userMapper.selectUserById(1);
System.out.println(user);
}
}
dao方式的测试类似,只需要把sessionFactory传给dao的构造方法的参数就可以获取sqlsession了
package com.zcj.dao;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.zcj.po.User;
public class UserDaoImpTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
String resource ="mybatis/SqlMapConfig.xml";
InputStream inputStream =Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testSelectUserById() {
UserDaoImp userDaoImp = new UserDaoImp(sqlSessionFactory);
User user=userDaoImp.selectUserById(1);
System.out.println(user);
}
}
最后加上user的pojo
User.java
package com.zcj.po;
public class User {
private int id;
private String username;
private String password;
private String sex;
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [id=" + id + ", password=" + password + ", sex=" + sex
+ ", username=" + username + "]";
}
}
学习到这里,mybatis的单独使用就大致了解了,下面介绍mybatis generator,它是依据数据表自动生成pojo,mapper,和映射文件
首先需要准备jar包,然后编写一个配置文件generator.xml,这里使用一个方法执行它对应文件如下:
generator.xml
<?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>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root"
password="admin">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.zcj.ssm.po"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.zcj.ssm.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.zcj.ssm.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table tableName="userinfo" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
<!-- <table schema="" tableName="sys_user"></table>
<table schema="" tableName="sys_role"></table>
<table schema="" tableName="sys_permission"></table>
<table schema="" tableName="sys_user_role"></table>
<table schema="" tableName="sys_role_permission"></table> -->
<!-- 有些表的字段需要指定java类型
<table schema="" tableName="">
<columnOverride column="" javaType="" />
</table> -->
</context>
</generatorConfiguration>
对应的执行文件:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
public class GeneratorSqlmap {
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//
File configFile = new File("generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
public static void main(String[] args) throws Exception {
try {
GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}