Mybatis

文章目录

1. jdbc编程

1.1 优点

  • 编程简单
  • 效率高

1.2. 缺点

  • 数据库的连接频繁的关闭,造成资源的浪费

    解决方案: 数据库的连接池(dbcp c3p0…)

  • sql语句存在硬编码,如果要修改需求,那就要修改sql语句,而sql语句又是在java代码中,我们改变了Java代码就要重新编译java代码,不易于维护

    解决方案:(设想—>不要写在java代码中)

2. mybatis的架构

在这里插入图片描述

SqlMapConfig(配置信息的封装对象)--->SqlSessionFactory--->SqlSession--->Excecutor--->mapstatement

3. mybatis到底是什么?

  • 持久层(dao)的解决方案
  • 解决了jdbc硬编码与连接对象频繁创建的问题

4. mybatis入门程序(了解)

4.1 修改maven编译jdk的版本

conf/settings.xml

<profiles>
<profile>
    <id>development-jdk-1.8</id>
	<activation>
		<jdk>1.8</jdk>
		<activeByDefault>true</activeByDefault>
	</activation>
    <properties>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
		<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
</profile>
</profiles>

4.2 mybatis依赖的pom

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.4</version>
</dependency>

4.3 配置日志文件(先不管)

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug, stdout

4.4 创建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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/up2"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="sqlmap/UserMapper.xml"></mapper>
    </mappers>
</configuration>

