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&characterEncoding=UTF-8&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="multipleResultSetsEnable
<!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动 -->
<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="defaultTransactionIsolat
-->
</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="poolMaximumActiveConnect
<!-- 任意时间存在的空闲连接数 -->
<property name="poolMaximumIdleConnectio
<!-- 在被强制返回之前,池中连接被检查的时间 -->
<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="poolPingConnectionsNotUs
</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>