需求:对用户信息进行CURD操作
一.环境搭建
4.在日志文件log4j.properties中添加如下配置信息
#在控制台输出日志信息
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 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
#在文件中台输出日志信息
log4j.rootLogger = DEBUG,FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
# Set the name of the file
log4j.appender.FILE.File=/Users/wenlei/study/log.log
# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
# Set the append to false, overwrite
log4j.appender.FILE.Append=false
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
5.pom.xml中添加相关依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
二.开发步骤
1.mybatis.xml
mybatis的全局配置文件:配置数据源以及加载sql映射文件。
<?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>
<!-- 环境配置,和spring整合后environments配置将废除-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--1.配置数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false" />
<property name="username" value="root" />
<property name="password" value="admin123" />
</dataSource>
</environment>
</environments>
<!--2.在全局配置文件中加载sql映射文件-->
<mappers>
<mapper resource="mapper/User.xml"/>
</mappers>
</configuration>
2.sql映射文件
完成sql的编写,并使用namespace用于隔离sql语句
<?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进行分类管理,注意:使用mapper代理方法开发,namespace的值是该文件的全限定名-->
<mapper namespace="com">
<!-- 在映射文件中配置有很多的sql语句 -->
<!-- 通过select执行数据库查询
id:标识映射文件中的sql,称为statement的id
parameterType:指定输入参数的类型
resultType:指定sql输出结果的映射的java对象类型,select指定resultType表示将单条记录映射成java对象
#{}表示一个占位符
#{value}其中value表示接收输入参数的名称,如果输入参数是简单类型,那么#{}中的值可以任意。
-->
<!-- 根据用户id查找用户 -->
<select id="findUserById" resultType="po.User" parameterType="int">
select * from user where id=#{id}
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="po.User">
insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 根据id删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<!-- 根据id更新用户 -->
<update id="updateUser" parameterType="po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
</mapper>
3.po编写
public class User {
//属性名要和数据库表的字段对应
private int id;
private String username;// 用户姓名
private String sex;// 性别
private String birthday;// 生日
private String address;// 地址
//get和set方法......
}
4.测试
// 1.获取mybatis配置文件的路径
String resource = "config/mybatis.xml";
// 2.得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 3.根据mybatis配置文件的信息创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 4.获取会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("findUserById",1);
System.out.println(user);
三.总结
1.sql映射和操作方法
<!-- 查询用户 -->
<select id="findUserById" resultType="po.User" parameterType="int">
select * from user where id=#{id}
</select>
sqlSession.selectOne(“sql片段”,param);
<!-- 添加用户 -->
<insert id="insertUser" parameterType="po.User">
insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
sqlSession.insert(“sql片段”,param);
<!-- 根据id删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
sqlSession.delete(“sql片段”,param);
<!-- 根据id更新用户 -->
<update id="updateUser" parameterType="po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
sqlSession.update(“sql片段”,param);
2.#{}和${}
{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
{}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, {}括号中只能是value。
3.parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
4.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可以查询一条或多条记录。