4.5 创建映射(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="test">
    <select id="findUserById" parameterType="int" resultType="int">
         select age from user where id=#{id}
    </select>
</mapper>

4.6 运行程序

  • 创建配置文件SqlMapConfig,用来初始化SqlSessionFactory对象
  • 创建编写sql语句的xml文件(映射文件)
  • 创建SqlSessionFactory对象
  • 创建SqlSession对象
  • 使用SqlSession对象执行MapStatement(对映射文件的封装)
InputStream conf = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(conf);
//使用会话工厂创建会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//使用会话对象执行sql语句(MapStatement)
Object obj = sqlSession.selectOne("test.findAgeById", 1);
System.out.println(obj);
//提交事务
sqlSession.commit();
sqlSession.close();

5. 常用参数

  • namespace 命名空间(表示一组MapStatement)
  • id:一个statement的唯一标识
  • parameterType:输入参数的类型(java中的数据类型或者mybatis中的数据类型)
  • resultType:输出参数的类型(java中的数据类型或者mybatis中的数据类型),只是指定类型,和查询出来的数量无关

6. 解决mybatis中查询中文出现的问题(8.x以下的版本)

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"></transactionManager>
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/up2?characterEncoding=utf8"/>
            <property name="username" value="root"/>
            <property name="password" value="root"/>
        </dataSource>
    </environment>
</environments>

7.查询多条记录

/**使用  selectOne(id,param);查询的结果如果是多条则会出现一些错误,使用selectList(id)即可查询多条记录
*/
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2


8. 模糊查询

<!--想象的模糊查询-->
<select id="findUserByNameOfLike" parameterType="string" resultType="com.uplooking.mybatis.pojo.User">
    select * from user where name like #{name}
</select>
<!--想象的模糊查询是存在问题的,因为参数一般是用户输入的,用户会输入通配符 % _吗? -->

<!--我们改进之后变成以下这样了-->
<select id="findUserByNameOfLike" parameterType="string" resultType="com.uplooking.mybatis.pojo.User">
    select * from user where name like '%#{name}%'
</select>

so:

一大堆的错误

终极解决方案

只有一个输入参数时要使用value

<select id="findUserByNameOfLike" parameterType="string" resultType="com.uplooking.mybatis.pojo.User">
    select * from user where name like "%${value}%"
</select>

<select id="findUserByNameOfLike" parameterType="string" resultType="com.uplooking.mybatis.pojo.User">
    select * from user where name like "%"#{name}"%"
</select>


9. ${} 与 #{}

  • #{} 以占位符的形式进行填充(可以避免sql注入,推荐使用)

  • ${} 以普通字符串的形式进行填充


10. 添加用户

<insert id="addUser" parameterType="com.uplooking.mybatis.pojo.User">
    INSERT  into user VALUES (null,#{name},#{age})
</insert>
public void testAddUser() {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    User user = new User();
    user.setName("小红");
    user.setAge(29);
    sqlSession.insert("test.addUser", user);
    sqlSession.commit();
    sqlSession.close();
}

11. mybatis与hibernate的区别

11.1 mybatis

  • 入门简单,程序容易上手开发,节省开发成本
  • mybatis需要程序员自己编写sql语句 是一个不完全 的ORM框架 ,对sql修改和优化非常容易实现
  • mybatis适合开发需求变更频繁的系统,比如:互联网项目

11.2 hibernate

  • 入门门槛高 ,如果用hibernate写出高性能的程序不容易实现。hibernate不用写sql语句
  • hibernate适合需求固定,对象数据模型稳定,中小型项目,比如:企业OA系统。

总之,企业在技术选型时根据项目实际情况,以降低成本和提高系统 可维护性为出发点进行技术选型。


12. mybatis开发dao

12.1 传统的方式开发dao(了解)

/*定义接口*/
public interface UserDao {
    void addUser(User user);
    void deleteUser(Integer id);
}

/*定义实现类*/
public class UserDaoImpl implements UserDao {
    private SqlSessionFactory sqlSessionFactory;

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public void addUser(User user) {
        SqlSession session = sqlSessionFactory.openSession();
        session.insert("test.addUser", user);
        session.commit();
        session.close();
    }

    @Override
    public void deleteUser(Integer id) {
    }
}

public void testAddUser() {
    //sqlSession = sqlSessionFactory.openSession();
    //sqlSession.insert("test.addUser", user);
    User user = new User();
    user.setName("小红");
    user.setAge(29);
    UserDao userDao = new UserDaoImpl(sqlSessionFactory);
    userDao.addUser(user);
}

12.2 使用mapper代理的方式开发dao(重要)

**程序员只需要写dao接口,dao接口实现对象由mybatis自动生成代理对象** 

**相比传统的方式开发更加简单,且传统的dao开发中存在硬编码(statement_id)**

使用mapper代理的方式开发dao层要遵循一些规范:

  1. Mapper接口必须和映射文件在同一个目录下
  2. mapper.xml中namespace指定为mapper接口的全限定名
  3. mapper.xml中statement的id就是mapper.java中方法名
  4. mapper.xml中statement的parameterType和mapper.java中方法输入参数类型一致
  5. mapper.xml中statement的resultType和mapper.java中方法返回值类型一致.

12.2.1 创建mapper接口

package com.uplooking.mybatis.mapper;
import com.uplooking.mybatis.pojo.User;
public interface UserMapper {
    void addUser(User user);
    void deleteUser(Integer id);
}

12.2.2 创建mapper.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 namespace="com.uplooking.mybatis.mapper.UserMapper">
    <insert id="addUser" parameterType="com.uplooking.mybatis.pojo.User">
        insert into user values(null,#{name},#{age});
    </insert>

    <delete id="deleteUser"></delete>
</mapper>

12.2.3 配置SqlMapConfig

<mappers>
    <package name="com.uplooking.mybatis.mapper"></package>
</mappers>

12.2.4 maven不认识mapper.xml解决方案

pom.xml

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

12.2.5 测试运行

@Test
public void addUser() throws Exception {
InputStream conf = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(conf);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setName("小红红红");
user.setAge(12);
mapper.addUser(user);
sqlSession.close();
}

13. 数据库和实体类映射的业内的共识规范

  • 表名小写, User.java—>user EduUser.java—>edu_user
  • 属性名称, name---->name userName—>user_name

14. mybatis中的别名

14.1 系统定义的别名

_byte--->byte
_long--->long
_short--->short
_int--->int
........

14.2 自定义别名

SqlMapConfig.xml

单独指定某个类的别名

<typeAliases>
<typeAlias type="com.uplooking.mybatis.pojo.User"  alias="user"></typeAlias>
</typeAliases>

注意: 标签必须放在之前

给指定包全部生成别名,默认是简单类名或者简单类名的小写

<package name="com.xzy.mybatis.entity"/>

14.3 使用别名

<select id="findUserById" resultType="user" parameterType="int">
    select * from user where id=#{value}
</select>

15. mybatis中的返回值

15.1 简单类型的返回值

<select id="findUserById" resultType="string" parameterType="int">
    select name from user where id=#{value}
</select>

15.2 复杂类型的返回值

<select id="findUserById" resultType="com.uplooking.mybatis.pojo.User" parameterType="int">
    select * from user where id=#{value}
</select>

15.3 resultMap映射

<resultMap id="user1ResultMapping" type="com.uplooking.mybatis.pojo.User1">
    <id property="uid" column="id"></id>
    <result property="uname" column="name"></result>
    <result property="uage" column="age"></result>
</resultMap>

<select id="findUserById" resultMap="user1ResultMapping" parameterType="int">
    select * from user where id=#{value}
</select>
  • resultType :指定输出结果的类型(pojo、简单类型、hashmap…),将sql查询结果映射为java对象
  • 使用resultType注意:sql查询的列名要和resultType指定pojo的属性名相同,指定相同 属性方可映射成功,-如果sql查询的列名要和resultType指定pojo的属性名全部不相同,list中无法创建pojo对象的。
  • resultMap:将sql查询结果映射为java对象。
  • 如果sql查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个对应关系 (列名和属性名映射配置)

16. 动态sql(重点)

mybatis重点是对sql的灵活解析和处理

16.1 where…if语句

<?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.xzy.mapper.UserMapper">

    <select id="listByUser" parameterType="com.xzy.entity.User" resultType="com.xzy.entity.User">
        select *
        from user
        <where>
            <if test="nickname!=null">
                nickname = #{nickname}
            </if>
            <if test="password!=null">
                and password=#{password}
            </if>
        </where>
    </select>
</mapper>

16.2 foreach 语句(了解)

foreach元素的属性主要有 item,index,collection,open,separator,close。

  • collection接收一个集合为参数时 collection的值为list

    select * from user
        <where>
        <foreach collection="list" item="id" open="id in (" separator="," close=")">
        #{id}
    </foreach>
    
    
  • item表示集合中每一个元素进行迭代时的别名,

  • index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,

  • open表示该语句以什么开始,

  • separator表示在每次进行迭代之间以什么符号作为分隔符,

  • close表示以什么结束

<select id="findUsers" resultType="com.uplooking.mybatis.pojo.User"
        parameterType="com.uplooking.mybatis.pojo.UserCustom">
    select * from user
    <where>
        <foreach collection="list" item="id" open="id in (" separator="," close=")">
            #{id}
        </foreach>
    </where>
</select>

@Test
public void testFindUsers() throws IOException {
    InputStream conf = Resources.getResourceAsStream("SqlMapConfig.xml");
    //创建会话工厂
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(conf);
    SqlSession sqlSession = sqlSessionFactory.openSession(true);
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    UserCustom userCustom = new UserCustom();
    userCustom.setIds(Arrays.asList(1,2,3));
    List<User> users = mapper.findUsers(userCustom);
    System.out.println(users);
}

16.3 if + set + where语句 (主要用来更新)

<update id="updateUsername" parameterType="com.uplooking.mybatis.pojo.User">
    update user
    <set>
        <if test="name!=null">
            name=#{name}
        </if>
    </set>
    <where>
        id=#{id}
    </where>
</update>

@Test
public void testupdateUser() throws IOException {
    InputStream conf = Resources.getResourceAsStream("SqlMapConfig.xml");
    //创建会话工厂
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(conf);
    SqlSession sqlSession = sqlSessionFactory.openSession(true);
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = new User();
    user.setId(1);
    user.setName("xiaohuahua1");
    mapper.updateUsername(user);
}

16.4 choose+when+otherwise

<where>
    <choose>
        <when test="条件">
            sql语句
        </when>
        <when test="条件">
            sql语句
        </when>
        <otherwise>
            sql语句
        </otherwise>
    </choose>
</where>

17. mybatis中接收多个参数(重要)

可以接收一个参数 也可以接收多个参数

17.1 接收普通的单一参数

public interface UserMapper {
    User findById(Integer id);
}

<select id="findById" parameterType="int" resultType="com.xzy.entity.User">
    select *
    from user
    where id = #{value }
</select>


17.2 接收对象类型的参数

public interface UserMapper {
    User findByUser(User user);
}

<select id="findByUser" parameterType="com.xzy.entity.User" resultType="com.xzy.entity.User">
    select *
    from user
    where nickname = #{nickname}
</select>


17.3 接收多个参数

List<User> findByNicknameOrPassword(String nickname, String password);

<select id="findByNicknameOrPassword" resultType="com.xzy.entity.User">
    select *
    from user
    where nickname = #{param1}
    or password = #{param2}
</select>

但是我们上面使用param1和param2…来接收形参数据,名称不太友好(不能见名知意) ,所有Mybatis中给我们提供了一个注解 @Param("xxx"),我们可以使用这个注解表示形参名称,来给mybatis使用;

public interface UserMapper {
    List<User> findByNicknameOrPassword(@Param("nickname") String nickname, @Param("password") String password);
}

<select id="findByNicknameOrPassword" resultType="com.xzy.entity.User">
    select *
    from user
    where nickname = #{nickname}
    or password = #{password}
</select>


18. mybatis中的结果映射

18.1 一对一的映射

一对一的关系在实际开发中很少见,因为一对一的关系我们都会直接搞成一个附加的字段	

18.1.1 创建pojo类

package com.xzy.entity;

public class User {
    private Integer id;
    private String nickname;
    private String password;
    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", nickname='" + nickname + '\'' +
                ", password='" + password + '\'' +
                ", address=" + address +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}


package com.xzy.entity;

public class Address {
    private Integer id;
    private String prov;
    private String city;

    @Override
    public String toString() {
        return "Address{" +
                "id=" + id +
                ", prov='" + prov + '\'' +
                ", city='" + city + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getProv() {
        return prov;
    }

    public void setProv(String prov) {
        this.prov = prov;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}


18.1.2 创建mapper接口

public interface UserMapper {
        User findUserById(Integer id);
}

18.1.3 创建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.xzy.mapper.UserMapper">

    <select id="findByNicknameOrPassword" resultType="com.xzy.entity.User">
        select *
        from user
        where nickname = #{nickname}
           or password = #{password}
    </select>

    <resultMap id="userAddressMap" type="com.xzy.entity.User">
        <id property="id" column="id"></id>
        <result property="nickname" column="nickname"></result>
        <result property="password" column="password"></result>
        <!--一对一的关系-->
        <association property="address" javaType="com.xzy.entity.Address">
            <id property="id" column="id"></id>
            <result property="prov" column="prov"></result>
            <result property="city" column="city"></result>
        </association>

    </resultMap>
    <select id="findById" resultMap="userAddressMap">
        select *
        from user,
             address
        where user.id = address.id
          and user.id = #{id}
    </select>
</mapper>

18.1.4 执行查询

@Test
public void testFindUserById() throws IOException {
    SqlSession sqlSession = sqlSessionFactory.openSession(true);
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.findUserById(1);
    System.out.println(user);
}

18.2 一对多的映射

18.2.1 创建pojo类

package com.uplooking.mybatis.pojo;
import java.util.List;
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private List<Orders> orderss;

    @Override
    public String toString() {
        return "User{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", age=" + age +
            ", orderss=" + orderss +
            ", address=" + address +
            '}';
    }

    public List<Orders> getOrderss() {
        return orderss;
    }

    public void setOrderss(List<Orders> orderss) {
        this.orderss = orderss;
    }

    /*一对一的映射*/
    private Address address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}


package com.uplooking.mybatis.pojo;

import java.util.Date;

public class Orders {
    private Integer id;
    private Integer num;
    private Date createTime;

    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", num=" + num +
                ", createTime=" + createTime +
                '}';
    }
}


18.2.2 创建mapper接口

public interface UserMapper {
    User findUserById(Integer id);
}

18.2.3 创建mapper映射文件

<resultMap id="userAndAddressMapping" type="com.uplooking.mybatis.pojo.User">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="age" column="age"></result>
<!--一对多的关系-->
<collection property="orderss" ofType="com.uplooking.mybatis.pojo.Orders">
    <result property="num" column="num"></result>
    <result property="createTime" column="createTime"></result>
</collection>
</resultMap>

<select id="findUserById" resultMap="userAndAddressMapping" parameterType="int">
    select u.id,u.name,u.age,o.num,o.createtime
    from user u,orders o where o.uid=u.id and u.id=#{value};
</select>

18.2.4 运行

@Test
public void testFindUserById() throws IOException {
    SqlSession sqlSession = sqlSessionFactory.openSession(true);
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.findUserById(1);
    System.out.println(user);
}

18.3 复杂的映射

pojo同上一样,在此只写sql和映射

<resultMap id="userAndAddressMapping" type="com.uplooking.mybatis.pojo.User">
    <id property="id" column="id"></id>
    <result property="name" column="name"></result>
    <result property="age" column="age"></result>

    <!--一对一的关联-->
    <association property="address" javaType="com.uplooking.mybatis.pojo.Address">
        <result property="province" column="province"></result>
        <result property="city" column="city"></result>
        <result property="street" column="street"></result>
    </association>


    <!--一对多的关系-->
    <collection property="orderss" ofType="com.uplooking.mybatis.pojo.Orders">
        <result property="num" column="num"></result>
        <result property="createTime" column="createTime"></result>
    </collection>

</resultMap>

<select id="findUserById" resultMap="userAndAddressMapping" parameterType="int">
    select u.id,u.name,u.age,o.num,o.createtime,a.province,a.city,a.street
    from user u,orders o ,address a where o.uid=u.id and u.aid=a.id and u.id=#{value};
</select>

19. mybatis的逆向工程(自己去学)

  • mybatis官方给我们提供的一个工具
  • 用来根据表结构生成pojo类

19.1 依赖pom

<?xml version="1.0" encoding="UTF-8"?>
<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.uplooking</groupId>
    <artifactId>2018-08-21-mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>
    </dependencies>
</project>

19.2 配置generatorconfig.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="generateTables" targetRuntime="MyBatis3">



        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/up2"
                        userId="root"
                        password="root"
                        >
        </jdbcConnection>

        <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
            userId="yycg" password="yycg"> </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.uplooking.pojo"
                            targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.uplooking.mapper"
                         targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.uplooking.mapper" targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 指定数据库表 -->
        <table schema="general" tableName="user" domainObjectName="User"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="true"
               selectByExampleQueryId="false">
            <property name="useActualColumnNames" value="false"/>
        </table>

        <table schema="general" tableName="address" domainObjectName="Address"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="true"
               selectByExampleQueryId="false">
            <property name="useActualColumnNames" value="false"/>
        </table>

    </context>
</generatorConfiguration>

19.3 生成pojo

import java.io.File;
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.internal.DefaultShellCallback;
public class Generator {
    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;//加载上面的配置文件
        File configFile = new File("./src/main/resources/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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值