您的位置:首页 > 其它

ssm框架学习01--mybatis学习

2016-05-14 17:45 405 查看
准备工作:mybatis的jar包,数据库的驱动包,日志log4j和单元测试的包

开发模式:(1)基于原始dao开发,需要编写dao接口和dao接口的实现类

(2)基于mapper开发,只需编写dao接口,但是需要遵守一定规范(映射文件的命名空间为dao接口全限定名,接口中的方法,参数类型和返回类型和映射文件中statement语句输入参数和输出参数相对应,注意返回结果为集合比较特殊)

工程结构如下:



两种方式我都写了,所以这里会有连个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();
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: