mybatis配置

本文详细介绍了如何使用MyBatis框架创建数据库表、定义实体类、实现数据访问接口,以及如何在MyBatis配置文件中设置数据库连接、事务管理和SQL映射文件。通过提供完整的代码示例,读者可以深入了解MyBatis框架在数据库操作中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.创建数据库表(User表)
复制代码
CREATE TABLE `NewTable` (
`userId`  bigint(20) NOT NULL AUTO_INCREMENT ,
`userName`  varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`password`  varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`comment`  varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`userId`),
UNIQUE INDEX `UQ_User_userName` (`userName`) USING BTREE
)
复制代码

2.2. 创建实体类

复制代码
package com.mybatis.config;

public class User {
    private int userId;
    private String userName;
    private String password;
    private String comment;
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    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 getComment() {
        return comment;
    }
    public void setComment(String comment) {
        this.comment = comment;
    }
}
复制代码

3. 定义数据访问接口

复制代码
package com.mybatis.config;

import java.util.List;

public interface UserDao {
    
    public int insert(User user);
    
    public int update(User user);
    
    public int delete(String userName);
    
    public List<User> selectAll();
    
    public int countAll();
    
    public User findByUserName(String userName);
    //多个参数的查询
    public List<User> getUsersPage(int count,int page);
    //使用map传多个参数
    public List<User> findUserByNameandAge(Map map);
    //返回刚刚插入数据的id
    public void getInsertUserId(User user);
    // 批处理,插入多条记录
    public  void insertUsers(List<User> users);
 
}
复制代码

4.创建MyBatis映射文件(UserDaoMapper.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.mybatis.config.UserDao">
    <select id="countAll" resultType="int">
        select count(*) c from user;
    </select>
    
    <select id="selectAll" resultType="com.mybatis.config.User">
        select * from user order by userName asc
    </select>
    
    <insert id="insert" parameterType="com.mybatis.config.User">
        insert into user(userName,password,comment) values(#{userName},#{password},#{comment})
    </insert>
    
    <update id="update" parameterType="com.mybatis.config.User">
        update user set userName=#{userName},password=#{password},comment=#{comment} where userName=#{userName}
    </update>
    
    <delete id="delete" parameterType="int">
        delete from user where userName=#{userName}
    </delete>
    
    <select id="findByUserName" parameterType="String" resultType="com.mybatis.config.User">
        select * from user where userName=#{userName}
    </select>
   <!--这里是分页查询,传的是两个参数,用下面的方式可以获得赋值-->
   <select id="selectUserPage" resultType="com.cn.unis.entity.User">
        select * from sdl_user_test limit #{1},#{0}
   </select>
   <!-- 动态sql语句查询 ,同时用map实现多个参数查询-->
   <!--在给方法传参数的时候    例如:
      Map map = new HashMap();
      map.put("name", "杰");
      map.put("age", 44);
      List<User> users = mapper.findUserByNameandAge(map);
   -->
   <select id="findUserByNameandAge" resultMap="users" parameterType="map">
     select * from sdl_user_test
     <where>
       <if test="name!=null">
          name like concat(concat('%',#{name}),'%')
       </if>    
       <if test="age!=null">
          and age = #{age}
       </if>
     </where>
   </select >
   <resultMap type="User" id="users">
      <id property="id" column="id"/>
      <result property="name" column="name"/>
      <result property="age" column="age"/>
   </resultMap >	
 
 
   <!--本例的数据库中设置了主键自增 'auto increment' order='AFTER'表示先插入再进行查询返回id -->
   <insert id="getInsertUserId" parameterType="com.cn.unis.entity.User">
     insert into sdl_user_test(id,name,age) values(#{id},#{name},#{age});
     <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
       SELECT LAST_INSERT_ID()
     </selectKey>
   </insert>
   <!--这是批处理的  一次插入多条记录-->
   <insert id="insertUsers" parameterType="com.cn.unis.entity.User">
      insert into sdl_user_test(id,name,age) values
      <foreach collection="list" item="item" index="index" separator=",">
        (#{item.id},#{item.name},#{item.age})
       </foreach>
   </insert >
 
 
</mapper>
复制代码

5. 创建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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/hlp?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull" />
                <property name="username" value="root" />
                <property name="password" value="1234" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/mybatis/config/UserDaoMapper.xml"/>
    </mappers>
</configuration>
复制代码

6. 编写测试代码

复制代码
package com.mybatis.config;

import java.io.Reader;
import java.util.Iterator;
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.Test;

public class UserDaoTest {
    @Test
    public void userDaoTest() throws Exception
    {
        String resource = "MyBatis-Configuration.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(reader);
        
        SqlSession session = factory.openSession();
        UserDao userDao = session.getMapper(UserDao.class);
        
        User user = new User();
        user.setUserName("hongye");
        user.setPassword("123456");
        user.setComment("备注");
        
        userDao.insert(user);
        System.out.println("记录条数:"+userDao.countAll());
        
        List<User> users = userDao.selectAll();
        Iterator<User> iter = users.iterator();
        while(iter.hasNext()){
            User u = iter.next();
            System.out.println("用户名:"+u.getUserName()+"密码:"+u.getPassword());
        }
        
        user.setComment("comment");
        userDao.update(user);
        User u = userDao.findByUserName("hongye");
        System.out.println(u.getComment());
        
        userDao.delete("hongye");
        System.out.println("记录条数:"+userDao.countAll());
        
        session.commit();
        session.close();
    }
}

 

配置文件具体说明

 <?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>

  <!-- 参数设置 -->

  <settings>

  <!-- 这个配置使全局的映射器启用或禁用缓存 -->

  <setting name="cacheEnabled" value="true"/>

  <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->

  <setting name="lazyLoadingEnabled" value="true"/>

  <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载 -->

  <setting name="aggressiveLazyLoading" value="true"/>

  <!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动) -->

  <setting name="multipleResultSetsEnabled" value="true"/>

  <!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动 -->

  <setting name="useColumnLabel" value="true"/>

  <!-- 允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby) -->

  <setting name="useGeneratedKeys" value="true"/>

  <!-- 指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况) -->

  <setting name="autoMappingBehavior" value="PARTIAL"/>

  <!-- 配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新 -->

  <setting name="defaultExecutorType" value="SIMPLE"/>

  <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->

  <setting name="defaultStatementTimeout" value="25000"/>

  </settings>

  <!-- 别名定义 -->

  <typeAliases>

  <typeAlias alias="pageAccessURL" type="com.lgm.mybatis.model.PageAccessURL" />

  </typeAliases>

  <environments default="development">

  <!-- 环境配置1,每个SqlSessionFactory对应一个环境 -->

  <environment id="development1">

  <!--

  事务配置 type= JDBC、MANAGED

  1.JDBC:这个配置直接简单使用了JDBC的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。

  2.MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。

  默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,将closeConnection属性设置为false

  -->

  <transactionManager type="JDBC"/>

  <!--

  <transactionManager type="MANAGED">

  <property name="closeConnection" value="false"/>

  </transactionManager>

  -->

  <!--

  数据源类型:type = UNPOOLED、POOLED、JNDI

  1.UNPOOLED:这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。

  不同的数据库对这个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的

  2.POOLED:这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。

  这是一种当前Web应用程序用来快速响应请求很流行的方法。

  3.JNDI:这个数据源的实现是为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用

  -->

  <dataSource type="UNPOOLED">

  <property name="driver" value="com.mysql.jdbc.Driver"/>

  <property name="url" value="jdbc:mysql://localhost:3306/appdb"/>

  <property name="username" value="root"/>

  <property name="password" value="123456"/>

  <!--

  默认连接事务隔离级别

  <property name="defaultTransactionIsolationLevel" value="" />

  -->

  </dataSource>

  </environment>

  <!-- 环境配置2 -->

  <environment id="development2">

  <transactionManager type="JDBC"/>

  <dataSource type="POOLED">

  <property name="driver" value="com.mysql.jdbc.Driver"/>

  <property name="url" value="jdbc:mysql://localhost:3306/appdb"/>

  <property name="username" value="root"/>

  <property name="password" value="123456"/>

  <!-- 在任意时间存在的活动(也就是正在使用)连接的数量 -->

  <property name="poolMaximumActiveConnections" value="10"/>

  <!-- 任意时间存在的空闲连接数 -->

  <property name="poolMaximumIdleConnections" value="5"/>

  <!-- 在被强制返回之前,池中连接被检查的时间 -->

  <property name="poolMaximumCheckoutTime" value="20000"/>

  <!-- 这是给连接池一个打印日志状态机会的低层次设置,还有重新尝试获得连接,这些情况下往往需要很长时间(为了避免连接池没有配置时静默失败) -->

  <property name="poolTimeToWait" value="20000"/>

  <!-- 发送到数据的侦测查询,用来验证连接是否正常工作,并且准备接受请求。 -->

  <property name="poolPingQuery" value="NO PING QUERY SET"/>

  <!-- 这是开启或禁用侦测查询。如果开启,你必须用一个合法的SQL语句(最好是很快速的)设置poolPingQuery属性 -->

  <property name="poolPingEnabled" value="false"/>

  <!-- 这是用来配置poolPingQuery多次时间被用一次。这可以被设置匹配标准的数据库连接超时时间,来避免不必要的侦测 -->

  <property name="poolPingConnectionsNotUsedFor" value="0"/>

  </dataSource>

  </environment>

  <!-- 环境配置3 -->

  <environment id="development3">

  <transactionManager type="JDBC"/>

  <dataSource type="JNDI">

  <property name="data_source" value="java:comp/env/jndi/mybatis"/>

  <property name="env.encoding" value="UTF8"/>

  <!--

  <property name="initial_context" value=""/>

  <property name="env.encoding" value="UTF8"/>

  -->

  </dataSource>

  </environment>

  </environments>

  <!-- 映射文件,存放sql语句的配置文件 -->

  <mappers>

  <mapper resource="com/lgm/mybatis/config/pageAccessURL.xml"/>

  </mappers>

  </configuration>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值