MyBatis入门配置

来源:互联网 发布:js输入框 input span 编辑:程序博客网 时间:2024/04/30 17:32

mybatis配置 架构图介绍

1、  mybatis配置SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、  通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

3、  由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

4、  mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

5、  Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

6、  Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

7、  Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。


mybatis-config.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>
<!-- 配置pojo别名 -->
<typeAliases>
<!-- <typeAlias type="cn.mybatis.mybatis.po.User" alias="user"/> -->
<!-- 扫描包的形式创建别名,别名就是类名,不区分大小写 -->
<package name="com.mybatis.mybatis.bean" />
</typeAliases>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 加载mapper文件 -->
<mappers>
<!--1 resource基于classpath查找 -->
<mapper resource="com/mybatis/mybatis/dao/UserDao.wrap.xml" />
<!-- <mapper resource="com/mybatis/mybatis/dao/UserDao.xml" /> -->
<!--2使用扫描包的形式加载mapper文件 -->
<!-- <package name="com.mybatis.mybatis.dao"/> -->
</mappers>
</configuration>

log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n


User.java

public class User {
private int id;
private String username;
private String sex;
private Date birthday;
private Connection connection;

get/set...

}

Connection .java

public class Connection {
private String address;
private String telephone;
private String qq;

get/set...

}


public interface UserDao {
User getUserById(int id);
List<User> getUserByName(String username);
List<User> getAllUsers();
int addUser(User user);
int delUser(int id);
int updateUser(User user);
}

