需求:
实现以下功能:
1. 根据用户id查询一个用户信息
2. 根据用户名称模糊查询用户信息列表
3. 添加用户
4. 更新用户
5. 删除用户
第一步:创建java工程
使用eclipse创建Java工程,jdk使用1.7.0_72。
第二步:加入jar包
加入mybatis核心包、依赖包、数据驱动包。
第三步:log4j.properties
mybatis默认使用log4j作为输出日志信息。
在classpath下创建log4j.properties如下:
# Global logging configuration
#在开发环境下日志级别设置为DEBUG,生产环境设置成info或者error#
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
第四步:SqlMapConfig.xml
在classpath下创建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" />
<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="123" />
</dataSource>
</environment>
</environments>
</configuration>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
SqlMapConfig.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理。
第五步:pojo类
Pojo类作为mybatis进行sql映射使用,po类通常与数据库表对应(数据库的字段名和属性名对应),User.java如下:
Public class User {
private int id;
private String address;
private String username;
private String sex;
private Date birthday;
get/set……
第六步:程序编写
查询:(需求1,2的实现)
1.写映射文件:
在classpath下的sqlmap目录下创建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="test">
<select id="findUserById" parameterType="int" resultType="com.huihui.pojo.User">
select * from user where id=#{id}
</select>
<select id="findUserByUsername" parameterType="java.lang.String" resultType="com.huihui.pojo.User">
select * from user where username like '%${value}%'
</select>
</mapper>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
2.加载映射文件
mybatis框架需要加载映射文件,将User.xml添加在SqlMapConfig.xml,如下:
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
3.测试程序
package com.huihui.first
import java.io.IOException
import java.io.InputStream
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
import com.huihui.pojo.User
public class MyBatisFirst {
@Test
//根据id查询用户信息,得到一条记录结果
public void findUserByIdTest() throws IOException{
String resource = "SqlMapConfig.xml"
InputStream inputStream = Resources.getResourceAsStream(resource)
//1.创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream)
//2.通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession()
//3.通过SqlSession操作数据库
//第一个参数:映射文件中的statement的id,等于=namespace+"."+statement的id
//第二个参数:指定和映射文件所匹配的parameterType类型的参数
//sqlSession.selectOne的结果是与映射文件中resultType类型的对象所匹配的
User user = sqlSession.selectOne("test.findUserById", 1)
System.out.println(user)
//4.释放资源
sqlSession.close()
}
@Test
//根据用户名模糊查询用户信息
public void findUserByUsername(){
SqlSession ss = null
try {
String resource = "SqlMapConfig.xml"
InputStream is = Resources.getResourceAsStream(resource)
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is)
ss = ssf.openSession()
List<User> list = ss.selectList("test.findUserByUsername", "小明")
System.out.println(list.size())
} catch (Exception e) {
e.printStackTrace()
} finally{
if(ss!=null){
ss.close()
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
细节重点说明:
1.#{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。如果#{}接收的类型是pojo类型时,是使用OGNL读取对象中的属性值,通过属性.属性.属性….的方式获取对象属性值。
${}
表示拼接sql串,通过${}
可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}
可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}
括号中只能是value。如果${}
接收的类型是pojo类型时,是使用OGNL读取对象中的属性值,通过属性.属性.属性….的方式获取对象属性值。
2.parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
3.selectOne和selectList
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)
selectList可以查询一条或多条记录。
添加(需求3的实现)
1.映射文件:
<insert id="insertUser" parameterType="com.huihui.pojo.User" >
insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address})
</insert>
2.测试代码:
@Test
public void insertUser(){
SqlSession ss = null;
try {
String resource = "SqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
ss = ssf.openSession();
User user = new User();
user.setUsername("小灰灰");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("山东东营");
ss.insert("test.insertUser", user);
ss.commit();
} catch (Exception e) {
e.printStackTrace();
} finally{
if(ss!=null){
ss.close();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
进一步说明:
MySQL自增主键返回:
<insert id="insertUser" parameterType="com.huihui.pojo.User" >
insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address})
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
</insert>
上边代码说明:
- LAST_INSERT_ID():得到刚刚insert进去记录的主键值,只适用于自增主键
- keyProperty:将查询到的主键值设置到parameterType指定的对象的那个属性,这里就是将查询到的主键值设置到了User对象的id属性中
- order:表示的是select LAST_INSERT_ID()语句相对于insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address})语句的执行顺序
mysql使用uuid实现主键和返回主键:
<insert id="insertUser" parameterType="com.huihui.pojo.User" >
<selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
select uuid()
</selectKey>
insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address})
</insert>
上面代码的说明:
执行过程:首先通过uuid()得到主键,将主键设置到user对象的id属性中,然后在insert执行时,从user对象中取出id属性值。因此order=”before”
Oracle序列生成主键和返回主键:
首先自定义一个序列且用于生成主键,然后:
<insert id="insertUser" parameterType="com.huihui.pojo.User" >
<selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
select 自定义序列的名字.Nextval from dual;
</selectKey>
insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address})
</insert>
上面代码的说明:
执行过程与上面的mysql使用uuid()的执行过程相同,因此也是order=”before”
删除(需求5的实现):
1.映射文件:
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id = #{id}
</delete>
2.测试代码:
public void deleteUser(){
SqlSession ss = null;
try {
String resource = "SqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
ss = ssf.openSession();
ss.delete("test.deleteUser", 27);
ss.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(ss!=null){
ss.close();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
更新(需求4的实现):
1.映射文件:
<update id="updateUser" parameterType="com.huihui.pojo.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
2.测试代码:
public void updateUser(){
SqlSession ss = null;
try {
String resource = "SqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
ss = ssf.openSession();
User user = new User();
user.setId(30);
user.setUsername("小芳芳");
user.setSex("2");
user.setBirthday(new Date());
user.setAddress("山东临沂");
ss.update("test.updateUser", user);
ss.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(ss!=null){
ss.close();
}
}
}