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
<?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">
<!-- 使用jdbc事务管理,事务控制由mybatis -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池,由mybatis管理 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="xxxx"/>
<property name="password" value="xxxxxx"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
工程结构
注意:
1.这里要把config这个包设置为source包
否则无法加载包内的xml文件
2.讲一个我一开始遇到的问题,就是我在运行时报了一个isClosed() method is abstract的错误,在查遍全网都没有解决方案的时候,我试着重新下了一个mysql连接的jar包,问题就解决了,我推荐一个下载jar包的网站
http://www.java2s.com/Code/Jar/c/Downloadc3p0095pre4jar.htm
1.根据用户id(主键)查询用户信息
映射文件
mapper代理开发映射文件命名:xxxMapper.xml
在映射文件中配置sql语句
@Test
public void findUserByIdTest() throws IOException {
//mybatis配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过sqlSession操作数据库
//第一个参数:映射文件中statement的id,等于namespace+"."statement的id
//第二个参数:指定映射文件中所匹配的parameterType类型的参数
//sqlSession.selectOne结果是与映射文件中所匹配的resultType类型的对象
User user = sqlSession.selectOne("test.findUserById",1);
System.out.println(user);
//释放资源
sqlSession.close();
}
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">
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊的重要作用
-->
<mapper namespace="test">
</mapper>
查询时的配置
<select id="findUserById" parameterType="int" resultType="com.TiHom.mybatis.po.User">
select * from user where id=#{value}
</select>
注意:
1.id:标识,映射文件中的sql,称为statement的id
2.paramType:指定输入参数的类型,如int、String等等
3.#{}表示一个占位符号
4.#{id}:其中的id表示接收输入的参数,参数名称是id,如果输入参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
5.resultType:指定sql输出结果所映射的java对象类型,select指定resultType表示将单条记录映射成java对象
2.根据用户姓名进行模糊查询
@Test
public void findUserByNameTest() throws IOException {
//mybatis配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通过sqlSession操作数据库
//list中的user和映射文件中resultType所指定的类型一致
List<User> userList = sqlSession.selectList("test.findUserByName","as");
System.out.println(userList);
sqlSession.close();
}
<select id="findUserByName" parameterType="java.lang.String" resultType="com.TiHom.mybatis.po.User">
SELECT * FROM user WHERE username LIKE '%${value}%'
</select>
注意:
1.#{}表示一个占位符,#{}接收输入的参数
2.${}表示一个拼接符号,会引用sql注入,所以不建议使用
3.添加用户
<insert id="insertUser" parameterType="com.TiHom.mybatis.po.User">
INSERT INTO user(username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address})
</insert>
@Test
public void insertUserTest() throws IOException {
//mybatis配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUsername("王小军");
user.setBirthday(new Date());
user.setSex("m");
user.setAddress("广东");
sqlSession.insert("test.insertUser",user);
//提交事务
sqlSession.commit();
//关闭
sqlSession.close();
}
注意:
- #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 (pojo——>简单的JavaBean对象)
4.删除用户
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM user WHERE id=#{id}
</delete>
@Test
public void deleteUserTest() throws IOException {
//mybatis配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("test.deleteUser",5);
sqlSession.commit();
sqlSession.close();
}
5.更新用户
注意:
1.分析:
需要传入用户的id
需要传入用户的更新信息
parameterType指定user对象,包括id和更新信息,注意:id必存在
#{id}:从输入user对象中获取id属性值
<update id="updateUser" parameterType="com.TiHom.mybatis.po.User">
UPDATE user SET username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} WHERE id=#{id}
</update>
@Test
public void updateUserTest() throws IOException {
//mybatis配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setId(5);
user.setUsername("lihua");
user.setSex("m");
user.setBirthday(new Date());
user.setAddress("北京");
sqlSession.update("test.updateUser",user);
sqlSession.commit();
sqlSession.close();
}
6.总结:
1.selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)
2.selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne
3.#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashMap。如果你接收的是简单类型,#{}中可以写成value或者其他的名称
重点:
自增主键的返回
1.mysql自增主键,执行insert提交之前自动生成一个自增主键。
通过mysql函数获取到刚插入记录的自增主键 :LAST_INSERT_ID()
是在insert之后调用,修改insert配置
<insert id="insertUser" parameterType="com.TiHom.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
<!--
将插入数据的主键返回,返回到user对象中
SELECT LAST_INDEX_ID():得到刚insert进去记录的主键值,只适用于自增主键
keyProperty:将查询到的主键值设置到parameterType指定的对象的哪个属性
order:执行顺序,相对insert语句来说
resultType:指定结果的类型
-->
SELECT LAST_INDEX_ID()
</selectKey>
INSERT INTO user(username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address})
</insert>
非自增主键返回(使用uuid())
2.使用mysql的uuid()函数生成主键,需要修改表中id字段类型为String,长度类型设置为35位。
- 执行思路:先通过uuid()查询到主键,将主键输入到sql语句中。执行uuid()语句顺序相对于insert语句之前执行。