Pojo 映射文件UserDao.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">
<!-- namespace是命名空间,作用sql语句的隔离,后面还有重要作用 #{}作用就是占位符,相当于jdbc的“?” parameterType:查询的参数类型 
resultType:查询结果的数据类型,如果时候pojo应该给全路径。 -->
<!-- mapper代理的开发规则: 1、namespace必须时候接口的全限定名 2、Statementid必须和接口的方法名称一致 3、接口方法的参数类型要和parameterType要一致 
4、接口方法的返回值类型要和resultType一致 -->
<mapper namespace="com.mybatis.mybatis.dao.UserDao">
<!-- 别名不区分大小写 -->
<select id="getUserById" parameterType="int" resultType="user">
SELECT *
FROM `user` WHERE id=#{id};
</select>
<select id="getAllUsers" resultMap="user">
SELECT * FROM `user`
</select>
<!-- 如果查询结果返回list, resultType设置为list中一个元素的数据类型 ${}字符串拼接指令 -->
<select id="getUserByName" parameterType="string" resultType="user">
SELECT * FROM `user` WHERE username LIKE
concat('%',#{username},'%')
</select>
<!-- 参数时候pojo时,#{}中的名称就是pojo的属性 -->
<insert id="addUser" parameterType="user">
<!-- keyProperty:对于pojo的主键属性 resultType:对应主键的数据类型 order:是在insert语句执行之前或者之后。 
如果使用uuid做主键,应该先生成主键然后插入数据,此时应该使用Before -->
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT
LAST_INSERT_ID()
</selectKey>
INSERT into user (username,birthday,sex,address)
values (#{username},
#{birthday}, #{sex}, #{address})
</insert>
<delete id="delUser" parameterType="int">
delete from user where
id=#{id}
</delete>
<update id="updateUser" parameterType="user">
update user set
username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
</mapper>


包装Pojo 映射文件UserDao.wrap.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">
<!-- namespace是命名空间,作用sql语句的隔离,后面还有重要作用 #{}作用就是占位符,相当于jdbc的“?” parameterType:查询的参数类型 
resultType:查询结果的数据类型,如果时候pojo应该给全路径。 -->
<!-- mapper代理的开发规则: 1、namespace必须时候接口的全限定名 2、Statementid必须和接口的方法名称一致 3、接口方法的参数类型要和parameterType要一致 
4、接口方法的返回值类型要和resultType一致 -->
<mapper namespace="com.mybatis.mybatis.dao.UserDao">
<resultMap type="user" id="map_user">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="sex" property="sex" jdbcType="CHAR" />
<result column="birthday" property="birthday" jdbcType="DATE" />
<association property="connection" javaType="connection">
<result column="address" property="address" jdbcType="VARCHAR" />
<result column="telephone" property="telephone" jdbcType="VARCHAR" />
<result column="qq" property="qq" jdbcType="VARCHAR" />
</association>
</resultMap>
<sql id="select_all">
SELECT * FROM `user`
</sql>
<!-- 别名不区分大小写 -->
<select id="getUserById" parameterType="int" resultMap="map_user">
<include refid="select_all" />
WHERE id=#{id};
</select>


<!-- 如果查询结果返回list, -->
<select id="getAllUsers" resultMap="map_user">
<include refid="select_all" />
</select>
<!-- 如果查询结果返回list, resultType设置为list中一个元素的数据类型 ${}字符串拼接指令 -->
<select id="getUserByName" parameterType="string" resultMap="map_user">
<include refid="select_all" />
WHERE username LIKE
concat('%',#{username},'%')
</select>
<!-- 参数时候pojo时,#{}中的名称就是pojo的属性 -->
<insert id="addUser" parameterType="user">
<!-- keyProperty:对于pojo的主键属性 resultType:对应主键的数据类型 order:是在insert语句执行之前或者之后。 
如果使用uuid做主键,应该先生成主键然后插入数据,此时应该使用Before -->
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT
LAST_INSERT_ID()
</selectKey>
INSERT into user (username,birthday,sex,address,telephone,qq)
values
(#{username},
#{birthday}, #{sex},
#{connection.address},#{connection.telephone},#{connection.qq})
</insert>
<delete id="delUser" parameterType="int">
delete from user where
id=#{id}
</delete>
<update id="updateUser" parameterType="user">
update user
<!-- set处理最后一个逗号 -->
<set>
<if test="username!=null">
username=#{username},
</if>
<if test="birthday!=null">
birthday=#{birthday},
</if>
<if test="sex!=null">
sex=#{sex},
</if>


<if test="connection!null and connection.address!=null">
address=#{connection.address},
</if>
<if test="connection!null and connection.telephone!=null">
telephone=#{connection.telephone},
</if>
<if test="connection!null and connection.qq!=null">
qq=#{connection.qq},
</if>
</set>
where id=#{id}
</update>
</mapper>

测试1
public class UserDaoTest {


private UserDao userDao;
private SqlSession session;


@Before
public void before() throws IOException {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = builder.build(reader);
session = factory.openSession();
userDao = session.getMapper(UserDao.class);
}
@After
public void after(){
session.close();
}


@Test
public void testGetUserById() {
User user = userDao.getUserById(10);
System.out.println(user);
}


@Test
public void testGetUserByName() {
List<User> list = userDao.getUserByName("王");
System.out.println(list);
}


@Test
public void testAddUser() {
User user=new User();
user.setUsername("Jack");
user.setBirthday(new Date());
//user.setAddress("北京");
user.setSex("1");
int i = userDao.addUser(user);
session.commit();
System.out.println(i);

}


@Test
public void testDelUser() {
int i = userDao.delUser(1);
session.commit();
System.out.println(i);
}


@Test
public void testUpdateUser() {
User user = userDao.getUserById(34);
user.setUsername("小马哥");
int i = userDao.updateUser(user);
session.commit();
System.out.println(i);
}


}

测试2

public class UserDaoWrapTest {


private UserDao userDao;
private SqlSession session;


@Before
public void before() throws IOException {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = builder.build(reader);
session = factory.openSession();
userDao = session.getMapper(UserDao.class);
}
@After
public void after(){
session.close();
}


@Test
public void testGetUserById() {
User user = userDao.getUserById(10);
System.out.println(user);
}


@Test
public void testGetAllUsers() {
List<User> list = userDao.getAllUsers();
System.out.println(list);
System.out.println(list.size());
}
@Test
public void testGetUserByName() {
List<User> list = userDao.getUserByName("王");
System.out.println(list);
}


@Test
public void testAddUser() {
User user=new User();
user.setUsername("Jack");
user.setBirthday(new Date());
user.setSex("1");
Connection conn=new Connection();
conn.setAddress("河北");
conn.setQq("111222333");
conn.setTelephone("1350203125");
user.setConnection(conn);
int i = userDao.addUser(user);
session.commit();
System.out.println(i);

}


@Test
public void testDelUser() {
int i = userDao.delUser(16);
session.commit();
System.out.println(i);
}


@Test
public void testUpdateUser() {
User user = userDao.getUserById(37);
user.setUsername("小飞侠");
int i = userDao.updateUser(user);
session.commit();
System.out.println(i);
}


}

0 0