ssm框架学习---mybatis学习文件结构和代码示例

12 篇文章 0 订阅

准备工作: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();
		}
		
	}

}










  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值