查看原文:http://www.ibloger.net/article/293.html
之前一直实用Hibernate进行开发,最近公司在使用Mybatis,根据网上的示例,做了一个简单的Demo,以便日后复习
使用XMl方式映射sql语句
总体结构如下图
首先是创建一个工程,然后导入两个jar包,然后编写mybatis的jdbc配置文件Configuration.xml
Configuration.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>
<!-- 为sql映射文件中的类型指定别名,如果不加alias,则整个包下的别名都是类名 -->
<typeAliases>
<typeAlias type="com.demo.bean.User" alias="User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
<property name="username" value="scott" />
<property name="password" value="scott" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/demo/bean/User.xml" />
</mappers>
</configuration>
User类,文章中省略getter和setter方法
package com.demo.bean;
import java.util.Date;
public class User {
private String id;
private String name;
private String password;
private Date birthday;
private String address;
}
然后是创建sql映射文件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 namespace="com.demo.bean.User">
<!-- 查询所有用户, resultType代表返回类型(一般写全限定类名,也可以在mybatis配置文件中指定别名),parameterType代表参数类型 -->
<select id="selectAllUsers" resultType="User">
select * from valid_user
</select>
<!-- 根据id查询用户 -->
<select id="findUserById" parameterType="int" resultType="User">
select * from valid_user where id=#{id}
</select>
<!-- 根据id更新用户 -->
<update id="updateUserById" parameterType="User">
update valid_user set name=#{name},address=#{address} where id=#{id}
</update>
<!-- 添加新用户 -->
<insert id="addUser" parameterType="User">
insert into valid_user(id,name,password,address) values(seq_valid_user.nextval,#{name},#{password},#{address})
</insert>
<!-- 根据id删除用户 -->
<delete id="deleteUserById" parameterType="int">
delete from valid_user where id=#{id}
</delete>
</mapper>
然后就是编辑测试类
package com.demo.Test;
import java.io.Reader;
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 com.demo.bean.User;
public class TestConnection {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 查询所有User对象
* @param id
*/
public static void selectAllUsers() {
SqlSession session = sqlSessionFactory.openSession();
try {
List<User> listUsers = session.selectList("com.demo.bean.User.selectAllUsers");
for (User user:listUsers) {
System.out.println("ID:" + user.getId() + ",姓名:" + user.getName() + ",密码:" + user.getPassword() + ",住址:" + user.getAddress());
}
} finally {
session.close();
}
}
/**
* 根据id查询User对象
* @param id
*/
public static void findUserById(String id) {
SqlSession session = sqlSessionFactory.openSession();
try {
User user = (User) session.selectOne("com.demo.bean.User.findUserById", id);
System.out.println("ID:" + user.getId() + ",姓名:" + user.getName() + ",密码:" + user.getPassword() + ",住址:" + user.getAddress());
} finally {
session.close();
}
}
/**
* 根据id更新User对象
* @param id
*/
public static void updateUserById(String id,User user) {
SqlSession session = sqlSessionFactory.openSession();
try {
session.update("com.demo.bean.User.updateUserById",user);
session.commit();
} finally {
session.close();
}
}
/**
* 添加一条User对象
*/
public static void addUser(User user) {
SqlSession session = sqlSessionFactory.openSession();
try {
session.insert("com.demo.bean.User.addUser",user);
session.commit();
} finally {
session.close();
}
}
/**
* 删除一条User对象
*/
public static void deleteUserById(String id) {
SqlSession session = sqlSessionFactory.openSession();
try {
session.delete("com.demo.bean.User.deleteUserById",id);
session.commit();
} finally {
session.close();
}
}
public static void main(String[] args) {
selectAllUsers();
// findUserById("1"); // 根据id查询User对象
// User user=new User();
// user.setId("2");
// user.setName("Zams");
// user.setAddress("河南、郑州");
// updateUserById("2",user); // 根据id更新User对象
// User add_user=new User();
// add_user.setName("古力娜扎");
// add_user.setPassword("3412312");
// add_user.setAddress("河南、郑州、开封");
// addUser(add_user); // 根据id更新User对象
// deleteUserById("4");
}
}
运行效果如下;
ID:1,姓名:X-rapido,密码:rapido,住址:北京朝阳、海淀
ID:2,姓名:Zams,密码:gril,住址:河南、郑州
ID:3,姓名:盖尔加朵,密码:3412312,住址:河南、郑州
ID:5,姓名:古力娜扎,密码:3412312,住址:河南、郑州、开封
其他内容:
- SqlSession session = sqlSessionFactory.openSession(); 可以设置事务的自动提交。
- 配置文件中的jdbc联接可以写在properties文件中。
- Mybatis的sql映射可以使用xml的形式,如上面内容,也可以使用java注解方式。
- 映射文件中可以配置多表连接方式。参考其他文档,未做示例
- 另外mybatis可以配置动态sql语句形式、调用存储过程、为sql语句字段指定别名(一般数据库字段与java类字段不同时需要指定)
- Mybatis的sql打印并不像Hibernate那样有设置sql打印的参数,它需要与log4j.jar包进行配合才能打印
使用Java注解方式映射sql语句
使用注解方式的示例结构如下
总体结构内容不变,主要修改java注解配置类(Service类)、配置文件、测试类3个地方即可
UserMapper类
package com.demo.bean;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
/**
* 使用注解映射,不需要写实现类,但要在Mybatis配置文件中将此类进行注册
*/
public interface UserMapper {
@Select("select * from valid_user")
List<User> selectAllUsers();
@Select("select * from valid_user where id=#{id}")
User findUserById(String id);
@Update("update valid_user set name=#{name},address=#{address} where id=#{id}")
int updateUserById(User user);
@Insert("insert into valid_user(id,name,password,address) values(seq_valid_user.nextval,#{name},#{password},#{address})")
int addUser(User user);
@Delete("delete from valid_user where id=#{id}")
int deleteUserById(String id);
}
Mybatis配置文件中 configuration.xml修改 mapper内容
<mappers>
<mapper class="com.demo.bean.UserMapper" />
</mappers>
将测试类中的如查询所有代码的com.demo.bean.User.selectAllUsers修改为com.demo.bean.UserMapper.selectAllUsers即可。
测试效果同xml的配置效果一样。
在实际应用中,有时候需要对Mybatis进行多参数传值,这时候可以使用Map对象进行查询
比如在登录时,传入账户名和密码,在xml在将 parameterType设置为map参数类型, parameterType="map"
Map<String, String> map = new HashMap<String, String>();
map.put("name", userName);
map.put("password", password);
return sqlSession.selectOne("com.demo.bean.User.loginUser", map);
设置log4j,打印SQL执行语句
log4j的配置文件可以是xml形式,也可以是.properties文件形式
log4j.properties(方式一)
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="debug" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>