Mybatis是持久层框架类似于Hibernate的orm持久层框架
频繁创建和打开、关闭数据链接,太消耗资源
Sql语句存在硬编码,不利于维护
Sql参数设置硬编码,不利于维护
结果集获取与遍历复杂,存在硬编码,不利于维护,期望查询后返回一个java对象
前身是apache下的开源项目,2010有aspache software foundation 迁移到了google code ,并且改名为Mybatis,2013年迁移到github。
工程搭建
导入jar包
配置SqlMapConfig.xml
配置log4j.properties
配置sql查询的映射文件
加载映射文件
完成需求
步骤
编写sql语句
配置user映射文件
编写测试程序
需求
根据用户ID查询用户信息
根据用户名模糊查询用户信息
插入用户(主键返回,UUID使用)
修改删除用户
SqlMapConfig.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="log4j.properties">
<!--properties中还可以配置一些属性名和属性值 -->
<!-- <property name="jdbc.driver" value=""/> -->
</properties>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis-->
<transactionManager type="JDBC" />
<!-- 数据库连接池,由mybatis管理-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/pojo?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true" />
<property name="username" value="root" />
<property name="password" value="manager" />
</dataSource>
</environment>
</environments>
<!-- 加载 映射文件 -->
<mappers>
<mapper resource="mybatis/user.xml"/>
</mappers>
</configuration>
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">
<!-- namespqce:命名空间,用于隔离sql语句
#{}是占位符相当于jdbc的?
${}是字符串拼接指令,如果入参为普通数据类型括号内部只写value
-->
<mapper namespace="user">
<!-- id: sql id的唯一标识
parameterType:入参的数据类型
resultType:返回结果的数据类型
-->
<select id="getUserById" parameterType="int" resultType="com.yhr.mybatis.User">
SELECT ID,username,sex,address FROM usertable WHERE id= #{id2}
</select>
<!--returnType:如果返回结果为集合,只需设置为每一个的数据类型 -->
<select id="getUserByUserName" parameterType="string" resultType="com.yhr.mybatis.User">
SELECT ID,username,sex,address FROM usertable WHERE username like ‘%${value}%‘
</select>
<!--插入用户 -->
<!-- useGeneratedKeys="true" 使用自增 keyProperty="id" 与之前的配套使用 这里只User的主键id -->
<insert id="insertUser" parameterType="com.yhr.mybatis.User" useGeneratedKeys="true" keyProperty="id">
<!-- selectKey:主键返回
keyProperty:user中的主键类型
resultType:主键数据类型
order:指定selectKey何时执行:AFTER|BEFORE
可以改变为useGeneratedKeys="true" keyProperty="id"
-->
<!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
select last_insert_id()
</selectKey> -->
insert into usertable(username,sex,address) values(#{username},#{sex},#{address});
</insert>
<!-- -->
<insert id="insertUserUUID">
<selectKey keyProperty="uuid2" resultType="string" order="BEFORE">
select UUID()
</selectKey>
insert into usertable(username,sex,address,uuid2) values(#{username},#{sex},#{address},#{uuid2});
</insert>
<update id="updateUser" parameterType="com.yhr.mybatis.User" >
update usertable set username=#{username} where id=#{id};
</update>
<delete id="deleteUser" parameterType="com.yhr.mybatis.User">
delete from usertable where id=#{id}
</delete>
</mapper>
MybatisTest.java
package com.yhr.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
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;
import org.junit.jupiter.api.Test;
import com.yhr.mybatis.User;
public class MybaitsTest {
//@Test
public void testGetUserById() throws IOException {
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfd=new SqlSessionFactoryBuilder();
//创建核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = ssfd.build(inputStream);
//创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询
User user = sqlSession.selectOne("user.getUserById",1);
System.out.println(user);
sqlSession.close();
}
//@Test
public void testGetUserByUserName() throws IOException {
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfd=new SqlSessionFactoryBuilder();
//创建核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = ssfd.build(inputStream);
//创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询
List<User> list = sqlSession.selectList("user.getUserByUserName","张" );
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
//@Test
public void testInsertUser() throws IOException {
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfd=new SqlSessionFactoryBuilder();
//创建核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = ssfd.build(inputStream);
//创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询
User user =new User();
user.setUsername("ll");
user.setSex("男");
user.setAddress("北京");
sqlSession.insert("user.insertUser", user);
System.out.println(user);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
//@Test
public void testInsertUserUUID() throws IOException {
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfd=new SqlSessionFactoryBuilder();
//创建核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = ssfd.build(inputStream);
//创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询
User user =new User();
user.setUsername("ll");
user.setSex("男");
user.setAddress("北京");
sqlSession.insert("user.insertUserUUID", user);
System.out.println(user);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
//@Test
public void testUpdateUser() throws IOException {
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfd=new SqlSessionFactoryBuilder();
//创建核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = ssfd.build(inputStream);
//创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询
User user =new User();
user.setId(0);
user.setUsername("adada");
sqlSession.update("user.updateUser", user);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
@Test
public void testDeleteUser() throws IOException {
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfd=new SqlSessionFactoryBuilder();
//创建核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过输入流创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = ssfd.build(inputStream);
//创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询
User user =new User();
user.setId(7);
sqlSession.delete("user.deleteUser", user);
System.out.println(user);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
}
Mybatis架构图
Dao需求
根据用户ID查询用户信息
根据用户名查找用户列表
添加用户
SqlSession的使用范围
SqlSession中封装了对数据库的操作如增删改查
SqlSession由SqlSessionFactory进行创建
SqlSessionFactory由SqlSessionFactoryBuilder进行创建
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder用于创建SqlSessionFactory,一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是由SqlSessionFactory创建的。所以可以将SqlSessionFactoryBuilder当作一个工具类使用,最佳的使用范围是方法范围即方法体内局部变量
SqlSessionFactory
SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳适用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory
SqlSession
在 MyBatis 中,你可以使用
SqlSessionFactory
来创建SqlSession
。一旦你获得一个 session 之后,你可以使用它来执行映射了的语句,提交或回滚连接,最后,当不再需要它的时候,你可以关闭 session。使用 MyBatis-Spring 之后,你不再需要直接使用SqlSessionFactory
了,因为你的 bean 可以被注入一个线程安全的SqlSession
,它能基于 Spring 的事务配置来自动提交、回滚、关闭 session
1.使用原始user映射文件,不需修改
2.新建个UserDao接口
public interface UserDao{
User getUserById(Integer id);
List<User> getUserByUserName(String Username);
void insertUser(User user);
.....
}
3.新建个UserDaoImpl接口实现类
public class UserDaoImpl implements UserDao{
@Override
public User getUserById(Integer id){
SqlSession sqlsession =SqlsessionFactoryUtils.getSqlSessionFactory().openSession();
User user=sqlSession.selectOne("user.getUserById",id);
sqlsession.close();
return user;
}
}
4.使用Dao测试
public class UserDaoTest{
@Test
public void testGetUserById(){
UserDao userdao=new UserDaoImpl();
User user =userdao.getUserById(30);
System.out.pringln(user);
}
}
1.动态代理开发规则
动态代理开发规则:
1.namespace必须是接口的全路径名
2.接口的方法名必须与Sql id一致
3.接口的入参必须与parameterType类型一致
4.接口的返回值必须与resultType类型一致
2.动态代理开发步骤
UserMapper.xml
与上面user.xml一样
UserMapper
public interface UserMapper{
User getUserById(int id);
.........
}
UserMapperTest
public class UserMapperTest{
@Test
public void testGetUserById(){
SqlSession sqlsession =SqlsessionFactoryUtils.getSqlSessionFactory().openSession();
UserMapper usermapper=sqlsession.getMapper(UserMapper,class);
System.out.pringln(user);
sqlsession.close();
}
}
注解开发不易于维护一般适用于简单的项目
注解开发不需要映射文件.xml只需要sqlmapconfig.xml
常用注解
@Select 相当于映射文件中的select标签
@Insert 相当于映射文件中的insert标签
@SelectKey 相当于映射文件中的selectKey标签
@Update 相当于映射文件中的update标签
@Delete 相当于映射文件中的delete标签
@Result 相当于映射文件中的result标签
@One 相当于映射文件中的association标签,用于封装关联JavaBean对象
@Many 相当于映射文件中的collection标签,用于封装关联JavaBean对象集合
使用方法:
创建接口,在方法上添加注解
public interface UserDao{
@Select("select * from userwhere id=#{id}")
User queryId(Integer id);
@Delete("delete from user where id=#{id}")
void delete(Integer id)
}
在测试类中测试
@Test
public void query(){
User user=userDao.query(53);
System.out.pringln(user);
}
@Test
public void delete(){
userDao.delete(53);
session.commit();
}
PS:执行dml语句(CURD)一定到提交事务session.commit();
SqlMapConfig.xml中配置的内容和顺序如下:
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工场)
plugins(插件)
environments(环境集合属性对象)
? environment(环境子属性对象)
? transactionManager(事务管理)
? dataSource(数据源)
mappers(映射器)
<!-- 先加载内部标签,在加载外部文件,若外部文件与内部名称相同时,会将外部的值替换掉内部的值 -->
<properties resource="jdbc.properties">
<property name="jdbc.username" value="root1"/>
<property name="jdbc.password" value="root1"/>
</properties>
Mybatis支持的别名
别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecmial BigDecimal
map Map
自定义别名
<typeAliases>
<!--单个别名扫描,别名的使用不区分大小写-->
<typeAlias type="com.yhr.mybatis.pojo.User" alias="user"/>
<!--别名包扫描器:别名是类的全称,不区分大小写-->
<package name="com.yhr.mybatis.pojo"/>
</typeAliases>
<mapper>
<!--通过resource方法一次加载一个映射文件 -->
<!-- <mapper resource="mapper/UserMapper.xml"/> -->
<mapper resource="mybatis/usermapper.xml"/>
<!--映射文件,class扫描器
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中 上边规范的前提是:使用的是mapper代理方法
-->
<mapper class="com.yhr.mybatis.mapper.UserMapper"/>
<!-- 批量加载mapper
指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中 上边规范的前提是:使用的是mapper代理方法
-->
<package name="cn.itcast.mybatis.mapper"/>
</mapper>
传递简单类型
{}占位符 ${}进行sql拼接
eg:id= #{id2} username like ‘%${value}%‘
传递pojo对象
Mybatis使用ognl表达式解析对象字段的值#{}或者${}括号中的值为pojo属性名称
eg:<...... parameterType="com.yhr.mybatis.User">
insert into usertable(username,sex,address) values(#{username},#{sex},#{address});
传递pojo包装对象
开发中通过可以使用pojo传递查询条件
查询条件可以是综合的查询条件,不仅包括用户查询条件还包括其他的查询条件(比如查询用户信息的时候,将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
包装对象:Pojo类中的一个属性是另外一个pojo
eg:<...... parameterType="com.yhr.mybatis.pojo.QueryVo">
SELECT ID,username,sex,address FROM usertable WHERE username like ‘%${user.username}%‘
QueryVo.java:
public class QueryVo {
private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; }
}
输出简单类型
需求:查询用户表数据条数
UserMapper.xml
<select id="queryUserCount" resultType="int"> Select count(*)from `user` </select>
输出pojo对象
输出pojo列表
resulrType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名做一个对应关系,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一和一对多查询。
需求:查询订单表order的所有数据
sql :Select id,user_id,number,createtime,note from
order
<resultMap type="com.yhr.mybatis.pojo.Order" id="order_list_map"> <!--用于映射主键 --> <id property="id" column="id"/> <!-- 普通字段用result映射 --> <result property="userId" column="user_id"/> <result property="number" column="number"/> <result property="createtime" column="createtime"/> <result property="note" column="note"/> </resultMap> <!--使用resultMap --> <select id="getOrderListMap" resultMap="order_list_map"> select id,user_id,number,createtime,note from ordertable; </select>
通过mybatis的各种标签方法实现动态拼接sql
需求:根据姓名和性别查询用户
select id ,username,sex,address from usertable where sex=‘男‘ and username like ‘%张%‘
<select id="getUserByPojo" parameterType="User" resultType="User">
select id ,username,sex,address from usertable
where 1=1
<if test="username!=null and username!=‘‘">and username like ‘%${username}%‘</if>
<if test="sex!=null and sex!=‘‘">and sex=#{sex}</if>
</select>
<select id="getUserByPojo" parameterType="User" resultType="User">
select id ,username,sex,address from usertable
<!-- where标签自动补上where关键字,同时处理多余的and,用了where标签就不能手动加上where关键字-->
<where>
<if test="username!=null and username!=‘‘">and username like ‘%${username}%‘</if>
<if test="sex!=null and sex!=‘‘">and sex=#{sex}</if>
</where>
</select>
<sql id="user_sql">
id ,username,sex,address
</sql>
<select id="getUserByPojo" parameterType="User" resultType="User">
select
<!-- sql片段使用:refid引用定义好的sql片段 -->
<include refid="user_sql"></include>
from usertable
<where>
<if test="username!=null and username!=‘‘">and username like ‘%${username}%‘</if>
<if test="sex!=null and sex!=‘‘">and sex=#{sex}</if>
</where>
</select>
<select id="getUserByIds" parameterType="QueryVo" resultType="User">
select <include refid="user_sql"></include>
from usertable
<where>
<!--foreach 集合标签
collection:要遍历的集合
open:循环开始之前输出的内容
close:循环借宿之后输出的内容
separator:分隔符
item:设置循环变量
-->
<!-- id in(0,1,8,9) -->
<foreach collection="ids" open="id in(" item="uid" separator="," close=")">
#{uid}
</foreach>
</where>
</select>
订单表 用户表
一对一:一个订单只有一个用户创建
一对多:
resultType(必须有数据库关系一样的pojo类)
1.建立OrderUser pojo类继承Order类
2.SQL语句:select o.id ,o.user_id,o.number,o.createtime,o.note,u.username,u.address
? from ordertable o left join usertable u on o.user_id=u.id
3.编写OrderMapper.xml
4.编写测试类
resultMap
OrderMapper.xml
<resultMap type="Order" id="order_user_map">
<id property="id" column="id"/>
<!-- 普通字段用result映射 -->
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/>
<!--用于配置一对一关系
property:Order里的user属性
javaType:user的数据类型,支持别名
-->
<association property="user" javaType="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
</association>
</resultMap>
<select id="getOrderUserMap" resultMap="order_user_map">
select o.id ,o.user_id,o.number,o.createtime,o.note,u.username,u.address
from ordertable o left join usertable u on o.user_id=u.id
</select>
sql语句
select u.id ,u.username,u.sex,u.address,o.id,o.number,o.note from usertable u left join ordertable o on u.id=o.user_id
<resultMap type="User" id="user_order_map">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<result property="sex" column="sex"/>
<!-- 一对多关联
property:User中的orders属性
ofType:orders的数据类型,支持别名
-->
<collection property="orders" ofType="Order">
<id property="id" column="oid"/>
<result property="number" column="number"/>
<result property="note" column="note"/>
</collection>
</resultMap>
<select id="getUserOrderMap" resultMap="user_order_map">
select u.id ,u.username,u.sex,u.address,o.id oid,o.number,o.note
from usertable u left join ordertable o on u.id=o.user_id
</select>
1.SqlSessionFactory对象应放到spring容器中作为单例存在
2.传统Dao的开发方式,应该从spring容器中获得sqlsession对象
3.Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象
4.数据库的连接以及数据库连接池事务管理都交给spring来完成
1.创建一个java工程
2.导入jar包mybatis-spring-x.x.x.jar以及其他相关jar包
3.mybatis的配置文件sqlMapConfig.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>
</configuration>
4.编写Spring的配置文件
? 1)数据库连接及连接池
? 2)sqlsessionFactory对象配置搭配spring容器中
? 3)编写Spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 配置 读取properties文件 jdbc.properties -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置SqlSessionFactory -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 设置MyBatis核心配置文件 -->
<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"/>
<!-- 设置数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 别名包扫描 -->
<property name="typeAliasesPackage" value="com.yhr.crm.pojo"/>
</bean>
<!-- 配置Mapper扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 设置Mapper扫描包 -->
<property name="basePackage" value="com.yhr.crm.mapper"/>
</bean>
</beans>
5.复制jdbc.properties配置文件到工程
6.复制log4j.properties配置文件到工程
编写pojo类
编写dao层 编写mapper接口
public interface BaseDictMapper {
List<BaseDict> getBaseDictByCode(String code);
}
编写dao层 编写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.yhr.crm.mapper.BaseDictMapper">
<select id="getBaseDictByCode" parameterType="string" resultType="basedict">
SELECT dict_id,
dict_type_code,
dict_type_name,
dict_item_name,
dict_item_code,
dict_sort,
dict_enable,
dict_memo
FROM
crm.base_dict
WHERE dict_type_code = #{code }
</select>
</mapper>
其他层如service或controller请自己补充
下载逆向工程https://github.com/mybatis/generator/releases/tag/mybatis-generator-1.3.2
向Eclipse中导入此项目
导入jar包:
log4j-xxx.jar
mybatis-xxx.jar
mybatis-generator-core-xxx.jar
mysql-connector-java-xxx.jar
创建generatorConfig.xml配置文件
使用执行java类
把生成的代码copy进项目中
<?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.cj.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/taotaostore?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai"
userId="root"
password="manager">
</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.taotao.pojo"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.taotao.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.taotao.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table schema="" tableName="tb_content"></table>
<table schema="" tableName="tb_content_category"></table>
<table schema="" tableName="tb_item"></table>
<table schema="" tableName="tb_item_cat"></table>
<table schema="" tableName="tb_item_desc"></table>
<table schema="" tableName="tb_item_param"></table>
<table schema="" tableName="tb_item_param_item"></table>
<table schema="" tableName="tb_order"></table>
<table schema="" tableName="tb_order_item"></table>
<table schema="" tableName="tb_order_shipping"></table>
<table schema="" tableName="tb_user"></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();
}
}
}
这样就生成了项目所需的pojo和mapper。copy进自己的项目即可
PS:Mapper.xml文件已经存在时,如果进行重新生成则mapper.xml文件时,内容不被覆盖而是进行内容追加,结果导致mybatis解析失败。
解决方法:删除原来已经生成的mapper xml文件再进行生成。
Mybatis自动生成的po及mapper.java文件不是内容而是直接覆盖没有此问题。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cjw</groupId>
<artifactId>myBatisGenerator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<mybatis.version>3.2.8</mybatis.version>
<mysql.version>5.1.36</mysql.version>
<mysql-connector-java.version>5.1.28</mysql-connector-java.version>
<log4j.version>1.2.17</log4j.version>
<!-- Encoding -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 数据库驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 日志文件管理包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
<version>3.2</version>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<!--配置文件的路径 -->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
generatorConfig.xml配置文件
运行java代码
原文:https://www.cnblogs.com/yhr520/p/12550205.html